BlackBoard » Design, Programmierung & Entwicklung » Programmieren » TasmX: Divide Overflow » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen TasmX: Divide Overflow
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Misel Misel ist männlich
Hüter des Kitkat


images/avatars/avatar-2084.png

Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d e

wütend TasmX: Divide Overflow       Zum Anfang der Seite springen

Hallo,

folgende Procedur erzeugt nach der zweiten Iteration immer einen Devide-overflow, aber ich seh nicht ein, warum unglücklich

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 Misel ist offline E-Mail an Misel senden Homepage von Misel Beiträge von Misel suchen
Misel Misel ist männlich
Hüter des Kitkat


images/avatars/avatar-2084.png

Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d e

Themenstarter Thema begonnen von Misel
      Zum Anfang der Seite springen

ich hasse es ....

Man postet die Frage, testet noch die letzte Idee, die einem so einfällt und *plonk* die funktioniert.

in DX, steht der Rest der Division. Wenn ich den vor der nächsten Division wieder auf 0 setze geht's :confused:

Weiß jemand wieso?

Naja, es funktioniert großes Grinsen

vielen Dank für die Aufmerksamkeit Zunge raus

__________________
LAUFT! Ich spiele KILLERSPIELE!

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Misel: 06.06.2004 11:52.

06.06.2004 11:52 Misel ist offline E-Mail an Misel senden Homepage von Misel Beiträge von Misel suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

hab den Titel gelesen (Divide Overflow) und gleich daran gedacht dass jemand sein DX register nicht löscht großes Grinsen
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 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
Misel Misel ist männlich
Hüter des Kitkat


images/avatars/avatar-2084.png

Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d e

Themenstarter Thema begonnen von Misel
      Zum Anfang der Seite springen

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 smile

__________________
LAUFT! Ich spiele KILLERSPIELE!
06.06.2004 23:00 Misel ist offline E-Mail an Misel senden Homepage von Misel Beiträge von Misel suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » TasmX: Divide Overflow

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH