Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 29. July 2007, 12:48
-
Hi,
ich bin im RM und möchte gerne edx:eax mit ebx dividieren. Aber ein einfaches ebx funktioniert nicht richtig, wenn das Ergebnis noch 64 Bit groß ist. Also das Ergebnis soll nach der Division von edx:eax 64 Bit groß bleiben. Mir fällt gerade keine Möglichkeit ein, dies herzuzaubern. Und Google meint auch mir nicht helfen zu wollen.
bitmaster
-
Du kriegst bei jedem div bei x86(-64) ein ergebnis, welches kleiner ist als der Divident. Die Instruktion die du suchst ist:
F7 /6 DIV r/m32 Unsigned divide EDX:EAX by r/m32, with result stored in EAX ← Quotient, EDX ← Remainder.
Wenn du das Ergebnis auf 64bit haben willst musst du edx auf 0 setzen :wink:
-
Nein, eben nicht. Ich möchte einen 64 Bit Wert dividieren, er soll aber 64 Bit groß bleiben. Beispielsweise steht in edx:eax der Wert: F000000000h Jetzt steht in ebx 2 und das Ergebnis soll dann 7800000000h lauten. Tut es aber bei einem einfachen div ebx nicht, da das Ergebnis für eax zu groß ist. Ich suche eine Methode mit der dies aber funktioniert, ich also 7800000000h als Ergebnis in edx:eax stehen habe.
bitmaster
-
Tjo, da musst du dir wohl selber was zusammenbasteln. Wenn es sich um ein Dividieren um 2^x (2, 4, 8, 16...) dann könntest du das evtl leichter über shiften hinkriegen. für was braucht man das überhaupt...?
-
doubleword / divisor = highword / divisor * 2^32 + ((highword % divisor) * 2 ^ 32 + lowword) / divisor
In Assembler sieht das so aus:
mov edx, 0
mov eax, [highword]
mov ecx, [divisor]
div ecx
mov ebx, eax
mov eax, [lowword]
div ecx
mov edx, ebx
; ergebnis in edx:eax
-
@PorkChicken: Vielen dank!!!! :-)
bitmaster
-
Der vollständigkeithalber hier das gleiche als Multiplikation:
mov eax,[low]
mov ecx,[factor]
mul ecx
mov ebx,eax ;low
mov [temp],edx
mov eax,[high]
mul ecx
add eax,[temp] ;high
mov edx,eax
mov eax,ebx
bitmaster
-
hm fehlt da nicht der übertrag beim add?
-
hm fehlt da nicht der übertrag beim add?
Wie jetzt?
bitmaster
-
Übertrag ist z.B. wenn du 5 + 7 rechnest. Da kommt ja nicht 2 raus sondern 12. Und die 1 ist hier der Übertrag. Übertrag heisst auf englisch "carry" und wird bei der Addition im Carry Flag gespeichert.
-
Ich weiß was ein Übertrag ist, nur wieso sollte der hier stattfinden? Bzw. wenn er stattfindet, wäre das Ergebnis ja sowieso nicht mehr 64 Bit groß. Und ich gehe ja davon aus, dass das Ergebnis 64 Bit groß bleibt. Also edx:eax mul ebx = edx:eax.
bitmaster
-
Beispiel: 0x7fffffffffffffff * 2 = 0xfffffffffffffffe
mov eax, 0xffffffff
mov ecx, 2
mul ecx
mov ebx ,eax ; ebx = 0xfffffffe
mov [temp], edx ; [temp] = 0xffffffff
mov eax, 0x7fffffff
mul ecx
; eax = 0xfffffffe
add eax, [temp] ; eax = 0xfffffffd
mov edx, eax
mov eax, ebx
; edx:eax = 0xfffffffdfffffffe
-
mov [temp], edx ; [temp] = 0xffffffff
Wie kommst du da auf FFFFFFFFh? Ich komme auf 1, und dann stimmt das Ergebnis.
bitmaster
-
Stimmt 1 muss dahin. Dann nehm ich alles zurück.
-
Stimmt 1 muss dahin. Dann nehm ich alles zurück.
Schön auch mal gegen dich recht zu haben. ^^
bitmaster