Autor Thema: idiv funktioniert nicht so wie ich das gerne hätte!  (Gelesen 3426 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
Hi,

ich habe ein Problem mit idiv. Also folgendes Beispiel soll zeigen was ich meine:

In rdx:rax befindet sich die Zahl -19 (also in rdx Null und in rax FFFFFFFFFFFFFFEDh). In rcx befindet sich 3. Jetzt mache ich ein idiv rcx und erwarte das in rax -6 und in rdx -1 steht. Das tut es aber nicht. In rdx steht Null und in rax steht 555555555555554F. Das idiv hat also die Vorzeichen gar nicht berücksichtigt und FFFFFFFFFFFFFFEDh einfach durch 3 geteilt. Aber genau das soll doch nur div machen und nicht idiv, oder? Also idiv ist doch dazu da um vorzeichenbehaftete Zahlen richtig zu teilen. Also wieso macht es dann so ein Mist. Und dann habe ich noch eine Frage zu imul. Wozu gibt es imul. Also eine Multiplikation geht doch automatisch mit dem Vorzeichen richtig um, oder nicht?

xor rdx,rdx
mov rax,-19
mov rcx,3
idiv rcx
;jetzt ist in rax nicht -6 also FFFFFFFFFFFFFFFAh sondern 555555555555554Fh nur wieso?
vielen dank!!!

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

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 07. June 2007, 17:54 »
Ich hätte jetzt gesagt negativ=1 und positiv=0...

EDIT: wenn das so umgekehrt wäre, macht ein mul diese spezialbehandlung nicht mehr automatisch...
Edith will dazu noch sagen: Das autmatisch korrekte handeln von mul ist bei zweien negativen zahlen sowiso nicht möglich.

Gruss
« Letzte Änderung: 07. June 2007, 18:11 von nooooooooos »

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 07. June 2007, 19:37 »
Ja, wenn Bit63 gesetzt ist, ist die Zahl negativ und wenn Bit63 nicht gesetzt ist, ist die Zahl positiv.

Zitat
Das autmatisch korrekte handeln von mul ist bei zweien negativen zahlen sowiso nicht möglich.
Nenn mir ein Beispiel, bei dem es nicht so ist.

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

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 07. June 2007, 20:34 »
kann ich eben nicht...sind beide zahlen negativ, also ist bei beiden zahlen das 63. bit gesetzt ergibt das durch die multiplikation wieder eine 1 und somit eine negative zahl...

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 07. June 2007, 22:10 »
Das stimmt nicht. -2 *-2 ergibt +4 also FFFFFFFFFFFFFFFCh * FFFFFFFFFFFFFFFCh ergibt 4. Also nenne mir ein Beispiel, bei dem es nicht klappt.

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

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 07. June 2007, 22:18 »
ne das 64. bit muss in RDX gesetzt sein!!!

rax gibt -2 * -2 = 4 und rdx gibt 1 * 1 = 1 (und nicht 10) ---> folglich bedeutet diese 1 Minus, ergibt -4 was aber offensichtlich falsch ist.


Gruss

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 08. June 2007, 00:29 »
bitmaster: Stichwort sign extension. Einfach rdx mit 0xffffffffffffffff initialisieren falls rax negativ ist. Vielleicht gibts auch cwd/cwde für 64-Bit.

Unterschied zwischen mul und imul:
eax=1
edx=0
ecx=0x80000000
ergebnis von mul ecx: 0x0000000080000000
ergebnis von imul ecx: 0xffffffff80000000

edit: denkt euch das halt mit 64bit registern und zahlen
« Letzte Änderung: 08. June 2007, 00:47 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 #7 am: 09. June 2007, 11:59 »
@PorkChicken: Vielen dank, das hatte ich ganz vergessen. Mittels idiv rcx dividiere ich ja eine 128 Bit Zahl und das MSB ist das 128. Bit und nicht das 64. Bit. Der Befehl lautet cqo, damit wird das Vorzeichen aus rax (also Bit63) in alle Bits von rdx kopiert. Und das muss ja auch so sein, es funktioniert jetzt auch. Noch mal, vielen dank.

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

 

Einloggen