2011-09-11 2 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にはのmsbに基づいて正しい符号ビットが含まれている必要があります。

したがって、eaxが正の場合、msbは0となります。 5 - >0000 ... 0101。負の場合は、msbは1となります。 -5 - >1111 ... 1011sarlは算術右シフトを実行するので、edx0000 ... 0000または1111 ... 1111のいずれかになります。

+0

私に例を教えてください。 –

関連する問題