Какая часть причиняет вам неприятности?Чтение данных из стандартного ввода выполняется с помощью системного вызова read
(список системных вызовов для 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, хотя ее расширение должно быть тривиальным.