为什么number ++使用EAX而number--使用ECX?

时间:2011-05-01 04:24:31

标签: c assembly cpu-registers

;disas for number++
mov eax, [number]
add eax,1
mov [number],eax
;disas for number--
mov ecx, [number]
sub ecx,1
mov [number],ecx

为什么number++EAX使用number--时使用ECX

调度寄存器的惯例是什么?

4 个答案:

答案 0 :(得分:9)

寄存器分配取决于编译器。通常,它主要取决于周围的代码,而不是你执行的操作。

答案 1 :(得分:4)

这些操作没有惯例。大多数寄存器都是通用的,可用于常见的算术运算。

编译器只是在代码中使用恰好空闲的寄存器。

答案 2 :(得分:3)

你错过了那些提取物周围的程序集,这可能是最重要的部分,否则你无法判断其他寄存器是否在使用(或者如果调用约定起作用)。

使用周围的部分更容易判断分配是否部分任意(图形着色)或更均匀的线性扫描等。编译器标志也会影响这一点,因为上面的例子都不能不使用寄存器。

答案 3 :(得分:0)

查看所有其他答案,说它依赖于编译器和代码,没有规则。

unsigned int x;

void one ( void )
{
  x++;
}
void two ( void )
{
 x--;
}

优化

one:
    addl    $1, x(%rip)
    ret
two:
    subl    $1, x(%rip)
    ret

相同的编译器,相同的代码,当天,没有优化,eax用于两者

one:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    x(%rip), %eax
    addl    $1, %eax
    movl    %eax, x(%rip)
    leave
    ret
two:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    x(%rip), %eax
    subl    $1, %eax
    movl    %eax, x(%rip)
    leave
    ret