Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ORG 800H ;Rozpoczęcie programu od 800Hex miejsca w pamięci
- START LXI H,MENU ;Przeniesienie do rejestru HL łancucha znaków z "MENU" -> "Prosty kalkulator"
- RST 3 ;Wyświetlenie znaków z rejestru HL
- ;Wprowadzenie pierwszego operandu
- OP_1 LXI H,NUM_1 ;Załadowanie NUM_1 do HL
- RST 3 ;Wyświetlenie wartości z HL -> "Wprowadz pierw. operand"
- RST 5 ;Zapis wprowadzonych z klawiatury danych do DE
- MOV B,D ;Bedziemy potem wprowadzac jeszcze jeden operand, wiec przenosimy
- MOV C,E ;DE do rejestru BC. BC<-DE
- ;Wprowadzanie znaku operacji
- ZN_OP LXI H,ZNAK ;Załadowanie do HL wartości z "Znak"
- RST 3 ;Wyświetlenie zawrtości HL -> "Wprowadź znak"
- RST 2 ;Załadowanie do akumulatora jednego znaku
- ;SPR_ZN ma na celu sprawdzenie wprowadzonego znaku i skok warunkowy
- ;do odpowiedniego miejsca w kodzie odpowiedzialnego za daną operację
- SPR_ZN CPI 'n' ;Porównanie wartości z akumulatora (A) z wartością hex 'n'
- JZ NEG ;Jeżeli flaga po porównaniu Z=1, to wykona się skok do NEG
- CPI '+' ;Porównanie wartości z akumulatora (A) z wartością hex '+'
- JZ DODW ;Jeżeli flaga po porównaniu Z=1, to wykona się skok do DODW
- CPI '-' ;Porównanie wartości z akumulatora (A) z wartością hex '-'
- JZ ODJA ;Jeżeli flaga po porównaniu Z=1, to wykona się skok do ODJA
- JMP ZN_OP ;Jeżeli żaden warunek nie został spełniony, to skok do wprowadzania znaku op.
- ;DODW - dodawanie dwóch operandów. Na początku pobieramy drugi operand
- ;do rejestru DE (pierwszy operand trzymamy w rejestrze BC)
- ;Po wprowadzeniu operandu zamieniamy miejscami rejestry (..<-..)
- ;Oraz wykonujemy operację dodawania (poprzez instrukcję DAD) wykonywaną
- ;na rejestrach (służy ona generalnie do obliczania adresów, ale można ją
- ;wykorzystać do dodawania). Sprawdzamy czy istnieje przeniesienie, jeśli tak
- ;to wykonujemy skok warunkowy do etykiety PRZENIESIENIE gdzie wypisana zostanie
- ;wartość 1 na wyjście, zanim wypiszemy wynik operacji.
- ;Jeśli nie ma przeniesienia, lub jeśli wróciliśmy z przeniesienia poprzez RET
- ;to wypisujemy na wyjście zawartość rejestru HL. Przenosimy H i L do akumulatora
- ;i wywołujemy przerwanie 4.
- DODW LXI H,NUM_2 ;Pobranie do HL<-NUM_2
- RST 3 ;Wyświetlenie komunikatu o wprowadzeniu drugiego operandu
- RST 5 ;Wprowadzenie z klawiatury wartości drugiego operandu
- LXI H,DODW_T ;Pobranie do HL<-DODW_T
- RST 3 ;Wyświetlanie komunikatu o wyniku
- XCHG ;Zamiana rejestrów
- DAD B ;Dodanie do rejestru HL rejestrów BC
- CC PRZENIESIENIE;Sprawdzenie czy przeniesienie wystąpiło. Jeśli C=1 (carry) to skok do PRZENIESIENIE
- MOV A,H ;Przeniesienie do A<-H
- RST 4 ;Wyświetlenie zawartości akumulatora (liczby)
- MOV A,L ;Przeniesienie do A<-L
- RST 4 ;Wyświetlenie zawartości akumulatora (liczby)
- JMP KONIEC ;Skok do etykiety koniec
- ;PRZENIESIENIE służy do wypisania dodatkowej jedynki przed wynikiem
- ;operacji dodawania, jeżeli wystąpi przeniesienie
- PRZENIESIENIE
- MVI A,1H ;Zapisujemy w akumulatorze wartość 1 hex
- RST 4 ;Wypisujemy liczbe z akumulatora
- RET ;Powracamy do miejsca, gdzie został wywołany skok
- ;ODJA - odejmowanie liczb 16 bitowych. Najpierw wprowadzamy drugi operand
- ;następnie żeby zapobiec błędom ustawiamy się na fladze C i negujemy ją
- ;Dopiero potem, każdy z rejestrów odejmujemy od siebie. Najpierw od C-E
- ;(A<-C i SUB E), i wynik zapisujemy w L (L<-A), następnie od B-D
- ;(A<-B i SBB D) odejmujemy z uwzględnieniem pożyczki. Jeżeli po tej operacji
- ;pożyczka dalej występuje, to musimy zrobić skok do etykiety POŻYCZKA
- ;gdzie dokonamy zamiany miejscami rejestry z operandami (ponieważ domyślnie
- ;wynik ujemny zapisany jest w ZU2, a my chcemy w ZM. Zatem dokonujemy zamiany
- ;wypisujemy na wyjscie minus i wracamy do odejmowania, dopiero wtedy uzyskamy
- ;poprawny wynik
- ODJA LXI H,NUM_2 ;Przeniesienie do HL<-NUM_2
- RST 3 ;Wypisanie tekstu o wprowadzenie drugiego operandu
- RST 5 ;wprowadzanie znakow z klawiatury
- LXI H,ODEJM_T ;Przeniesienie do HL<-ODEJM_T
- RST 3 ;Wyswietlenie tekstu z wynikiem
- ODJM STC ;Ustawienie sie na fladze C
- CMC ;Negacja flagi C
- MOV A,C ;Przeniesienie A<-C w celu odejmowania
- SUB E ;Odejmowanie od A wartosci z E
- MOV L,A ;Wynik operacji SUB przenosimy do L
- MOV A,B ;Do a wprowadzamy druga czesc operandu (A<-B)
- SBB D ;Odejmujemy od A rejestr D z uwzglednieniem pozyczki z poprzedniej operacji
- MOV H,A ;Przenosimy wynik do rejestru H
- JC POZYCZKA ;Sprawdzamy, czy po drugiej operacji dalej wystepuje pozyczka, jesli tak to skok
- MOV A,H ;Przenosimy H do A (A<-H)
- RST 4 ;Wyswietlamy wartosc
- MOV A,L ;Przenosimy L do A(A<-L)
- RST 4 ;Wyswietlamy wartosc
- JMP KONIEC ;Skok do zakonczenia programu
- POZYCZKA MOV H,B ;HL<-BC
- MOV L,C ;
- MOV B,D ;BC<-DE
- MOV C,E ;
- XCHG ;DE<-HL(wartosc z BC)
- MVI A,'-' ;Zapis '-' do akumulatora
- RST 1 ;wypisanie minusa na wyjscie
- JMP ODJM ;powrót do odejmowania w celu ponownego wykonania operacji
- ;NEG - operacja negacji, przenosimy do akumulatora najpierw B, potem C
- ;i negujemy operacją CMA, kazdorazowo wyswietlając wynik na ekran
- NEG LXI H,NEG_T ;Przeniesienie do HL<-NEG_T
- RST 3 ;Wyswietlenie komunikatu o wyniku negacji
- MOV A,B ;przeniesienie do A<-B
- CMA ;Wykonanie negacji na zawratości akumulatora
- RST 4 ;Wyświetlenie zawartości akumulatora na wyjscie
- MOV A,C ;A<-C
- CMA ;negacja A
- RST 4 ;wyswietlenie na wyjscie
- JMP KONIEC ;koniec
- ;Wyswietla komunikat i konczy program
- KONIEC LXI H,INFO
- RST 3
- HLT
- ;10,13 - skok do nowej linii i powrot karetki
- ;@ - koniec łancucha znaków
- MENU DB 10,13,'Prosty kalkulator','@'
- NUM_1 DB 10,13,'Wprowadz pierw. operand > ','@'
- ZNAK DB 10,13,'Wprowadz znak operacji > ','@'
- NUM_2 DB 10,13,'Wprowadz drugi operand > ','@'
- INFO DB 10,13,'Koniec programu','@'
- NEG_T DB 10,13,'Wynik negacji > ','@'
- DODW_T DB 10,13,'Wynik dodawania > ','@'
- ODEJM_T DB 10,13,'Wynik odejmowania > ','@'
- Kody restartów
- RST 0 - Start systemu
- RST 1 - Wydruk ZNAKU z A na monitor
- RST 2 - Wczytanie ZNAKU do A
- RST 3 - Wydruk łańcucha z [HL] do '@'
- RST 4 - Wydruk dwóch ZNAKÓW HEX z A
- RST 5 - Wczytanie CZTERECH ZNAKÓW HEX do pary rejestrów DE
- RST 6 - Wydruk zawartości rejestrów
- --------------------------------------------------
- | BEZ KOMENTARZY |
- --------------------------------------------------
- ORG 800H
- START LXI H,MENU
- RST 3
- OP_1 LXI H,NUM_1
- RST 3
- RST 5
- MOV B,D
- MOV C,E
- ZN_OP LXI H,ZNAK
- RST 3
- RST 2
- SPR_ZN CPI 'n'
- JZ NEG
- CPI '+'
- JZ DODW
- CPI '-'
- JZ ODJA
- JMP ZN_OP
- DODW LXI H,NUM_2
- RST 3
- RST 5
- LXI H,DODW_T
- RST 3
- XCHG
- DAD B
- CC PRZENIESIENIE
- MOV A,H
- RST 4
- MOV A,L
- RST 4
- JMP KONIEC
- PRZENIESIENIE
- MVI A,1H
- RST 4
- RET
- RET
- ODJA LXI H,NUM_2
- RST 3
- RST 5
- LXI H,ODEJM_T
- RST 3
- ODJM STC
- CMC
- MOV A,C
- SUB E
- MOV L,A
- MOV A,B
- SBB D
- MOV H,A
- JC POZYCZKA
- MOV A,H
- RST 4
- MOV A,L
- RST 4
- JMP KONIEC
- POZYCZKA MOV H,B
- MOV L,C
- MOV B,D
- MOV C,E
- XCHG
- MVI A,'-'
- RST 1
- JMP ODJM
- NEG LXI H,NEG_T
- RST 3
- MOV A,B
- CMA
- RST 4
- MOV A,C
- CMA
- RST 4
- JMP KONIEC
- KONIEC LXI H,INFO
- RST 3
- HLT
- MENU DB 10,13,'Prosty kalkulator','@'
- NUM_1 DB 10,13,'Wprowadz pierw. operand > ','@'
- ZNAK DB 10,13,'Wprowadz znak operacji > ','@'
- NUM_2 DB 10,13,'Wprowadz drugi operand > ','@'
- INFO DB 10,13,'Koniec programu','@'
- NEG_T DB 10,13,'Wynik negacji > ','@'
- DODW_T DB 10,13,'Wynik dodawania > ','@'
- ODEJM_T DB 10,13,'Wynik odejmowania > ','@'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement