[Asm] StrLen, StrCmp

0

Jak w assemblerze obliczyć długość stringa i porównać 2 stringi ?

Robiłem coś takiego:

strlength:  ;oblicza dlugosc ds:si
    push bx
    mov cx,0           ;CX przechowuje wynik
    cld
strlen_skok:
    inc cx
    lodsb
    cmp al,0               ;0 konczy stringa
    je strlen_end
    jmp strlen_skok
strlen_end:
    dec cx            ;wynik jest o 1 za duzy - trzeba go poprawic
    mov ax,cx       ;wynik w ax
    pop bx
    ret

niestety - nie oblicza dlugosci stringa

0
function StrLen(const Str: PChar): Cardinal; assembler;
asm
        MOV     EDX,EDI
        MOV     EDI,EAX
        MOV     ECX,0FFFFFFFFH
        XOR     AL,AL
        REPNE   SCASB
        MOV     EAX,0FFFFFFFEH
        SUB     EAX,ECX
        MOV     EDI,EDX
end;
0

Piszę w DOSowym NASM, więc zmodyfikowałem podaną przez Ciebie procedurę:

str_len:
        MOV     DX,DI
        MOV     DI,AX       ;DI ma wskazywac na stringa
        MOV     CX,0FFFFH   ;ile bajtow przeszukac
        XOR     AL,AL       ;znak do wyszukania = 0
        REPNE   SCASB       
        MOV     AX,0FFFEH
        SUB     AX,CX       ;waartosc zwracana w AX
        MOV     DI,DX       ;przywroc DI
        ret

Wywołuję ją w taki sposób:

   mov dx, napis
   call str_len
   ...
   napis db '12345' , 0

NIestety nie działa - procedura zwraca zawsze 0. :/

0

Działa - mój błąd - zamiast do AX argument wrzucałem do DX. Teraz jest wszystko dobrze. Wielkie dzięki !

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0