Wyszukiwanie znaku w ciągu znaków

0

Mam zadanie o treści:

  1. 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

0

tutaj tez masz cos http://books.google.pl/books?id=LZ7VAwAAQBAJ&printsec=frontcover&hl=pl&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false

na stronie 200 masz jak to zlinkowac. W ogole ten kod ASM jest twoj? Ogarniasz cos z tego? Bo nie wiem z czym dokladnie jest problem

0

Tak mój...
Jak patrze w visualu na rejestry to następuje przepisanie rejestru ebx do eax.
Funkcja szukaj się wykonuje cała. Program zawiesza się w momencie jak chcę to wyświetlić

1

Nigdzie nie przypisujesz wyniku. Samo z eax do [ebp+16] się nie skopiuje.

0

Dziękuje. Jakby kogoś interesowało to poprawiony fragment kodu:

 mov [eax], ebx ; przesłanie nowego adresu
0

sugerując się powyższym kodem napisałem funkcję która zlicza ilość znaków w tablicy


zlicz proc

push ebp
mov  ebp, esp
 
mov  ebx, [ebp+8]           ; początek tablicy znaków

xor eax, eax

sprawdz:

cmp byte ptr[ebx],0    ; sprawdzmy czy koniec znaków 
je koniec
inc ebx
inc eax 
jmp sprawdz
koniec:	

pop ebp

ret 

zlicz endp



ale nie chce działać nie wiem dlaczego, czy ktoś widzi jakiś błąd i mógłby pomóc?;/

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