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.