|
|
|
|
TasmX: Divide Overflow |
Misel
Hüter des Kitkat
Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d
e
|
|
TasmX: Divide Overflow |
|
Hallo,
folgende Procedur erzeugt nach der zweiten Iteration immer einen Devide-overflow, aber ich seh nicht ein, warum
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
|
int2string proc ; procedure to output an integer
arg integer:word
uses AX, BX, CX, DX, DI
mov DI, 5 ; a word is 5 chars long at max (65536)
xor DX, DX ; DX -> 0
mov AX, 12345
mov BX, 10 ; the number has to be devided by 10
; in each iteration
disp_int_loop:
dec DI
div BX ; the rest is stored in DX
; genau hier passiert der Fehler. aber erst in der zweiten Iteration,
; obwohl er das eigentlich nicht tun sollte. Er soll einfach nur AX durch BX teilen.
add DL, '0' ; ASCII conversion
mov temp_int[DI], DL ; write the value into the string
cmp DI, 0
jne disp_int_loop
ret
endp
|
|
ich habe das Gefühl, dass das ein totaler Newbiefehler ist. Aber ich seh's einfach nicht.
__________________ LAUFT! Ich spiele KILLERSPIELE!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Misel: 06.06.2004 11:47.
|
|
06.06.2004 11:47 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
hab den Titel gelesen (Divide Overflow) und gleich daran gedacht dass jemand sein DX register nicht löscht
Warum:
auszug aus Assembler ge-packt von Joahim Rohde:
Zitat: |
DIV
division
Div ist ein Befehl für Vorzeichenlose Division blabla...
als Operand kann ein Register oder eine Speichervariable angegeben werden.
ist der operand 8 -bit groß so wird das AX Register durch den Operanden geteilt, wobei der ganzzahlige Wert ins AL Register und der Divisionsrest ins AH-Register geschrieben wird.
Ist der Operand 16-Bit groß, wird der Inhalt von DX:AX (DX=höherwerties Word) durch den Operanden geteilt, wobei der ganzzahlige Wert ins AX Resgister und der Divisons-Rest ins DX-Register geschrieben wird ...
|
(bei 32-bit entsprechend EDX:EAX und EAX=Ergebnis, EDX=rest)
Übertrag auf deinen Code:
da BX=16-Bit ist, versucht er den wert von DX:AX durch BX zu teilen - da DX ja nach der ersten division nicht mehr null ist, wird eine größere Zahl geteilt als von dir vorgesehen.
PS: Perfomancetipp: falls die Zahl, durch die du dividieren willst, ein wert zur Basis zwei darstellt (2,4,8,16,32,64) dann solltest du SHR benutzen.
z.B statt:
mov ax,100
mov bl,8
div bl
kannst du
mov ax,24
shr ax,3 (2 hoch 3=8 )
verwenden (wird viel schneller abgearbeitet)
dasselbe funktioniert auch mit multiplikationen, wobei man hier SHL verwenden kann.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von CDW: 06.06.2004 14:23.
|
|
06.06.2004 14:17 |
|
|
Misel
Hüter des Kitkat
Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d
e
Themenstarter
|
|
bisher habe ich auch immer nur durch 2^n teilen müssen, da war das kein Problem mit dem Shiften.
Das war das erste Mal, dass ich den DIV-Befehl nutze und ich brauche den Wert in AX auch 16bit breit.
Danke für die Erklärung
__________________ LAUFT! Ich spiele KILLERSPIELE!
|
|
06.06.2004 23:00 |
|
|
|
|
|
|