【问题标题】:C/C++ Inline assembly [with C loops]C/C++ 内联汇编 [带有 C 循环]
【发布时间】:2011-06-09 22:11:56
【问题描述】:
#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?)

【问题讨论】:

  • call putchar 有什么问题?
  • TonyK,你不能调用 putchar,因为 putchar 是一个变量。我认为这主要是出于调试目的,可以在 C 编译器设置中打开或关闭。
  • @Aleš Keprt:这对我来说是新的!

标签: c++ c assembly


【解决方案1】:

它不起作用,因为 lea 指令旨在获取变量的地址。 (为这个注释给 zebarbox +1。)我们需要 chr 的值,而不是它的地址,所以我们使用它来代替:

movsx eax,chr

这个伪指令会编译成这样的:

movsx eax,[ebp-4]

您也可以编写 putchar(chr),在其中放置一个断点,运行应用程序并查看反汇编窗口以查看它是如何编译的。

请注意,我使用 movsx 因为 chr 是 char 并且我需要一个 dword。如果 chr 是 int,我会简单地使用 mov 指令。

另外,你不能使用pop ebx,因为这里不能改变ebx。请改用 pop eaxadd esp,4

【讨论】:

  • lea 用于将变量的地址加载到 eax 中,因此如果函数需要指针,则可以使用它 - 它与静态或全局变量无关
  • 如果我愿意,我可以在局部变量上执行 lea,不确定您所说的常量地址是什么意思?即 char text[] = "Hello World"; _asm { lea eax, text push eax call DWORD ptr printf pop eax }
  • zebrabox:好点!您的文本示例有效,因为您的 lea 检索文本数组的地址,而不是其值。原始示例不适用于 lea,因为我们需要 chr 的值,而不是它的地址。感谢您的注意,我将把它添加到我的答案中。
【解决方案2】:

这是您的正确代码:

int c = chr;
__asm
{
   mov  eax, c
   push eax
   mov  eax, putchar
   call eax
   pop  ebx
}

由于大小冲突,您无法将 chr 移动到 eax 上。所以我用了int类型的'c'!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 2021-09-05
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2018-04-17
    相关资源
    最近更新 更多