Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 07. June 2007, 17:01
-
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
-
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
-
Ja, wenn Bit63 gesetzt ist, ist die Zahl negativ und wenn Bit63 nicht gesetzt ist, ist die Zahl positiv.
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
-
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...
-
Das stimmt nicht. -2 *-2 ergibt +4 also FFFFFFFFFFFFFFFCh * FFFFFFFFFFFFFFFCh ergibt 4. Also nenne mir ein Beispiel, bei dem es nicht klappt.
bitmaster
-
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
-
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
-
@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