2011-09-11 60 views
0

有人可以向我解釋組件的下面的代碼片斷:IA-32組件divison

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

回答

3

這是sign extending

idivl有一個64位的參數(edx:eax),所以你需要確保MSB包含正確的符號位的基礎上,eax最高位。

因此,如果eax爲正值,則其msb將爲0,例如, 5 - >0000 ... 0101。如果它是負值,那麼msb將是1,例如, -5 - >1111 ... 1011sarl執行算術右移,因此edx將爲0000 ... 00001111 ... 1111

+0

你能舉個例子嗎? –