;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
?
调度寄存器的惯例是什么?
答案 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