Dzień dobry,
piszę od jakiegoś czasu w NASM'ie 16 bitowym i chciałem przesiąść się na 32 bity. Pobrałem sobie IDE do wygodnego debugowania kodu (wspomniany SASM) i zacząłem coś pisać. Debugowanie programem DEBUG.EXE w Dosboksie było męczące.
Napisałem sobie prosty kalkulatorek o takim oto kodzie:
%include "io.inc"
section .text
global CMAIN
CMAIN:
mov ebp, esp; for correct debugging
;write your code here
PRINT_STRING "..::KALKULATOREK::.."
NEWLINE
PRINT_STRING "1. Dodawanie;"
NEWLINE
PRINT_STRING "2. Odejmowanie;"
NEWLINE
PRINT_STRING "3. Mnozenie;"
NEWLINE
PRINT_STRING "4. Dzielenie;"
NEWLINE
PRINT_STRING "Prosze wybrac numer dzialania: "
GET_DEC 1, ax
cmp ax, 1
je dodaj
cmp ax, 2
je odejmij
cmp ax, 3
je pomnoz
cmp ax, 4
je podziel
dodaj:
PRINT_STRING "Dodawanie:"
NEWLINE
PRINT_STRING "Podaj 'A': "
GET_DEC 2, eax
PRINT_STRING "Podaj 'B': "
GET_DEC 2, ebx
add eax, ebx
PRINT_STRING "Wynik: "
PRINT_DEC 2, eax
jmp pytanie
odejmij:
PRINT_STRING "Odejmowanie:"
NEWLINE
PRINT_STRING "Podaj 'A': "
GET_DEC 2, eax
PRINT_STRING "Podaj 'B': "
GET_DEC 2, ebx
sub eax, ebx
PRINT_STRING "Wynik: "
PRINT_DEC 2, eax
jmp pytanie
pomnoz:
PRINT_STRING "Mnozenie:"
NEWLINE
PRINT_STRING "Podaj 'A': "
GET_DEC 2, eax
PRINT_STRING "Podaj 'B': "
GET_DEC 2, ebx
mul ebx
PRINT_STRING "Wynik: "
PRINT_DEC 2, eax
jmp pytanie
podziel:
PRINT_STRING "Dzielenie:"
NEWLINE
PRINT_STRING "Podaj 'A': "
GET_DEC 2, eax
sprawdz_zero:
PRINT_STRING "Podaj 'B': "
GET_DEC 2, ebx
cmp ebx, 0
je sprawdz_zero
div ebx
PRINT_STRING "Wynik: "
PRINT_DEC 2, eax
jmp pytanie
pytanie:
NEWLINE
PRINT_STRING "Czy chcesz jeszcze raz? (1-TAK/2-NIE) : "
GET_DEC 2, eax
cmp eax, 1
je CMAIN
cmp eax, 2
je koniec
jz koniec
jmp koniec
koniec:
ret
Mam dwa pytania:
-
Dlaczego nie działa mi dzielenie? Program w tym momencie się zawiesza. Co ciekawe debuger nawet nie dochodzi do tego momentu i całe IDE się wiesza przez co nie mogę sprawdzić co siedzi w rejestrach.
-
Dlaczego w etykiecie 'pytanie' nie mogę pobrać znaku tylko muszę pobierać cyrfę? Kiedy napiszę
GET_CHAR eax
program w ogóle nie zatrzymuje się w tym momencie żeby poprosić użytkownika o znak! :-/
Co ciekawe jeśli zrobię tak:
mov eax, byte 't'
cmp eax, 116 ;Kod ASCII małej litery 't'
etc...
to działa prawidłowo.
SASM dostarcza makra, które są wygodne w procedurach IO - to te pisane w moim kodzie z wielkiej litery. W helpie tego IDE są opisane te makra. Może coś źle robię? Nie wiem... nie mam doświadczenia z makrami w asm. Zwykle pisałem jakieś małe COM'y pod DOS'a.
Pozdrawiam
Grzegorz