鉴于此代码:

#include <stdio.h>

int main(int argc, char **argv)
{
    int x = 1;
    printf("Hello x = %d\n", x);
}

我想在内联汇编中访问和操作变量 x 。理想情况下,我想使用内联汇编更改其值。 GNU 汇编器,并使用 AT&T 语法。

最佳答案

在 GNU C 内联汇编中,使用 x86 AT&T 语法:
(但是 https://gcc.gnu.org/wiki/DontUseInlineAsm 如果可以避免的话)。

// this example doesn't really need volatile: the result is the same every time
asm volatile("movl $0, %[some]"
    : [some] "=r" (x)
);

在此之后,x 包含 0。

请注意,您通常应该避免将 mov 作为 asm 语句的第一条或最后一条指令。不要从 %[some] 复制到像 %%eax 这样的硬编码寄存器,只需使用 %[some] 作为寄存器,让编译器进行寄存器分配。

有关更多文档和指南,请参阅 https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.htmlhttps://stackoverflow.com/tags/inline-assembly/info

并非所有编译器都支持 GNU 语法。
例如,对于 MSVC,您可以这样做:
__asm mov x, 0x 将在此语句后具有 0 的值。

请指定您要使用的编译器。

另请注意,这样做会限制您的程序仅使用特定的编译器-汇编器组合进行编译,并且仅针对特定体系结构。

在大多数情况下,使用纯 C 和内在函数而不是内联汇编会获得同样好或更好的结果。

关于c - 如何访问 C 变量以进行内联汇编操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14617953/

10-11 22:13
查看更多