Strings vergleichen mit Nasm



  • Ich bin unter NASM neu, jedoch nicht unter ASM (MASM). Meine Funktion unter masm sieht so aus:

    anfang:
    cmp byte ptr [esi],0
    je ende
    mov al,byte ptr [esi]
    mov bl,byte ptr [edi]
    cmp al,bl
    jne ende
    inc esi
    inc edi
    jmp anfang
    ende:
    

    Hab die auch ausprobiert, sieht sehr gut aus. Jedoch sieht das ganze unter nasm anders aus:

    anfang:
    cmp byte [esi],0
    je ende
    mov al,byte [esi]
    mov bl,byte [edi]
    cmp al,bl
    jne ende
    inc esi
    inc edi
    jmp anfang
    ende:
    

    Kann mir einer helfen, denn ich sehe vor lauter Bäumen den Wald nicht mehr 😕 Das Ding will einfach nicht richtig laufen... Hier zur Sicherheit noch das Macro:

    %macro CompareText 2
    mov esi,%1
    mov edi,%2
    mov al,0x02
    call sowieso ; Halt die Funktion rufen...
    %endmacro
    


  • Hi,

    ich hab zwr den code bei mir nicht laufen lassen, aber ers cheint mir auf den ersten Blick richtig zu sein. Nur wie überprüfst du nun ob die strings gleich waren? Am carry-flag?
    Wenns nicht klappt versuch etwas in dieser art nicht versuchst:

    ; ********************************
    ; DS:SI = string1 ES:DI = string2 
    ; ********************************
            xor cx,cx
            push si
    lange:
            cmp [si],0
            je vergleich
            inc si
            inc cx
            jmp short laenge
    vergleich:
            pop si
            repe cmpsb
    

    Nun könnte man nach dem carryflag abfragen 🙂

    gruss



  • hi,
    NASM-Beispiel:

    mov cx, 10 ; << 10 = Stringlänge
    mov si, String_1
    mov di, String_2
    cld
    repe cmpsb
    je _strings_sind_gleich
    weitere 
    verarbeitung 
    wenn strings 
    ungleich sing 
    hier
    
    strings_sind_gleich:
    bla
    bla
    bla
    


  • So jetzt müste es gehen:

    Funktion:
     push si
    laenge:
     cmp byte [si],0
     je vergleich
     inc cx
     inc si
    vergleich:
     pop si
     inc cx          ; wichtig!
     repe cmpsb
     retn
    

    Wenn man das cx nicht um eins erhöht, dann ist das auch gleich:

    gut  db "Gut",0
    guta db "Gut aber...",0
    
    mov si,gut
    mov di,guta
    call Funktion
    

Anmelden zum Antworten