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

标签 gcc assembly x86 cpu-registers att

Possible Duplicate:
Not sure why we add the registers %rdx and %rax when the assembly code has been using %eax and %edx

全部。 所以,这是我的最小程序:

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 ,我会得到“错误:与 l 后缀一起使用的寄存器'%rax'不正确”)

最佳答案

看看here如果您不确定寄存器及其大小。这样想

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

eaxrax 共享同一个寄存器,eax 是该寄存器的低位部分。

这就是为什么 addl 无法使用以 r 为前缀的寄存器的原因,它们比 addl 预期的要长。请尝试使用 addq

关于GCC 生成的 asm::我在哪里分配给该寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13925974/

相关文章:

linux - 会发生什么?输出或进程 linux,寄存器

c++ - 链接器错误 : undefined reference to `vtable of QGLViewer’

gcc - 建立arm-elf-gcc时发生错误

assembly - 将 XMM 寄存器设置为重复字节模式(广播常量字节)

c - 索引数组时循环变量类型会影响效率吗?

c - 让 ASM 中的库在 C 中访问它?

arrays - 通用 MASM 代码 : storing 8 or 16 bits of a register depending on TYPE of a symbol

c - 冗余 __packed__ 属性

python - `gcc`哪个版本支持 `--no-undefined`开关?

assembly - 正确使用ARM PLD指令(ARM11)