我是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
!
在用户输入任何输入之前,如何让条目字符串出现在预期的位置?
答案 0 :(得分:4)
printf
使用stdio写入,它执行缓冲(即,写入的内容不会立即输出)。在发送系统调用进行读取之前,需要首先调用fflush(stdout)
(因为系统调用绕过stdio并且对缓冲区一无所知)。
此外,正如Kerrek SB所指出的,您的asm
没有符号列表且不是volatile
。这意味着gcc可以自由地将汇编代码重新定位到函数的其他位置(因为它可以自由地假设汇编代码没有副作用),这可能会产生与您期望的不同的影响。我建议您使用asm volatile
。