Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- org 100h ;okreslenie stosu
- start:
- ;zerujemy rejestry
- xor ax,ax
- xor dx,dx
- xor bx,bx
- xor cx,cx
- xor di,di
- mov cx,3 ; przyjmujemy maksymalnie 3 cyfrowa liczbe
- jmp Zmienna_A
- ;pobierz zmienna A
- Zmienna_A:
- mov ah,9
- mov dx,ent1 ; enter
- int 21h
- mov ah,9
- mov dx, wpZmien1 ; tekst wpisz zmienna A
- int 21h
- wpiszZmienna_A:
- mov ah,1 ;pobranie wartosci A
- int 21h
- jmp sprZmienna_A
- ;sprawdzamy czy zmienna nie jest jakims znakiem specjalnym lub enterem
- sprZmienna_A:
- cmp al, 13
- je koniecWpiszZmienna_A ; jesli enter to konczymy pobierac nastepne liczby
- cmp al,48
- jb zlyZnak ; koniec programu
- cmp al,57
- ja zlyZnak ; koniec programu
- mov ah,0 ; wypisanie na ekran
- sub ax,48 ; format z ASCI na liczbe (wartosc)
- push ax ; wepchniecie wartosci na stos
- inc di ; inkrementacja di ++
- loop wpiszZmienna_A ; petla cx > 0
- koniecWpiszZmienna_A:
- cmp cx,3 ; jesli petla nie wykona sie ani razu, bo wprowadzilismy np enter, znaczy ze podano zly znak
- je zlyZnak
- xor ax,ax ; profilaktyczne zerowanie rejestrow
- ;xor dx,dx
- xor cx,cx
- xor bx,bx
- sciagnijZeStosu_A: ; sciagamy wartosci ze stosu, aby uzyskac liczbę do obliczen
- sub di,1 ; nasze di bylo rowne ilosci wykonywanych petel (ale potrzebujemy o jeden mniejszego)
- mov cx,di
- pop ax
- add bx,ax ; przechowuje nam tymczasowo nasza liczbe
- mov dx,10 ; przekazanie wartosci 10 do dx
- cmp cx,0 ; jezeli di = cx = 0 to nie ma wiecej cyfr na stosie
- jle liczbaNaStos_A ; wypychamy gotowa liczbe na stos
- petlaDoStosu_A : ; sciagamy kolejne cyfry ze stosu
- xor ax,ax ; profilaktyczne zerowanie rejestru
- pop ax
- mul dx ; ax*dx
- add bx,ax
- xor ax,ax ; profilaktyczne zerowanie rejestru
- mov ax,dx ; przekazanie wartosci z dx -> ax
- mul dx ; ax*dx
- xor dx,dx ; profilaktyczne zerowanie rejestru
- mov dx,ax ; przekazanie wartosci z ax -> dx
- loop petlaDoStosu_A ; cx>0
- liczbaNaStos_A:
- xor ax,ax ; profilaktyczne zerowanie rejestru
- mov ax,bx ; przepisanie zsumowanej liczby z bh do ax
- call sprawdzZakres
- push ax ; wypchniecie ax na stos jako liczba zminnej A
- jmp wybierzDzialanie
- ;jmp petla1
- ;--------------------------------
- ;pobierz zmienna B
- Zmienna_B:
- xor ax,ax
- xor dx,dx
- xor bx,bx
- xor cx,cx
- xor di,di
- mov cx,3 ; przyjmujemy maksymalnie 3 cyfrowa liczbe
- mov ah,9
- mov dx,ent1 ; enter
- int 21h
- mov ah,9
- mov dx, wpZmien2 ; tekst wpisz zmienna B
- int 21h
- wpiszZmienna_B:
- mov ah,1 ;pobranie wartosci B
- int 21h
- jmp sprZmienna_B
- ;sprawdzamy czy zmienna nie jest jakims znakiem specjalnym lub enterem
- sprZmienna_B:
- cmp al, 13
- je koniecWpiszZmienna_B ; jesli enter to konczymy pobierac nastepne liczby
- cmp al,48
- jb zlyZnak ; koniec programu
- cmp al,57
- ja zlyZnak ; koniec programu
- mov ah,0 ; wypisanie na ekran
- sub ax,48 ; format z ASCI na liczbe (wartosc)
- push ax ; wepchniecie wartosci na stos
- inc di ; inkrementacja di ++
- loop wpiszZmienna_B ; petla cx > 0
- koniecWpiszZmienna_B:
- cmp cx,3 ; jesli petla nie wykona sie ani razu, bo wprowadzilismy np enter, znaczy ze podano zly znak
- je zlyZnak
- xor ax,ax ; profilaktyczne zerowanie rejestrow
- ;xor dx,dx
- xor cx,cx
- xor bx,bx
- sciagnijZeStosu_B: ; sciagamy wartosci ze stosu, aby uzyskac liczbę do obliczen
- sub di,1 ; nasze di bylo rowne ilosci wykonywanych petel (ale potrzebujemy o jeden mniejszego)
- mov cx,di
- pop ax
- add bx,ax ; przechowuje nam tymczasowo nasza liczbe
- mov dx,10
- cmp cx,0 ; jezeli di = cx = 0 to nie ma wiecej cyfr na stosie
- jle liczbaNaStos_B ; wypychamy gotowa liczbe na stos
- petlaDoStosu_B: ; sciagamy kolejne cyfry ze stosu
- xor ax,ax ; profilaktyczne zerowanie rejestru
- pop ax
- mul dx ; ax*dx
- add bx,ax
- xor ax,ax ; profilaktyczne zerowanie rejestru
- mov ax,dx ; przekazanie wartosci z dx -> ax
- mul dx ; ax*dx
- xor dx,dx ; profilaktyczne zerowanie rejestru
- mov dx,ax ; przekazanie wartosci z ax -> dx
- loop petlaDoStosu_B ; cx>0
- liczbaNaStos_B:
- xor ax,ax ; profilaktyczne zerowanie rejestru
- mov ax,bx ; przepisanie zsumowanej liczby z bx do ax,
- call sprawdzZakres
- ;push ax ; wypchniecie ax na stos jako liczba zminnej B narazie nie pushujemy
- ret
- ;--------------------------------
- wybierzDzialanie:
- mov ah,9
- mov dx, ent1
- int 21h
- mov ah,9
- mov dx, tekst
- int 21h
- mov ah,1
- int 21h
- mov ah,0
- warunki:
- ; czy wprowadzono +
- cmp al,43
- je dodawanie
- ; czy wprowadzno -
- cmp al,45
- je odejmowanie
- ; czy wprowadzona *
- cmp al,42
- je mnozenie
- ; czy wrowadzona /
- cmp al,47
- je dzielenie
- ; wprowadzono zly znak
- jmp zlyZnak
- ;--------------------------------
- zlyZnak:
- ;wprowadzono zly znak spoza operandow /,*,-,+ - zakancza program
- mov ah,9
- mov dx,ent1
- int 21h
- mov ah,9
- mov dx,blad
- int 21h
- jmp koniec
- ;--------------------------------
- ; sprawdzenie czy x>255 lub x<0
- sprawdzZakres:
- cmp ax,255
- ja bladZakresu
- cmp ax,0
- jl bladZakresu
- ret
- ;--------------------------------
- ; etykieta bledu x>255
- bladZakresu:
- mov ah,9
- mov dx,blad2
- int 21h
- jmp koniec
- ;--------------------------------
- ; etykieta konca programu
- koniec:
- mov ax,4C00h
- int 21h
- ;--------------------------------
- ; deklaracja zmiennych
- zmienne:
- ent1 db 13,10,36
- tekst db "Wybierz dostepne dzialanie arytmetyczne: ", 13,10, "+ : dodaj", 13,10, "- : odejmij",13,10, "* : pomnoz",13,10, "/ : podziel", 13,10,36
- wpZmien1 db "Podaj wartosc zmiennej A:",13,10,36
- wpZmien2 db "Podaj wartosc zmiennej B:",13,10,36
- wpWynik db "Wynik wynosi: ", 13,10,36
- blad db "Wprowadzono zly znak, nieodpowiadajacy wskazanym instrukcjom, zakanczam program",13,10,36
- blad2 db "Wartosc wykracza poza skale 8-bitowa, zakanczam program",13,10,36
- ;--------------------------------
- ; etykieta dodawania
- dodawanie:
- call Zmienna_B
- push ax
- push bp
- mov bp,sp
- mov ax,0
- mov ax,[bp+4]
- mov bx,[bp+2]
- add ax,bx
- call sprawdzZakres
- pop bp
- xor cx,cx
- xor di,di
- jmp petla1
- ;--------------------------------
- ; etykieta odejmowania
- odejmowanie:
- call Zmienna_B
- push ax
- push bp
- mov bp,sp
- mov ax,0
- mov ax,[bp+4]
- mov bx,[bp+2]
- sub ax,bx
- call sprawdzZakres
- pop bp
- xor cx,cx
- xor di,di
- jmp petla1
- ;--------------------------------
- ; etykieta mnozenia
- mnozenie:
- call Zmienna_B
- push ax
- push bp
- mov bp,sp
- mov ax,0
- mov ax,[bp+4]
- mov bx,[bp+2]
- mul bl
- call sprawdzZakres
- pop bp
- xor cx,cx
- xor di,di
- jmp petla1
- ;--------------------------------
- ; etykieta dzielenia
- dzielenie:
- call Zmienna_B
- push ax
- push bp
- mov bp,sp
- mov ax,0
- mov ax,[bp+4]
- mov bx,[bp+2]
- div bl
- call sprawdzZakres
- pop bp
- xor cx,cx
- xor di,di
- jmp petla1
- ;--------------------------------
- ; etykieta wypisania wyniku obliczen na ekran
- wypisz:
- mov ah,9
- mov dx,ent1
- int 21h
- mov ah,9
- mov dx,wpWynik
- int 21h
- xor cx,cx
- mov cx,di
- jmp petla2
- ; etykieta petli uzywanej do podzielenia wyniku na pojedyncze cyfry i wrzucenia na stos
- petla1:
- cmp ax, 0
- je wypisz
- xor dx,dx
- mov cx, 10
- div cx
- push dx
- inc di
- jmp petla1
- ; etykieta petli uzywanej do wypisania wyniku ze stosu pojedynczymi cyframi
- petla2:
- xor dx,dx
- pop dx
- mov ax,dx
- add ax,48
- mov ah,2
- mov dx,ax
- int 21h
- loop petla2
- jmp koniec
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement