鉴于此代码:
#include <stdio.h>
int main(int argc, char **argv)
{
int x = 1;
printf("Hello x = %d\n", x);
}
我想访问和操作内联汇编中的变量 x 。理想情况下,我想使用内联汇编来改变它的值。GNU 汇编器,并使用 AT&T 语法。
鉴于此代码:
#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 语句的第一条或最后一条指令。不要复制 from%[some]
到硬编码的寄存器%%eax
中,只需%[some]
用作寄存器,让编译器进行寄存器分配。
有关更多文档和指南,请参阅https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html和https://stackoverflow.com/tags/inline-assembly/info。
并非所有编译器都支持 GNU 语法。例如,对于 MSVC,您可以这样做:
__asm mov x, 0
并且x
将0
在此语句之后具有 的值。
请指定您要使用的编译器。
另请注意,这样做将限制您的程序仅使用特定的编译器-汇编器组合进行编译,并且仅针对特定体系结构。
在大多数情况下,使用纯 C 和内在函数(而不是内联汇编)可以获得同样好的或更好的结果。
asm("mov $0, %1":"=r" (x):"r" (x):"cc");
- 这可能会让你走上正轨。尽可能指定寄存器的使用以提高性能和效率。然而,正如 Aniket 指出的那样,高度依赖于架构并且需要 gcc。