[Vollbild]  [Home]TUX
;-------------------------------------------------
;Teilt 64-Bit-Werte und gibt das korekt gerundeten Ergebnis zurück.
;-------------------------------------------------
;Divides 64-bit-values and returns the correct rounded result.
;-------------------------------------------------

LICENSE

;%include "./INC/div64.inc" ;[i386]

;To your global or the declaration of the calling process.

;Wertdd0,0;value -unchanged
;Teilerdd0,0;divider -unchanged
;Ergebnisdd0,0;result

;-------------------------------------------------

div64:
section .data

potenzerdd1,0

section .text

pushad
movdword[Ergebnis],0
movdword[Ergebnis+4],0
moveax,[Wert]
movebx,[Wert+4]
movecx,[Teiler]
movedx,[Teiler+4]
cmpecx,0
jnz.aa
cmpedx,0
jnz.aa
jmp.ende
.aa:
cmpebx,0 ; ist wh = 0
jz.a
jmp.d
.a:
cmpedx,0 ; ist th <> 0
jnz.c
movedx,0 ; Normale 32-Bit Division
divecx
shledx,1
jc.b
cmpedx,ecx ; ist Rest*2 < tl
jb.b1
.b:
inceax
.b1:
mov[Ergebnis],eax
jmp.ende
.c:
shldebx,eax,1 ; Nur Runden
jc.c1
shleax,1
cmpebx,edx
jb.c2
.c1:
movbyte[Ergebnis],1
.c2:
jmp.ende
.d:
cmpebx,edx ; ist wh < th
jb.c
je.c1 ; wenn wh = th
.d1:
movdi,[potenzer]
movsi,[potenzer+4]
.d2:
shldedx,ecx,1
jnc.dd2
shredx,1
oredx,0x80000000
jmp.d4
.dd2:
shlecx,1
shldesi,edi,1
shledi,1
cmpebx,edx ; ist wh > th
ja.d2
jz.dd3
.d3:
shrdecx,edx,1
shredx,1
shrdedi,esi,1
shresi,1
.dd3;
cmpedi,0 ; ist P1<>0
jnz.d4
cmpesi,0
jnz.d4
.e:
shldedx,ecx,1 ; P=0
shlecx,1
movedi,1
shldebx,eax,1
shleax,1
cmpebx,edx ; ist wh>=th
jae.e1
jmp.ende
.e1:
jnz.e2 ; ist wh<>th
cmpeax,ecx ; ist wl
jb.e3
.e2:
adddword[Ergebnis],1
adcdword[Ergebnis+4],0
.e3:
jmp.ende
.d4:
subeax,ecx
sbbebx,edx
jnc.d5
addeax,ecx
adcebx,edx
jmp.d3
.d5:
add[Ergebnis],edi
adc[Ergebnis+4],esi
cmpebx,edx ; ist wh > th
ja.d4
cmpebx,0 ; ist wh <> 0
jnz.d3
.d6:
cmpedx,0 ; ist th = 0
jz.f
shrdecx,edx,1
shredx,1
shrdedi,esi,1
shresi,1
cmpedi,0 ; ist P1 0
jnz.d6
cmpesi,0 ; ist P1 0
jnz.d6
jmp.e ; P=0
.f:; P > 0, th = 0, wh = 0 !
cmpedi,1 ; ist P1<>1
jz.ff
shrecx,1
shredi,1
jmp.f
.ff:
divecx ; eax=wl edx=0
shledx,1
jc.f1
cmpedx,ecx
jb.f2
.f1:
inceax ; kein Übertrag möglich !
.f2:
adddword[Ergebnis],eax
adcdword[Ergebnis+4],0
.ende:
popad
ret
Free Web Hosting