asm - zliczanie ilości wyrazów w łańcuchu

0

Witam,
Mam problem z zadaniem w asemblerze który polega na tym że ma wypisać liczbe wyrazów w łańcuchu (dowolna ilość spacji między wyrazami)

Mianowicie wyrzuca mi zły wynik, podejrzewam że coś nie tak jest z pętlą (nie dochodzi do add edxa), jednak kilka razy dla pewności symulowałem jej działanie i nie znalazłem w niej błędów...

#include <stdio.h>
int main() {
char *x = "aaa ab cccc c";
char bufor[4];
 
asm volatile(
".intel_syntax noprefix;"
"mov eax,%0;"
"push eax;"
"mov eax,%1;"
"push eax;"
"xor eax,eax;" // wyzerowanie rejestru eax
"call zadanie1;"
"jmp wyjscie;"
"zadanie1:"
 
"push ebp;"
"mov ebp, esp;"
"push eax;"
"push ebx;"
"push ecx;"
"push edx;"
"push edi;" //destination index
"push esi;" //source index
"mov esi, [ebp+12];" // zapis x
"mov edi, [ebp+8];" //zapis adresu bufora
"mov ecx,0;" // 'i" z C
"mov edx,0;" // liczba wyrazow
"mov ebx,0;" //czy wykryto spacje (c)
 
"glownapetla:"
"mov eax, [esi+ecx];"
"cmp ecx,0;"
"jne dalej;"
"cmp eax, ' ';"
"je dalej;"
// pierwszy if z programu w c
"add edx,1;"
"jmp koniecpetli;"
 
 
 
"dalej:"
"cmp eax, ' ';"
"jne dalej2;"
"mov ebx,1;"
"jmp koniecpetli;"
 
 
"dalej2:"
"cmp ebx,0;"
"je koniecpetli;"
"cmp eax, ' ';"
"je koniecpetli;"
"add edx,1;"
"mov ebx,0;"
 
"koniecpetli:"
"add ecx,1;"
"mov eax,[esi+ecx];"
"cmp eax,0;" //porownujemy czy nie jest koncem lanucha
"jne glownapetla;"
//w edx jest liczba slow
 
"mov eax,edx;"
"mov ebx,10;"
"mov ecx,2;"
 
"zamianaascii:"
"mov edx,0;"
"div ebx;"//dzielenie przez ebx, reszta w edx(9), wynik w eax
"add dl, 0x30;" //tworzenie ASCII
"mov [edi+ecx], dl;"
"dec ecx;"
"cmp ecx,-1;"
"jne zamianaascii;"
 
"mov eax,4;"
"mov ebx,1;"
"mov ecx,edi;"
"mov edx,3;"
"int 0x80;"
 
"pop esi;"
"pop edi;"
"pop edx;"
"pop ecx;"
"pop ebx;"
"pop eax;"
"pop ebp;"
"ret 8;"
 
 
 
"wyjscie:"
".att_syntax prefix;"
: //informacja o zmiennych wyjciowych (jakie wartosci zmiennych nasz kod zmieni(output))
: "r" (x), "r" (bufor) // informacja o zmiennych wejciowych (jakie wartosci zmiennych nasz kod bêdzie u¿ywa³(input))
: "eax"// informujemy kompilator jakie rejestry zosta³y zniszczone
 
);
return 0;
}

Reszta kodu jest dobra bo gdy po "mov eax,edx;" napisze "mov eax,4" to program zwraca liczbe 4, jest problem właśnie że pętla kończy sie z '1' w edxie, i nie mam pojęcia co jest źle

Z góry dzięki

0

problem rozwiązany, można zamknąć/usunąć

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