NASM - dzielenie i pobieranie znaku z klawiatury (IDE - SASM)

0

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:

  1. 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.

  2. 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

0

mov edx, 0

  1. Wstaw to gdzieś, na przykład pod
sprawdz_zero:    
    PRINT_STRING "Podaj 'B': "
    GET_DEC 2, ebx 
  1. Program się nie zatrzyma, bo nie powinien. Wpisz znak jaki chcesz do Inputa i będzie działać.
0
witam napisał(a):

mov edx, 0

  1. Wstaw to gdzieś, na przykład pod
sprawdz_zero:    
    PRINT_STRING "Podaj 'B': "
    GET_DEC 2, ebx 
  1. Program się nie zatrzyma, bo nie powinien. Wpisz znak jaki chcesz do Inputa i będzie działać.

ad 1. - Nie rozumiem co to ma zmienić?
ad 2. - Hehe spokojnie. Wiem jak to działa. Tak w przypadku inputa z programu SASM tak i w przypadku kompilacji do exec'a -> Nie działa.

Zachodzę w głowę o co tutaj chodzi. Co ciekawe, kiedy zamienię w menu kalkulatorka opcje z GET_DEC na GET_CHAR to działa i program oczekuje ode mnie znaku :)
Niestety nie działa w etykiecie 'pytanie'.

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