2015-06-07 106 views
1

我尝试在c程序中使用lea rax, [rip]。我的程序如下:内联汇编中的方括号

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

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

+1

您确定目标/源操作数的语法和顺序吗?如果你使用gcc,请看这里:https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html – Pynchia

+0

你可以更具体一些吗(考虑到这里的非专家)?我已经更新了一点OP,并且关于'lea'指令,我在这里:http://stackoverflow.com/questions/12397451/why-cant-i-save-the-value-of-rip。 – Richard

+0

我认为在GCC的内联汇编中,[]或%[]表示你传入的一个命名参数。rip实际上是一个机器寄存器的名称,而不是你的一个参数的名称,所以它没有任何意义那样。你的意思是它是一个地址操作数? – sh1

回答

3

为了在使用GCC进行内联汇编时使用lea rax, [rip],您需要将其转换为AT & T语法并正确引用,以便%字符不会被解释为操作数替换。因此,例如:

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

注意,因为这实际上并没有做什么有用的东西,你必须存储在RAX在C代码值没有访问,那么应该指定一个输出操作数:

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

这将允许您通过变量ip访问该值。

+0

优秀的答案。 @Richard:如果你想使用英特尔的语法,请阅读这里:http://stackoverflow.com/questions/5397677/gcc-intel-syntax-inline-assembly – Pynchia