2011-08-07 42 views
1

我需要爲函數int read_int()創建一個頭文件,該函數掃描整數並返回它,而不使用scanf創建頭文件來掃描整數而不使用stdio.h(scanf)

我對擴展的asm有一些瞭解。我不知道如何通過函數asm__volatile來掃描元素。

下被我用來印刷的整數代碼(不使用stdio.h中)。工作完美

__asm__ __volatile__ (
    "movl $4, %%eax \n\t" 
    "movl $1, %%ebx \n\t" 
    "int $128 \n\t" 
    : 
    :"c"(buff), "d"(bytes) 
) ; // $4: write, $1: on stdin 
+0

爲什麼你不能使用scanf? –

+0

@keith thatz我們的任務 – bazinga

+0

@jonsca我不能使用getchar,因爲它是stdio.h的一個函數。 – bazinga

回答

1

哪一部分給你造成麻煩?從標準輸入讀取數據使用read系統調用(見here的系統調用在x86 Linux的列表)相似,你使用write打印的方式進行:實施

int my_fgets(char* s, int size, int fd) { 
    int nread; 
    __asm__ __volatile__(
     "int $0x80\n\t" 
    : "=a" (nread) 
    : "a" (3), "b" (fd), "c" (s), "d" (size) 
    ); 
    return nread; 
} 

自己getchar(你應該所以慾望)使用上述功能是直截了當的。

如果它是你遇到與,它可以使用上面的函數來完成的麻煩整數的「掃描」和閱讀:

#define MY_STDIN 0 
int read_int() { 
    char buffer[256]; 
    int nr, number; 

    nr = my_fgets(buffer, sizeof(buffer), MY_STDIN); 
    if (nr < 1) { 
     /* error */ 
    } 
    buffer[nr - 1] = 0; // overwrite newline 

    __asm__ __volatile__(
     "mov $0, %0\n\t" // initialize result to zero 
     "1:\n\t" // inner loop 
     "movzx (%%esi), %%eax\n\t" // load character 
     "inc %%esi\n\t" // increment pointer 
     "and %%eax, %%eax\n\t" 
     "jz 2f\n\t" // if character is NUL, done 
     "sub $'0', %%eax\n\t" // subtract '0' from character 
     "add %%eax, %0\n\t" // add to result 
     "jmp 1b\n\t" // loop 
     "2:\n\t" 
    : "=q" (number) 
    : "S" (buffer) 
    : "eax" // clobber eax 
    ); 
    return number; 
} 

由於這是功課上述功能不全,將只適用於數字0到9,但擴展它應該是微不足道的。