Politechnika Lubelska |
Laboratorium podstaw systemów mikroprocesorowych |
||
w Lublinie |
Ćwiczenie nr 3 |
||
Józwik Tomasz Krzysztof Kadłubowski |
Semestr V |
Grupa ED 5.3 |
Rok akademicki 1997/98 |
Temat ćwiczenia: Operacje arytmetyczne |
Data wykonania 7.11.97 |
Ocena: |
Cel ćwiczenia : Zapoznanie się z podstawowymi operacjami arytmetycznymi
wykorzystywanymi w systemie DSM51.
Modyfikacja programu dodawania liczb zapisanych w kodzie uzupełnienia do 2.
;************************************************
;LEKCJA 3B - PROSTE OPERACJE ARYTMETYCZNE
;PRZYKťAD 1 - LICZBY UJEMNE U2
;************************************************
LJMP START
ORG 100H
START:
LCALL LCD_CLR
CLR A ; zerowanie akumulatora
CLR C ; zerowanie flagi C
LCALL WAIT_KEY ; pobierz liczbę z klawiatury
MOV R0,A ; zapamiętaj w R0
MOV A,#10 ; zapisz do akumulatora liczbę 10
XCH A,R0 ; zamień argumenty A i R0
CLR C ; wyzeruj flagę C
SUBB A,R0 ; odejmij liczbę 10 od akumulatora
LCALL WRITE_HEX ; wyświetl wynik w postaci HEX
SJMP $
Program powyższy dodaje liczbę -10 do liczby pobranej z klawiatury, wynik wyświetlany jest w postaci szesnastkowej.
Ograniczenia stosowania U2 to przede wszystkim to że liczby zapisane w jednym bajcie mogą być z zakresu -128...+127 . Ograniczeniem jest również możliwość tylko dodawania i odejmowania liczb w tej postaci. Jeśli wynik dodawania przekracza zakres -128...+127 to ósmy bit ustawiany jest na 1 co w kodzie U2 oznacza że mamy do czynienia z liczbą ujemną co jest błędem . By ustrzec się takich błędów istnieje w mikrokontrolerze specjalna flaga przepełnienia OV, która sygnalizuje wystąpienie tego typu procesów i którą należy kontrolować po każdej operacji odejmowania bądź dodawania.
Modyfikacja programu sumowania liczb w postaci BCD tak by program dokonywał mnożenia liczb w postaci BCD a powtarzające się sekwencje instrukcji umieszczone zostały w podprogramach.
;************************************************
; PROSTE OPERACJE ARYTMETYCZNE
; MNOŻENIE BCD
;************************************************
LJMP START
ORG 100H
START:
LCALL LCD_CLR
LCALL WAIT_KEY ; pobierz pierwszy czynnik
MOV R0,A ; zapisz w R0
ACALL HEX_BCD
MOV A,#'*'
LCALL WRITE_DATA ; wyświetl jako znak
LCALL WAIT_KEY ; pobierz drugi czynnik
MOV R1,A ; zapamiętaj w R1
ACALL HEX_BCD
MOV A,#'='
LCALL WRITE_DATA ; wyświetl jako znak
MOV A,R0 ; pierwszy czynnik do A
MOV B,R1 ; drugi czynnik do B
MUL AB ; wymnożenie A*B
XCH A,B ; zamiana A i B
LCALL WRITE_HEX ; wypisz starszą część wyniku na LCD
MOV A,B ; zapisz młodszą część do A
LCALL WRITE_HEX ; wypisz młodszą część wyniku na LCD
SJMP $
; Podprogram zamieniający liczby z postaci HEX na BCD
HEX_BCD:
MOV B,#100 ; liczba 100 do B
DIV A,B ; dzielenie liczby w A przez 100
JZ SKOK ; skocz jeśli nie ma setek
LCALL WRITE_HEX ; wypisz jeśli są w postaci BCD
SKOK:
MOV A,B ; reszta z dzielenia do A
MOV B,#10 ; liczba 10 do B
DIV AB ; podziel A przez 10
SWAP A ; zamień młodszą część bajtu ze starszym
ORL A,B ; dodaj dziesiątki i jednostki
LCALL WRITE_HEX ; wypisz dziesiątki i jednostki na LCD
RET
Powyższy program mnoży dwie liczby pobrane z klawiatury, wypisuje całe działanie na LCD - mnożna i mnożnik w postaci BCD, wynik w postaci szesnastkowej niestety.
Podprogram dokonujący zamiany liczby w formacie spakowane BCD znajdującej się w rejestrze R0 na postać binarną.
BCD_BIN:
MOV A,R0 ; zapisanie liczby do akumulatora
ANL A,#11110000b ; wyzerowanie młodszej cz. bajtu
SWAP A ; zamiana części bajtu
MOV B,#10
MUL AB ; wymnożenie pierwszej liczby przez 10
XCH A,B ; przechowanie wyniku w B
MOV A,R0 ; ponowne zapisanie liczby do acc.
ANL A,#00001111b ; wyzerowanie starszej części bajtu
ADD A,B ; dodanie obu wyników
MOV R0,A ; zapisanie ponownie do R0
RET