有人可以向我解释下面的汇编片段:
mydiv:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx ; get x
movl %edx, %eax
sarl $31, %edx ; divide by y
idivl 12(%ebp) ; return %eax
popl %ebp
ret
这相当于以下C函数:
int mydiv( int x, int y )
{
return x / y;
}
我无法理解的部分是sarl
指令:为什么需要转移edx
?
答案 0 :(得分:3)
idivl
具有64位参数(edx:eax
),因此您需要根据eax
的msb确保MSB包含正确的符号位。
因此,如果eax
为正数,那么它的msb将为0
,例如5 - > 0000 ... 0101
。如果它是负数,它的msb将是1
,例如-5 - > 1111 ... 1011
。 sarl
执行算术右移,因此edx
将为0000 ... 0000
或1111 ... 1111
。