[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