gcc内联汇编程序:" leal 2(%% ebx,%% eax,$ 2),%1"不会聚集,但没有$

时间:2017-09-24 12:28:08

标签: gcc assembly att

这是我第一次编写汇编代码。 在第一次开始时,我写了

#include<stdio.h>
int main(){
    int x,y;
    asm("movl $2,%eax");
    asm volatile(
                    "movl $1,%0\n\t"
                    "movl %0,%%ebx\n\t"
                    "leal 2(%%ebx,%%eax,$2),%1"
                    :"=m"(x),"=r"(y)
                    );
    printf("x is %d, y is %d\n",x,y);
    return 0;
}

gcc 5.4.0编译器提供了错误消息:

test.c: Assembler messages:
test.c:7: Error: bad or irreducible absolute expression
test.c:7: Error: expecting scale factor of 1, 2, 4, or 8: got `$2'

然后我改变了

"leal 2(%%ebx,%%eax,$2),%1"

"leal 2(%%ebx,%%eax,2),%1"

没关系。但是,2美元不等于2?

1 个答案:

答案 0 :(得分:0)

在AT&amp; T语法中,美元符号$表示立即操作数。例如,它区分

add 16,%eax

(在地址16添加eax的值)来自

add $16,%eax

(将16添加到eax)。请注意,这与整数常量无关。你也可以写

add foo,%eax

add $foo,%eax

其中foo是某个符号。 disp(base,index,scale)符号表示使用 SIB寻址的内存操作数。此寻址模式中的三个部分中的每一个都有固定的用途,因此用scale装饰任何内容都没有意义。毕竟,我们已经选择了寻址模式,为什么括号内还有另一个操作数类型指示符呢?请注意,寄存器名称前面的%仍然是必需的,因为它区分了寄存器名称和宏名称或符号名称。