Dividieren in Assembler?
-
Hi!
MOV AX,DX MOV BX,03E8h DIV BX MOV WORD PTR[Zahl+2],AX
In dem obenstehenden Code wird ja das was im Register DX steht in AX gespeichert. In AX steht danach E2B. Geteilt wird dann durch 3E8, was als Ergebnis 3 im AX-Register und 273 im DX-Register zufolge hätte. Leider meldet mir der Debugger: "Divide by zero!"
Das komische ist aber, dass mit untem stehenden Code kein "Divide by zero geliefert wird, obwohl mit identischen Zahlen gerechnet wird... Die Zahlen oben zu unten sind definitiv identisch...
mov ax,0E2Bh mov bx,03E8h div bx
Könnt ihr mir sagen wo da was faul ist?
-
Es wird nicht AX durch BX geteilt, sondern der 32 bit Wert DX:AX durch BX.
Zur Exception kommt es, wenn das Divisionsergebnis zu groß für AX ist.
Den Wert der 2. Hälfte hast du uns jeweils verschiegen:MOV AX,DX MOV BX,03E8h DIV BX MOV WORD PTR[Zahl+2],AX
falls, wie du sagst, AX vor der Division den Wert 0xe2b hat, gilt das offenbar auch für DX.
0x0e2b0e2b geteilt durch 0x3e8 ist aber 0x3a086, Rest 0x2bb.
0x3a086 ist zu groß für AX, also wird der #DE interrupt ausgelöst.
-
Danke für deine Antwort. Dass er das Regiserpaar AX:DX durch den Divisor der in BX steht teil, hatte ich nicht drangedacht. Ich schreib vor der Division nun eine 0 in DX und dividiere dann jetzt funktioniert die Operation so wie ich es mir wünsche!
Danke für deine Hilfe!