assembly - NASM: Dividing large number with small one -


nasm manual says on div:

  • for div r/m32, edx:eax divided given operand; quotient stored in eax , remainder in edx.

what if edx:eax large number around 259 , divider 3? quotient cannot fit eax. let's not care remainder. have best practice doing division.

thinking dividing upper , lower 32 bits in separate steps. think figure out ugly result, interested in one. quick check case when eax hold quotient avoiding complicated magic.

solution: drhirsch's answer converted nasm syntax:

; divides edx:eax ebx, if result bigger 2^32. ; result in edx:eax, ecx,esi used 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 esi mov eax, ecx           ;now edx:eax contains r:lo32, r remainder div ebx mov edx, esi           ;restore hi32 

this code untested. should calculate (d*2^32 + a)/b:

;this divides edx:eax ebx, if result bigger 2^32. ;result in edx:eax, ecx,esi used 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, r remainder   div %ebx   mov %esi, %edx           ;restore hi32                  

Comments

Popular posts from this blog

c# - how to write client side events functions for the combobox items -

exception - Python, pyPdf OCR error: pyPdf.utils.PdfReadError: EOF marker not found -