#include <stdio.h>
#define OPT //define for assembly
int main()
{
char chr;
for(chr = 'A' ; chr <= 'Z' ; chr++)
{
#ifdef OPT
__asm
{
lea eax,chr
push eax
mov eax, putchar
call eax
pop ebx
}
#endif
#ifndef OPT
putchar(chr);
#endif
}
return 0;
}
在使用汇编代码时,所发生的只是打印一个随机的垃圾字符。请注意,这是 intel 语法。
还有: 我正在学习内联汇编,你将如何获取被调用函数的返回值(通过 mov eax,func 然后调用 eax 或 equiv?)
最佳答案
它不起作用,因为 lea 指令旨在获取变量的地址。 (为此注释向 zebarbox +1。)我们需要 chr 的值,而不是它的地址,所以我们改用它:
movsx eax,chr
这个伪指令会编译成这样:
movsx eax,[ebp-4]
您还可以编写 putchar(chr),在其中放置一个断点,运行该应用程序并查看反汇编窗口以了解它是如何编译的。
请注意,我使用 movsx 因为 chr 是 char,我在这里需要一个双字。如果 chr 是 int,我会简单地使用 mov 指令。
此外,您不能使用pop ebx,因为这里不能更改ebx。使用 pop eax 或 add esp,4 代替。
关于c++ - C/C++ 内联汇编 [带 C 循环],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4704531/