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 nix

    Mir 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 Sprung

    fail:
    <fail-code>
    jmp end

    success:
    <success-code>

    end:
    <end-code>

    Ich benutz allerdings NASM.


Anmelden zum Antworten