Autor Thema: Im RM edx:eax dividieren.  (Gelesen 6964 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« 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
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 29. July 2007, 12:55 »
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:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 29. July 2007, 13:01 »
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
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 29. July 2007, 13:04 »
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...?
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 29. July 2007, 13:07 »
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
« Letzte Änderung: 29. July 2007, 13:09 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #5 am: 29. July 2007, 13:12 »
@PorkChicken: Vielen dank!!!! :-)

bitmaster
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 am: 29. July 2007, 20:37 »
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
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 29. July 2007, 21:06 »
hm fehlt da nicht der übertrag beim add?
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 29. July 2007, 23:20 »
hm fehlt da nicht der übertrag beim add?
Wie jetzt?

bitmaster
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 29. July 2007, 23:27 »
Ü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.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #10 am: 29. July 2007, 23:40 »
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
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 29. July 2007, 23:55 »
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
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #12 am: 30. July 2007, 00:31 »
Zitat
mov [temp], edx ; [temp] = 0xffffffff
Wie kommst du da auf FFFFFFFFh? Ich komme auf 1, und dann stimmt das Ergebnis.

bitmaster
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 30. July 2007, 00:46 »
Stimmt 1 muss dahin. Dann nehm ich alles zurück.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #14 am: 30. July 2007, 00:51 »
Stimmt 1 muss dahin. Dann nehm ich alles zurück.
Schön auch mal gegen dich recht zu haben. ^^

bitmaster
In the Future everyone will need OS-64!!!

 

Einloggen