Possible Duplicate:
Not sure why we add the registers %rdx and %rax when the assembly code has been using %eax and %edxGCC生成的asm ::我分配了哪个寄存器?
全部。 所以,这是我最小的方案:
int main(int argc, char * argv[]){
volatile int a;
volatile int b;
volatile int c;
a = 9;
b = 15;
c = a+b;
return c;
}
我现在对这个运行gcc -S,和这里的生成的程序集的肉:
.LCFI1:
movl %edi, -20(%rbp) //unknown setup
movq %rsi, -32(%rbp) //unknown setup
movl $9, -4(%rbp) //a=9, so -4(%rbp) is the register for a.
movl $15, -8(%rbp) //b=15, so -8(%rbp) is b's register.
movl -4(%rbp), %edx //move a into the register for addition.
movl -8(%rbp), %eax //move b into the register for additon.
leal (%rdx,%rax), %eax //Add a and b, store in %eax. (PROBLEM LINE)
movl %eax, -12(%rbp) //Store %eax in c's register.
movl -12(%rbp), %eax //get ready to return c.
leave //we're done here.
ret
好了,你看行我表示为问题线。这是我的问题:究竟是%rdx还是%rax?我已经装入的唯一寄存器是%edx和%eax。
由于程序起作用,因此%rdx和%rax必须是某种到%edx和%eax的别名。有人可以解释x86寄存器术语的细微差别吗?我完全在这个黑暗中。
(值得注意的是,如果我改变这个问题行addl %edx, %eax
,结果是相同的,但如果我将其更改为addl %rdx, %rax
,我得到“错误:不正确的寄存器%RAX“的L后缀使用”)
它是x86_64,而不是x86。一个64位指令需要后缀“q”而不是“l”,所以你会得到错误 –