我想使用 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/