|
| 楼主:cnzdgs |
 |
|
| 32位除法到底该怎么做? |
如果是80386以上CPU,可以用32位操作: mov eax, 99999 mov ecx, 77777 cdq div ecx 如果汇编器不支持386指令集,可以这样写: db 66h mov ax, 被除数低16位 dw 被除数高16位 db 66h mov cx, 除数低16位 dw 除数高16位 db 66h cwd db 66h div cx |
|
|
2008-08-20 00:02:30 |
|
 |
|
| 2楼:cnzdgs
|
 |
|
|
2008-08-20 00:03:10 |
|
 |
| 3楼:dacaiying
|
 |
|
|
|
|
噢。。 谢谢 能不能给解释下啊 cdq 把eax 的字扩展到 edx 中, 是把 ax 扩展成 32位的吗? 为什么非要用 cdq , div 才能执行成功不产生溢出错误呢? 还有cdq 扩展到 edx 中, 这有什么用处? div 后余数还放在 edx 中,那步 cdq 到底起什么作用呢? 难道 ax 就是余数?。。。。。。。。 |
|
2008-08-20 00:24:27 |
|
 |
| 4楼:dacaiying
|
 |
|
|
2008-08-20 00:26:42 |
|
 |
| 5楼:cnzdgs
|
 |
|
|
|
|
字寄存器前面加字母e表示扩展到32位寄存器,例如eax是32位的,其中低16位是ax。 cdq是把eax扩展到edx中,形成64位的寄存器对,因为被除数需要是除数位数的两倍。 cdq在这里可以用xor edx,edx来代替,但不能用shr代替。 |
|
2008-08-20 00:40:54 |
|
 |
| 6楼:dacaiying
|
 |
|
|
|
|
啊? cdq 可以把 eax 和 edx 扩展成一个64 位的寄存器,那这样来说 高32位在edx,低32位在 eax中了 然后div 就把edx,eax当成了一个64位寄存器操作? cdp 。。。 xor 又让我晕了, ls高手的意思是不是说, div 固定把 edx 和 eax 视为 64位寄存器 当 edx 为 0 时视为联合调用寄存器?否则当 !edx 时, div 认为只单独用eax ? |
|
2008-08-20 00:52:34 |
|
 |
|