c++ - C/C++ 内联汇编 [带 C 循环]

标签 c++ c assembly

#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 eaxadd esp,4 代替。

关于c++ - C/C++ 内联汇编 [带 C 循环],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4704531/

相关文章:

c++ - 如何快速将 6 字节无符号整数复制到内存区域?

c++ - 函数参数的默认参数是否被视为该参数的初始值设定项?

c - 如何使用两个scanf避免用户输入越界?

linux nasm 代码什么都不显示

c - 反汇编函数名称后的数字是什么意思?例如<do_magic + 197>

c++ - 错误 : Class has not been declared despite header inclusion, 并且代码在其他地方编译正常

c++ - 如何初始化unsigned char指针

c++ - 如何从 C 代码调用具有可变数量参数的 C++ 函数

c - 使用alarm()和pause()频繁发送信号

c++ - 为什么这个 C++ 程序如此之快?