Wielokrotne wypisanie stringów na ekran przez prawdopodobnie błędne rozumienie działania stosu

0

Witajcie

Po praktycznej nauce Pythona przyszedł czas na języki niskopoziomowe. Tak więc od kilku dni uczę się Assembly i C. Co do Assembly to pierwszy "hello world" jest już za mną w C aktualnie kończę pisać interpreter Brainfucka w całości oparty o pointery, ale nie w tym rzecz.

Oto kod błędnie działającego programu:

global _main
extern _printf
extern _getchar

section .data
	wpisz db "Wpisz litere: ", 0Ah
	hello db "Hello world!", 0Ah
	inne  db "abc", 0Ah

section .text
_main:
	mov eax, wpisz	; eax --> adres ciagu bajtow z 0 na koncu
	push eax	; eax zostaje wrzucony na stos
	call _printf	; printf jest wywolywane z adresem stringa
	add esp, 4	; stos jest czyszczony
	xor eax, eax	; eax jest zerowany
	call _getchar	; pobieramy znak od uzytkownika on bedzie wrzcony do eax
	cmp eax, 'a'	; porownaj wpisany przez uzytkownika znak z litera 'a'
	jz wypisz_hello	; jesli uzytkownik wpisal a

	; ----- w przeciwnym wypadku -----
	
	jnz wypisz_xyz

wypisz_xyz:
	mov ecx, inne
	push ecx
	call _printf
	add esp, 4
	xor ecx, ecx
	xor eax, eax
	ret

wypisz_hello:
	mov ecx, hello	; ecx --> adres zmiennej hello, a w zasadzie adres do ciagu bajtow zakonczonego 0
	push ecx
	call _printf
	add esp, 4
	xor eax, eax
	ret

Treść programu jest trywialna: Program przyjmuje od użytkownika char. Jeśli użytkownik wpisze 'a' wówczas na ekranie ma zostać wypisane "Hello world!" w przeciwnym wypadku na ekranie ma pojawić się "abc".

Błędy widoczne są na screenie w załączniku. Program na początku niepotrzebnie wypisuje "Hello world!" oraz "abc", a następnie za każdym razem nieważne co użytkownik wpisze program wypisuje "abc". W przypadku wpisania przez użytkownika 'a' program wypisze "Hello world! abc", w przypadku wpisania innego chara program wypisze "abc".

Będę wdzięczny za naprowadzenie mnie na naprawę błędu.

1

Funkcja printf przyjmuje 0 jako znak terminalny ciągu:
czyli Twoje ciągi powinny być zakończone znakiem zera, aby funkcja wiedziała gdzie zakończyć wypisywanie

    wpisz db "Wpisz litere: ", 0Ah,0
    hello db "Hello world!", 0Ah,0
    inne  db "abc", 0Ah,0

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