Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- org 100h
- start:
- mov [wierz], sp
- mov ah, 9
- mov dx, witaj
- int 21h
- mov ah, 10 ;pobiera ciag znakow, zapisuje do zmiennej slowo
- mov dx, slowo
- int 21h
- call spronp ;sprawdza, czy ciag jest ONP
- call oblicz ;jezeli jest to oblicza wartosc wyrazenia
- call wynik ;wyswietla wynik liczbowy
- koniec:
- mov ah, 9
- mov dx, zegnaj
- int 21h
- mov sp, [wierz]
- mov ax, 4C00h
- int 21h
- ent1 db 10,13,36
- witaj db "Witaj w programie - kalkulatorze, ktorzy przyjmuje dzialanie w ONP.",10,13,"Podaj dzialanie w ONP (musi skladac sie z cyfr!):",10,13,36
- slowo db 255;ile znakow pobierze z klawiatury
- db 0;po pobraniu ta wartosc zamieni sie na znaki
- times 256 db "$";tworzy 256 pol z dolarem
- bledny db "Wyjatek. Bledny zapis ONP.",36
- wierz db 0
- dziel0 db 10,13,"Wyjatek. Proba dzielenia przez 0.",36
- wyn1 db 10,13,"Wynik dzialania wynosi: ",36
- zakres db 10,13,"Wyjatek. Wynik przekroczyl zakres.",36
- zegnaj db 10,13,"Dziekuje za skorzystanie z programu!",36
- kolejny db "Czy chcesz zaczac od nowa? [T/N]",10,13,36
- spronp: ;jezeli trafiam na cyfre, to inkrementuje licznik, jezeli na znak, dekrementuje
- xor ax, ax ;koncowa wartosc licznika ma byc rowna 1
- xor bx, bx ;oraz dwa pierwsze znaki musza byc cyframi
- xor cx, cx ;jezeli nie, koncze dzialanie programu
- xor dx, dx
- xor si, si
- mov si, slowo
- mov bx, 2
- wys:
- cmp al, 2
- je sprawdz
- mov dl, [si+bx]
- cmp dl, 13
- je spacja
- cmp dl, 36
- je spronpd
- cmp dl, 32
- je spacja
- cmp dl, '+'
- je znak
- cmp dl, '-'
- je znak
- cmp dl, '*'
- je znak
- cmp dl, '/'
- je znak
- cmp dl, '0'
- jb blad
- cmp dl, '9'
- jg blad
- mov dl, [si+bx+1]
- cmp dl, ' '
- jne blad
- inc al
- inc cx
- cmp cl, 1
- jb blad
- inc bx
- jmp wys
- spacja:
- inc bx
- jmp wys
- znak:
- dec cx
- cmp cl, 1
- jb blad
- inc bx
- jmp wys
- sprawdz:
- cmp cl, 2
- jne blad
- inc al
- jmp wys
- blad:
- mov ah, 9
- mov dx, bledny
- int 21h
- jmp koniec
- spronpd:
- cmp cl, 1
- jne blad
- ret
- oblicz: ;jezeli dochodze do tego momentu, to wiem, ze mam ONP wiec juz nie sprawdzam
- xor ax, ax ;trafiam na cyfre, wrzucam ja na stos
- xor bx, bx ;trafiam na znak, zdejmuje dwie liczby ze stosu i wykonuje dzialanie
- xor cx, cx ;wynik koncowy siedzi w CX
- xor dx, dx
- xor si, si
- mov si, slowo
- mov bx, 2
- wys1:
- mov cl, [si+bx]
- cmp cl, 13
- je tyle
- cmp cl, 36
- je tyle
- cmp cl, ' '
- je spacja1
- cmp cl, '+'
- je dodaj
- cmp cl, '-'
- je odejmij
- cmp cl, '*'
- je pomnoz
- cmp cl, '/'
- je podziel
- xor ch, ch
- sub cx, 48
- push cx
- xor cx, cx
- inc bx
- jmp wys1
- spacja1:
- inc bx
- jmp wys1
- dodaj:
- xor ax, ax
- xor di, di
- pop ax
- pop di
- add ax, di
- jc wyjzak
- push ax
- inc bx
- jmp wys1
- odejmij:
- xor ax, ax
- xor di, di
- pop di
- pop ax
- sub ax, di
- jc wyjzak
- push ax
- inc bx
- jmp wys1
- pomnoz:
- xor ax, ax
- xor di, di
- pop di
- pop ax
- mul di
- jc wyjzak
- push ax
- inc bx
- jmp wys1
- podziel:
- xor ax, ax
- xor di, di
- pop di
- cmp di, 0
- je wyjdziel
- pop ax
- div di
- jc wyjzak
- push ax
- inc bx
- jmp wys1
- wyjdziel:
- mov ah, 9
- mov dx, dziel0
- int 21h
- jmp koniec
- wyjzak:
- mov ah, 9
- mov dx, zakres
- int 21h
- jmp koniec
- tyle:
- pop cx
- ret
- wynik: ;standardowe wyswietlanie wyniku dziesietnego
- mov ah, 9
- mov dx, wyn1
- int 21h
- mov ax, cx
- xor bx, bx
- mov bx, 10
- xor cx, cx
- xor dx, dx
- w1:
- div bx
- push dx
- inc cx
- xor dx, dx
- cmp ax, 0
- jg w1
- jmp wypisz
- wypisz:
- xor dx, dx
- mov ah, 2
- pop dx
- add dx, 48
- int 21h
- loop wypisz
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement