在x86汇编中,为什么读取标准输入会阻塞程序?

时间:2013-08-27 23:31:39

标签: c assembly

我是x86程序集的新手(英特尔语法),并且使用内联GCC一直在玩一些简单的指令。我已成功设法操作数字和控制流程,现在正在使用中断处理标准输入和输出。我正在使用Mac OS X并使用-m32 GCC标志强制编译为32位。

我有以下内容将字符串打印到标准输出:

char* str = "Hello, World!\n";
int strLen = strlen(str);
asm
{
    mov eax, 4
    push strLen
    push str
    push 1
    push eax
    int 0x80
    add esp, 16
}

编译并运行时,会将Hello, World!打印到控制台!但是,当我尝试从标准输入读取时,事情也不起作用:

char* str = (char*)malloc(sizeof(char) * 16);
printf("Please enter your name: ");
asm
{
    mov eax, 3
    push 16
    push str
    push 0
    push eax
    int 0x80
    add esp, 16
}
printf("Hello, %s!\n", str);

运行时,我会收到提示,但没有“请输入您的姓名:”字符串。当我输入一些输入并按Enter键时,将打印输入字符串以及预期的输出,例如

Please enter your name: Hello, Joe Bloggs
!

在用户输入任何输入之前,如何让条目字符串出现在预期的位置?

1 个答案:

答案 0 :(得分:4)

printf使用stdio写入,它执行缓冲(即,写入的内容不会立即输出)。在发送系统调用进行读取之前,需要首先调用fflush(stdout)(因为系统调用绕过stdio并且对缓冲区一无所知)。

此外,正如Kerrek SB所指出的,您的asm没有符号列表且不是volatile。这意味着gcc可以自由地将汇编代码重新定位到函数的其他位置(因为它可以自由地假设汇编代码没有副作用),这可能会产生与您期望的不同的影响。我建议您使用asm volatile