【问题标题】:square brackets in inline assembly内联汇编中的方括号
【发布时间】:2015-06-07 20:10:11
【问题描述】:

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

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

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

【问题讨论】:

  • 您确定目标/源操作数的语法和顺序吗?如果您使用 gcc,请参见此处:gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
  • 你能说得更具体些吗(考虑到这里的非专家)?我已经稍微更新了 OP,关于 lea 指令,我在这里关注:stackoverflow.com/questions/12397451/…
  • 我认为在 GCC 的内联汇编中, [] 或 %[] 表示您传入的命名参数。 rip 实际上是机器寄存器的名称,而不是您的参数之一的名称,所以它以这种方式提及它是没有意义的。你的意思是它是一个地址操作数吗?

标签: c assembly inline-assembly


【解决方案1】:

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

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

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

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

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

【讨论】:

猜你喜欢
  • 2021-02-22
  • 2010-12-08
  • 2012-10-20
  • 1970-01-01
  • 2018-07-14
  • 2013-11-26
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多