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
Post a Comment