Jump out of range? Hilfe!
-
Hallo ich habe vor Wochen ein Assembler Programm geschrieben, wo ich dachte es funktioniere, jedoch wurde ich heute darauf hingewiesen dass mein Programm doch nicht richtig funktioniere.
Das Problem ist, dass ich in dem Programm vor habe 8 Mal eine Eingabe stattfinden zu lassen. Vielleicht, kennt ihr ja TASMX (da mache ich das). Beim Debugger Mode klappt alles wunderbar. Aber wenn ich den ganzen Spaß im normalen Modus "Run"(Starte) dann will er von mir nur die ersten Eingabe, und das wars dann auch.
Kürzlich kam die Fehler mit irgendwas von Jump out of range, jetzt kommt sie nicht mehr (obwohl ich nichts geändert habe). Ich habe den verdacht, dass folgender Code nicht ganz ok ist:
schleife: mov ah,01h ; Einlesen ueber die Tastatur int 21h shr al,1 ; Schiebe logisch nach rechts rcl dl,1 ; rotiere nach links add cx,1 ; Counter wird um 1 erh”ht cmp cx,8 ; vergleicht bis 8 Durchl„ufe erreicht sind jl schleife
Also wenn der Fehler "out of range" tatsächlich so stimmen sollte, ist der Fehler verständlich, dass er eben nicht 8 mal zurück zur Eingabe springt. Aber könnt ihr mal oben schauen ob der JUMP ok ist? Eigentlich müsste das funktionieren, im debugger geht es auch, aber außerhalb des debuggers gehts nicht.
EDIT: Habe gerade mal wirklich mein ganze Programm (fast) nur auf das obige Element gekürzt, um zu schauen, ob es wirklich daran liegt. Und ja, funktioniert immer noch nicht. Die Abfrage findet nur 1 x Statt statt 8 Mal. Der scheint nicht zurück zu jumpen, why auch immer.
-
Wird CX vom Interrupt-Handler geändert?
Im Zweifelsfall push/pop cx
-
nö, laut debugger stimmt alles mit cx, wird bis 8 hochgezählt.
Hier mal der abgespackte Code:
.model small ;Festlegung des Speichermodells include macros.mac ; Befehle von Macros werden eingebenunden. JUMPS .Stack 1000h .Data ;Datensegment anfang des segments Einleitung db "Bitte geben Sie hintereinander ein",10,13, "ob das Stimmt oder nicht",10,13,"indem Sie mit 1=JA 0=NEIN bestaetigen.",10,13,"$" ;Codesegment .Code Start: mov ax,@Data ;ax ladet daten aus dem datensegment mov ds,ax ;Datensegment laden xor dx,dx routin: readz ax ;mov dl,ah ;mov ah,01h ; Einlesen ueber die Tastatur ;int 21h shr al,1 ; Schiebe logisch nach rechts rcl dl,1 ; rotiere nach links add cx,1 ; Counter wird um 1 erh”ht cmp cx,8 ; vergleicht bis 8 Durchl„ufe erreicht sind jl routin xor cx,cx ; cx Counter wird 0 gesetzt xor ax,ax ; ax wird 0 gesetz xor bx,bx ; bx wird 0 gesetzt mov bl,dl ; in bl wird der Wert von dl geschrieben (also die Bits) xor dl,dl ; dl wird (daraufhin ebenfalls) 0 gesetzt mov ax,04c00h ;Interrupt zur Programm Terminierung int 21h ;Ende des Code-Segmentes und gleichzeitig ;des Programmes end start ;Anweisung zum Programmanfang zu gehen
-
Ein Jump out of range kann ich mir nicht denken.
.....................Bytes zurück .. Bytes vor
.......rel8.....................-128 .. 127
.......rel16..............-32.768 .. 32.767
.......rel32...-2.147.483.648 .. 2.147.483.647Mit DEBUG.exe unter XP folgenden Code getestet macht keine Probleme:
start->ausführen-> debug + Eingabetaste -a ????:0100 mov ah,01 ????:0102 int 21 ????:0104 inc cx ????:0105 cmp cx,8 ????:0108 jb 0100 ????:010A -g=cs:0100 010A 12345678 AX=0138 BX=0000 CX=0008 .....
Dirk
-
BunterVogel schrieb:
Kürzlich kam die Fehler mit irgendwas von Jump out of range
Wenn Du mit TASMX ohne weitere Angaben assemblierst, dann wird ausschließlich Code für den 8086 produziert. Bedingte Sprünge (z.B. JL) dürfen dann nicht weiter als 127 Bytes reichen. Das Makro 'readz' produziert eine Menge an Code, die diese Grenze sprengt. Erst ab dem 80386 gibt es relative Sprünge über 32767 Bytes. Diese Sprünge aktivierst Du, indem Du unter die .MODEL-Anweisung ein '.486' schreibst. Mit der JUMPS-Anweisung weist Du TASMX an, im Problemfall den Code umzuschreiben. Aus 'JL schleife' wird dann 'JGE @ ... JMP Schleife ... @:'.
schleife: mov ah,01h ; Einlesen ueber die Tastatur int 21h shr al,1 ; Schiebe logisch nach rechts rcl dl,1 ; rotiere nach links add cx,1 ; Counter wird um 1 erh”ht cmp cx,8 ; vergleicht bis 8 Durchl„ufe erreicht sind jl schleife
Welchen Wert hat CX bei Eintritt in die Schleife? Du darfst Dich nicht darauf verlassen, dass das schon irgendwie stimmen wird.
viele grüße
ralph