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 geschrieben

    ab 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 problemen

    edx 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.


Anmelden zum Antworten