Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 内联装配中的方括号_C_Assembly_Inline Assembly - Fatal编程技术网

C 内联装配中的方括号

C 内联装配中的方括号,c,assembly,inline-assembly,C,Assembly,Inline Assembly,我尝试在c程序中使用lea-rax[rip]。我的计划如下: ... asm volatile ("lea %%rax, %[rip]" :); ... 但是,程序不编译,抛出一个错误:未定义的名称操作数。我的平台是x86-64体系结构(作为虚拟机)上的Ubuntu 1404。为了在GCC的内联汇编中使用lea-rax,[rip],您需要将其转换为AT&T语法并正确引用,以便%字符不会被解释为操作数替换。例如: asm volatile ("lea (%%rip),%

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

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

但是,程序不编译,抛出一个错误:
未定义的名称操作数
。我的平台是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

访问值。您确定目标/源操作数的语法和顺序吗?如果您使用gcc,请参见此处:您是否可以更具体一点(考虑此处的非专家)?我已经更新了OP一点,关于
lea
指令,我在这里如下:。我认为在GCC的内联程序集中,[]或%[]表示您传入的命名参数。rip实际上是一个机器寄存器的名称,而不是一个参数的名称,因此以这种方式引用它是没有意义的。你是说它是地址操作数吗?回答得很好@理查德:如果你想使用英特尔的语法,请阅读这里: