【发布时间】:2017-09-24 12:28:08
【问题描述】:
这是我第一次编写汇编代码。 一开始,我写了
#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 吗?
【问题讨论】:
-
在这种语法中,数字必须不带$,这就是它的定义方式。通常 $ 表示一个常量,但由于在寻址模式中除了特定常量之外不能有任何其他内容,因此它不使用前缀来表示这是一个常量。
-
仅供参考,在不告诉编译器的情况下破坏
%ebx(带有破坏约束)将导致不可预测的结果。 (好吧,如果您使用gcc -O2 -S读取编译器的最终 asm 输出,则可以预测)。见stackoverflow.com/tags/inline-assembly/info