Руководство NASM говорит о DIV
:
- Для DIV r / m32, EDX: EAX делится на данный операнд; частное хранится в EAX, а остаток в EDX.
Что если 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