Witajcie,
piszę sobie prosty kalkulatorek w NASM'ie i zastanawiam się dlaczego program wywala się po zakończeniu dokonywania obliczeń, kiedy chcę skoczyć na początek (do menu).
Aplikacja wywala się dokładnie w miejscu wywołania 'jmp poczatek'.
Trochę nie wiem o co chodzi. Wcześniej pisałem sobie trochę w ASM ale 16'to bitowym, jeszcze pod DOS'a z jego przerwaniami etc...
global _main
extern _printf
extern _scanf
section .data
liczbaA dd 0
liczbaB dd 0
wynik dd 0
naglowek db "Kalkulator", 0dh, 0ah, "1. Dodawanie", 0dh, 0ah, "2. Odejmowanie", 0dh, 0ah, "K. Koniec", 0dh, 0ah, "Wybierz: ", 0
opcja dd 0
wprLiczbaA db "Liczba A: ", 0
wprLiczbaB db "Liczba B: ", 0
wprWynik db "Wynik: ",0
formatZnak db "%s", 0
formatLicz db "%d", 0
section .text
_main:
push ebp
mov ebp, esp
; Menu oraz wybór działania
poczatek:
push naglowek
call _printf
add esp, 4
push opcja
push formatZnak
call _scanf
add esp, 8
cmp byte[opcja], '1'
je dodawanie
cmp byte[opcja], '2'
je odejmowanie
cmp byte[opcja], 'k'
je koniec
jmp koniec
; Użycie funkcji z 'C' do wczytania liczb i pokazywania komunikatów.
dodawanie:
push wprLiczbaA
call _printf
add esp, 4
push liczbaA
push formatLicz
call _scanf
add esp, 8
push wprLiczbaB
call _printf
add esp, 4
push liczbaB
push formatLicz
call _scanf
add esp, 8
push wprWynik
call _printf
add esp, 4
mov eax, [liczbaA]
mov ebx, [liczbaB]
add eax, ebx
mov [wynik], eax
push dword[wynik]
push formatLicz
call _printf
mov esp, 8
jmp poczatek
; To samo co w dodawaniu
odejmowanie:
push wprLiczbaA
call _printf
add esp, 4
push liczbaA
push formatLicz
call _scanf
add esp, 8
push wprLiczbaB
call _printf
add esp, 4
push liczbaB
push formatLicz
call _scanf
add esp, 8
push wprWynik
call _printf
add esp, 4
mov eax, [liczbaA]
mov ebx, [liczbaB]
sub eax, ebx
mov [wynik], eax
push dword[wynik]
push formatLicz
call _printf
mov esp, 8
jmp poczatek
koniec:
mov esp, ebp
pop ebp
ret