内联汇编中的方括号

square brackets in inline assembly

我尝试在 c 程序中使用 lea rax, [rip]。我的程序如下:

...
asm volatile ("lea %%rax, %[rip]"
             :);
...

但是,程序没有编译,抛出错误:undefined name operand。我的平台是 x86-64 架构上的 Ubuntu 1404(作为虚拟机)。

为了在 GCC 的内联汇编中使用 lea rax, [rip],您需要将其转换为 AT&T 语法并正确引用它,这样 % 字符就不会被解释为操作数替换。例如:

asm volatile ("lea (%%rip),%%rax"
          ::: "rax");

请注意,由于这实际上没有做任何有用的事情,您无法在 C 代码中访问存储在 RAX 中的值,您应该指定一个输出操作数:

long long ip;
asm ("lea (%%rip),%0"
     : "=r" (ip));

这将使您可以通过变量 ip 访问值。