IA-32装配师

时间:2011-09-11 17:50:35

标签: assembly intel

有人可以向我解释下面的汇编片段:

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

1 个答案:

答案 0 :(得分:3)

这是sign extending

idivl具有64位参数(edx:eax),因此您需要根据eax的msb确保MSB包含正确的符号位。

因此,如果eax为正数,那么它的msb将为0,例如5 - > 0000 ... 0101。如果它是负数,它的msb将是1,例如-5 - > 1111 ... 1011sarl执行算术右移,因此edx将为0000 ... 00001111 ... 1111