0
这是第一次我写汇编代码。 在第一个开始,我写了
#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"
它是o ķ。但是,2美元不等于2?
在此语法的数量必须是没有$,这就是它只是如何定义的。通常情况下$意味着一个常量,但由于在寻址模式中除了特定的常量外没有别的东西,所以它不会使用前缀来表示这是一个常量。 –
仅供参考,不重挫告诉编译器(带撞约束)'%ebx'将导致不可预知的结果。 (好吧,如果你用'gcc -O2 -S'从编译器中读取最终的asm输出结果是可以预测的)。请参阅https://stackoverflow.com/tags/inline-assembly/info –