gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:10 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com