gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:33:50 27 4
gpt4 key购买 nike

我是 x86 汇编(Intel 语法)的新手,一直在使用内联 GCC 研究一些简单的指令。我已经成功地完成了对数字和控制流的操作,现在正在使用中断处理标准输入和输出。我正在使用 Mac OS X 并使用 -m32 GCcflags强制编译 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
!

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

最佳答案

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

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

关于c - 在 x86 汇编中,为什么读取标准输入会阻塞程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18477103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com