c - 如何在汇编代码中使用c变量

标签 c variables assembly x86

我想使用 Microsoft 编译器在内联汇编中访问 C 变量。我的代码如下所示:

#include <stdio.h>

int nCVar = 1234;

int main()
{
  // scanf("%u", &nCVar);
  _asm
  { 
     mov ebx, nCVar // incorrect
     ror ebx, 10
     mov nCVar, ebx // incorrect
  }
  printf("nCVar is: %u\n", nCVar);
  return 0;
}

我的问题是代码中标记为“不正确”的指令。我想要一条指令将变量“nCVar”的值加载到寄存器 EBX 中,以便 EBX 在“ror”指令之前具有值 1234。

显然我使用的语法不正确。

如何将 C 变量的值加载到 CPU 寄存器中?

最佳答案

一些编译器能够按照您尝试的方式直接在内联汇编器中访问变量:

mov ebx, nCVar

然而,许多编译器只是将汇编代码传递给汇编程序,因此与 C 程序没有交互。

对于此类编译器,您无法访问本地或“静态”变量,因为有关这些变量存在的信息通常会在汇编代码中丢失。

一些带有内置汇编程序的编译器不允许访问内联汇编中的符号。在这种情况下,根本不可能从内联汇编访问 C 变量。

但是,如果可以访问符号并且您要访问的变量是全局变量(不是“静态”),那么应该可以像您尝试的那样访问变量。但是必须使用变量的符号名称。

在 Windows 下,C 变量的符号名称是下划线后跟变量名:

mov ebx, _nCVar

但是有些汇编器会将其解释为“将变量的地址写入 ebx 寄存器”;这样的汇编程序需要方括号来指示必须读取变量本身(而不是地址):

mov ebx, [_nCVar]

另请注意,使用汇编程序时,您需要关心数据类型;汇编代码不会检查数据类型的正确性。例如,将 ebx 寄存器与 16 位变量一起使用会导致意外结果甚至程序崩溃。

关于c - 如何在汇编代码中使用c变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25336555/

相关文章:

php - 根据变量改变mysql查询

linux - 为什么 _exit(0)(通过系统调用退出)阻止我接收任何标准输出内容?

assembly - 英特尔 64 和 IA-32 |原子操作,包括获取/释放语义

c++ - C中动态分配的字符串

c - 何时决定使用 typedef 的数据类型或 C 的内置标准数据类型

c - 使用不同的访问标志对同一文件使用两次 fopen

mysql - Powershell MySQL 字符串返回 |到 html?

c - 如果我不在 C 程序中调用 fclose() 会发生什么?

javascript - jQuery 类型函数作为变量

assembly - P6 架构 - 除了寄存器重命名之外,有限的用户寄存器是否会导致更多的操作花费在溢出/加载上?