NASM: деление большого числа на маленькое - PullRequest
2 голосов
/ 11 мая 2011

Руководство 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

1 Ответ

2 голосов
/ 11 мая 2011

Этот код не проверен.Следует рассчитать (д * 2 ^ 32 + а) / б:

;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                 
...