Mam zadanie o treści:
- Napisać podprogram w asemblerze, który wyszuka podany znak w obszarze tablica. Obszar tablica zawiera ciąg znaków ASCII zakończony bajtem zerowym. Podprogram powinien być przystosowany do wywoływania z poziomu języka C, a jego prototyp ma postać:
void szukaj(char tablica[], char znak, char ** wynik);
Wyznaczony adres pierwszego znalezionego znaku w obszarze tablica powinien zostać wpisany do zmiennej, której adres podaje trzeci parametr. Jeśli znak nie został odnaleziony, to wpisuje się wartość zero (null).
Moje rozwiązanie:
.686
.model flat
public _szukaj
.code
_szukaj PROC
push ebp
mov ebp, esp
mov ebx, [ebp+8] ; początek tablicy znaków
mov ecx, [ebp+12] ; szukany znak
mov eax, [ebp+16] ; wynik
sprawdz:
cmp byte ptr[ebx],0 ; sprawdzmy czy koniec znaków
je koniec
mov dl, byte ptr[ebx] ; do dl pierwsza litera
cmp edx, ecx ; sprawdzenie czy bieżaca litera to szukany znak
je koniec ; jak tak to kończymy
inc ebx
jmp sprawdz
koniec:
mov eax, ebx ; przesłanie nowego adresu
pop ebp
ret
_szukaj ENDP
END
#include <stdio.h>
void szukaj(char tablica[], char znak, char ** wynik);
int main()
{
char tabl[ ]="abcdefg";
char * wyn;
szukaj(tabl, 'e', &wyn);
printf("\nw = %s\n", wyn);
return 0;
}
Problem jest taki że powinno wyświetlić 'efg' a program sie zawiesza w momencie wywołania funkcji printf.
Mogę prosić o wyjaśnienie dlaczego tak się dzieje i jak to naprawić
poprawienie tytułu wątku i dodanie znaczników <quote>, <code class="c"> i <code class="asm"> - furious programming