DIV und 32bit Zahlen
-
Hi!
Ich möchte einfach eine 32bit zahl durch eine andere 32bit Zahl dividieren und den divisionsrest rausbekommen. Ich habe nicht so ganz verstanden, wie DIV arbeitet, kann mir das jemand nochmal kurz erklären (möglichst nahe an meinem Beispiel)?Danke schonmal im Voraus!
-
Die syntax von div ist folgende: div op und das ist die Operation:
dabei wird ax durch op geteilt und der Rest wird in dx geschriebenab dem 386 kann man damit auch dwords teilen(dabei ist jedoch: eax/op, restg in edx)
div ist jedoch vorzeichenlos
falls du eine vorzeichenbehaftete Division durchführen willst, musst du idiv nehmen
-
Scheint nicht zu funktionieren. Ich habe da mal schnell ein C-Programm mit inline-assembler geschrieben:
unsigned int ergebnis = 0; __asm { mov eax, 999 mov ebx, 300 div ebx mov ergebnis, edx } printf("Rest = %u", ergebnis);
Bei mir kommt immer Rest = 295 raus. Aber 999 / 300 = 3 Rest 99
-
du musst edx vor der Division noch auf 0 setzen, denn wenn edx größer 0 ist, ist auch das Divisionsergebnis größer als FFFFh
wenn ich in deinem Beispiel vor dem div ebx noch ein mov edx,0 einfüge, funktionierts bei mir
-
Super, geht jetzt!
Wieso muss man denn edx nullen? Führt div sozusagen ein inc um 99 auf edx aus oder wie kann man das verstehen?
-
bei einer wort division wird edx-eax durch den divisor(ebx) geteilt
aber wenn edx nicht auf einem definierten inhalt gesetzt wurde, kommt es zu problemenedx musst du aber nur dann auf 0 setzen, wenn du eine wort division durchführst
-
Jo, oder um es nochmal deutlicher zu sagen (edx-eax sieht IMHO missverstaendlich aus) :
div M/R32 nimmt als Dividend einen 64Bit-Wert.
Dieser setzt sich aus edx als HighDWord (Bit 63 bis 32) und eax als LowDWord (Bit 31 bis 0) zusammen.