这是我第一次编写汇编代码。 在第一次开始时,我写了
#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?
答案 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
装饰任何内容都没有意义。毕竟,我们已经选择了寻址模式,为什么括号内还有另一个操作数类型指示符呢?请注意,寄存器名称前面的%
仍然是必需的,因为它区分了寄存器名称和宏名称或符号名称。