首页 文章

GCC生成的asm ::我在哪里分配给该寄存器? [重复]

提问于
浏览
2

可能重复:当汇编代码使用%eax和%edx时,不确定为什么我们添加寄存器%rdx和%rax

所有 . 所以,这是我的最小程序:

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 ,则会得到"Error: Incorrect register '%rax' used with l suffix")

1 回答

  • 1

    如果您不确定寄存器及其大小,请查看here . 这样想吧

    union{ struct{ uint32_t eax; uint32_t padd; }; uint64_t rax; };

    eaxrax 共享相同的寄存器, eax 是该寄存器的低位部分 .

    这就是 addl 无法使用前缀为r的寄存器的原因,它们比 addl 期望的长 . 请尝试 addq .

相关问题