Strings vergleichen - kurioser Fehler
-
Hi, ich weiß dieses Thema gab es schon mal aber ich kann
mir nicht erklären WARUM dieser Code nicht funktioniert... rein logisch müsste NIE ein Jump in "Fail" erfolgen:[bits 16] [SEGMENT .text] mov si, str1 mov di, str2 mov cx, 4 repe cmpsb jne Fail Success: mov ah, 0x0E mov al, '!' mov bh, 0x00 mov bl, 0x07 int 0x10 mov ax, 4C00h ; wenn ich diese beiden Zeilen auskommentier int 21h ; tritt der Fehler auf Fail: mov ah, 0x0E ; ZUSATZ - noch kurioser... mov al, 'F' mov bh, 0x00 mov bl, 0x07 int 0x10 ;Ende ZUSATZ mov ax, 4C00h int 21h [SEGMENT .data] str1 DB 'ver',0x00 str2 DB 'ver',0x00
Also... wenn ich das Programm _ohne_ den "Zusatz" laufen lasse scheint alles zu funktionieren: ein "!" wird ausgegeben. Wenn ich die beiden Zeilen (s.o.) auskommentiere müsste ja das programm in jedem fall trotzdem beendet werden weil fail ja sowieso ausgeführt wird, an den Strings ändert sich auch nix, trotzdem wird kein "!" ausgegeben... warum ?
Wenn ich den Zusatz reinschreibe,
wird plötzlich ein "F" ausgegeben.So ich hoffe ihr versteht das Problem und könnt mir helfen
mfg vikingspirit
-
Das einzige, was mir auffällt, ist, dass du kein cld machst. Dass er in den Fail-Zweig durchfällt, wenn du das 4c00 wegtust, ist dir aber schon klar, oder?
-
natürlich ist mir klar dass der Zweig durchfällt, aber angenommen ich hau den "ZUSATZ" raus und kommentier die beiden Zeilen (s.o) aus... dann müsste das Prog. nach Success in Fail weiterlaufen und also beenden.... tuts aber nicht. Es springt anscheinend direkt in Fail und beendet (ohne ausgabe also)
Des mit cld - ja gut... hatte ich schon drin hilft aber trotzdem nixMir ist der Fehler unbegreifbar....
-
Hi.
Moeglicherweise ist DS falsch gesetzt.
Fuege mal folgendes an den Anfang deines Programms ein:mov ax, data mov ds, ax
-
mov es, ax dann aber auch gleich.
-
meinst du:
mov ax, ds mov es, ax
?
weil "data" ist doch kein definiertes Symbol (NASM)jedenfalls geht jetzt mein "Hauptprojekt" mit dieser Erweiterung.... die Testdatei von oben leider nicht (auch mit cld net).
thx for help
mfg vikingspirit
-
vikingspirit schrieb:
meinst du:
mov ax, ds mov es, ax
?
Nein.
vikingspirit schrieb:
weil "data" ist doch kein definiertes Symbol (NASM)
IMHO doch.
Ich konnte deinen Code nach og. Erweiterung jedenfalls noch assemblieren.
-
hm... dann liegt des daran das ich nasm für Windows benutzt hab... muss es mal auf meiner linux box probieren... jedenfalls so wie oben geht es in meiner Shell.
well, thx for help
vikingspirit
-
Vielleicht muss man "mov ax, seg data" schreiben.
-
Das mit dem Extended Segment (es) setzen würd ich mal ausprobieren.
Allerdings würd ich den Vergleich anders schreiben. Warum repe?mov di, str1 ;auf str1 zeigen
mov si, str2 ;auf str2 zeigen
mov cx, 4 ;Länge 4
cmpsb ;vergleichen
je success ;falls gleich Sprungfail:
<fail-code>
jmp endsuccess:
<success-code>end:
<end-code>Ich benutz allerdings NASM.