How can i divide two 64-bits integers?

(if anyone have a bunch of macros or procs to simplify the task of working with 64-bits numbers, please send me a copy)

/delight
Posted on 2001-09-17 10:51:18 by Delight
Ok heres the deal, havent checked this, but it should work:
(surprised it took 45 odd readings and still no responce)
``````

.data?
ah32  dd  ?   ; upper 63-32 bits of numerator
al32  dd ?  ; lower 31-0 bits

bh32  dd ?  ; upper 63-32 of denominator
bl32  dd ?  ; lower 31-0

Quotient dd ?

.code

xor ecx, ecx
mov eax, ah32
@@:

.if( eax == bh32 )
mov eax, al32
.if( eax < bl32 )
jmp @F
.endif
.elseif (eax < bh32 )
jmp @f
.endif

mov eax, al32
mov edx, bl32
sub eax, edx
mov al32, eax

mov eax, ah32
mov edx, bh32
sbb eax, edx
mov ah32, eax

inc ecx
jmp @B
@@:
mov Quotient, ecx
``````

The remainder is now in ..

Hope this helps, there is no faster way than itteration when you have 64 bits, PLUS, the extra confusion of a 64 bit denominator.

Hope this helps..
:alright:
NaN
Posted on 2001-09-18 01:39:16 by NaN
Hello !

You can do this divide with the fpu:

``````

fild    qword ptr [Val1]
fild    qword ptr [Val2]
fdivrp  st(1), st
fistp   qword ptr [Val3]

``````

In Val3 (as 64 Bit) will be stored the result of the division of Val1 by Val2 (both as 64 bit-integers loaded)

Greetings, CALEB
Posted on 2001-09-18 02:12:37 by Caleb
Doh! Doh! DOh! :)

I should really practice more floating point, i forgot all about the QWORD... ((( DOH! )))

NaN
Posted on 2001-09-18 02:20:22 by NaN
Thanks guys!

I must admit that Nan's version looks a little complicated compared to Calebs, but don't worry, I'll try your code too Nan... :rolleyes:

:alright:

/Delight
Posted on 2001-09-18 02:49:21 by Delight