NASM手册在DIV
上说:
如果EDX:EAX
是2 59 附近的大数且分隔符是3
怎么办?该商明显不适合EAX
。假设我不关心其余部分。我希望有一个最佳实践来进行分工。
考虑在单独的步骤中划分上下32位。我想我可以找出一些丑陋的结果,但我会对一个好的结果感兴趣。通过快速检查EAX
可能保持商数的情况,从而避免复杂的魔法。
解决方案:drhirsch的答案转换为NASM语法:
; this divides edx:eax by ebx, even if the result is bigger than 2^32.
; result is in edx:eax, ecx,esi are used as spare registers
mov ecx, eax ;save lower 32 bit
mov eax, edx
xor edx, edx ;now edx:eax contains 0:hi32
div ebx
mov esi, eax ;hi 32 bit of result, save to esi
mov eax, ecx ;now edx:eax contains r:lo32, where r is the remainder
div ebx
mov edx, esi ;restore hi32
答案 0 :(得分:2)
此代码未经测试。它应该计算(d * 2 ^ 32 + a)/ b:
;this divides edx:eax by ebx, even if the result is bigger than 2^32.
;result is in edx:eax, ecx,esi are used as spare registers
;AT&T syntax.
mov %eax, %ecx ;save lower 32 bit
mov %edx, %eax
xor %edx, %edx ;now edx:eax contains 0:hi32
div %ebx
mov %eax, %esi ;hi 32 bit of result
mov %ecx, %eax ;now edx:eax contains r:lo32, where r is the remainder
div %ebx
mov %esi, %edx ;restore hi32