POLITECHNIKA LUBELSKA
KATEDRA ELEKTRONIKI
LABORATORIUM PODSTAW SYSTEMÓW MIKROPROCESOROWYCH
SPRAWOZDANIE Z ĆWICZENIA NR. 3B
„OPERACJE ARYTMETYCZNE.”
Wykonali: Remigiusz Gwiazda ED 5.4
Paweł Luty ED 5.4
Cel ćwiczenia:
Celem ćwiczenia było zapoznanie się z ze sposobami wykonywania podstawowych operacji arytmetycznych oraz konwersji formatów stosowanych w mikroprocesorach rodziny 8051.
Zadanie 1.
W zadaniu został uruchomiony program dodający liczby zapisane w kodzie U2:
LJMP START
ORG 100H
START: LCALL LCD_CLR
CLR A
CLR C
SUBB A,#1
MOV R0,A
LCALL WRITE_HEX
MOV A,R0
ADD A,#1
LCALL WRITE_HEX
SJMP $
a) Modyfikacja powyższego programu polegająca na tym, że dodaje on liczbę -10 do wartośći pobranej z klawiatury:
LJMP START
ORG 100H
START:
LCALL LCD_CLR
LOOP:
CLR A ;zeruj A
CLR C ;zeruj C
SUBB A,#10 ;A <- 0-10 = -10
MOV R0,A ;zapamiętaj w R0
LCALL WAIT_KEY
ADD A,R0 ;dodaj liczbę z klawiatury do -10
LCALL WRITE_HEX ;wyświetl wynik
LJMP LOOP
Powyższy program najpierw zapisuje do akumulatora liczbe -10 poprzez odjecie liczby 10 od 0, a następnie po zachowaniu tej liczby w R0 dodaje ją do drugiej liczby pobranej z klawiatury. Wskaźnik C jest zerowany ponieważ instrukcja SUBB używa tego wskaźnika i gdyby był ustawiony to wynik odejmowania byłby zły.
b) Reprezentacja danych w postaci U2 umożliwia co prawda zapisywanie liczb ujemnych , ale ma swoje wady. Mianowicie poprzez zastosowanie tego zapisu zakres używanych liczb zmniejsza się dwukrotnie, np. jeżeli w naturalnym kodzie binarnym można zapisać na jednym bajcie liczbę z zakresu 0-255, to w kodzie U2 można zapisać liczbę z zakresu -128-127. Aby więc nie popełnić błędu podczas programowania należy pamiętać w jakiej postaci dane są zapisane tzn. jak ma traktować je dany program.
Zadanie 2.
Przeanalizowany został następujący program sumujący liczby w postaci BCD:
LJMP START
ORG 100H
START: LCALL LCD_CLR
LCALL WAIT_KEY
MOV B,#10
DIV AB
SWAP A
ADD A,B
MOV R0,A
LCALL WRITE_HEX
MOV A,#'+'
LCALL WRITE_DATA
LCALL WAIT_KEY
MOV B,#10
DIV AB
SWAP A
ADD A,B
MOV R1,A
LCALL WRITE_HEX
MOV A,#'=`
LCALL WRITE_DATA
MOV A,R0
ADD A,R1
DA A
LCALL WRITE_HEX
SJMP $
a) Podczas wykonywania programu rejestry po wykonywaniu instrukcji DIV w akumulatorze pojawia się wynik dzielenia ,a w rejestrze B reszta z dzielenia. Dla liczb 0-9 zawsze więc będzie to 0 w ACC, a w B wpisana liczba.Pozostałe instrukcje modyfikuja obydwa rejestry w sposób nie wymagający komentarza.
b) Modyfikacja programu polegająca na tym ,że program mnoży liczby w postaci BCD:
LJMP START
ORG 100H
START:
LCALL LCD_CLR
LCALL WAIT_KEY ;pobierz pierwszy czynnik
ACALL TOBCD ;zamień na BCD
MOV R0,A ;zapamiętaj w R0 (BCD)
LCALL WRITE_HEX ;wypisz na LCD
MOV A,#'*' ;znak mnożenia
LCALL WRITE_DATA ;wyświetl jako znak
LCALL WAIT_KEY ;pobierz drugi czynnik
ACALL TOBCD :zamień na BCD
MOV R1,A ;zapamiętaj w R1 (BCD)
LCALL WRITE_HEX ;wypisz na LCD
MOV A,#'=' ;znak równości
LCALL WRITE_DATA ;wyświetl jako znak
MOV A,R0 ;pierwszy czynnik do A
MOV B,R1 ;dodaj drugi czynnik
MUL AB ;mnóż
ACALL TOBCD ;zamień na BCD
LCALL WRITE_HEX ;wypisz wynik na LCD
LCALL WAIT_KEY
LJMP START
TOBCD: ;podprogram zamiany na BCD
MOV B,#10
DIV AB
SWAP A
ADD A,B
RET
Powyższ program działa w sposób bardzo podobny do poprzedniego przykładu. Pobiera obydwa czynniki z klawiatury i od razu zamienia je na kod BCD za pomocą podprogramu TOBCD. Podprogram ten ma strukturę taką samą jak część kodu w poprzednim przykładzie. W miedzyczasie obydwa czynniki są zapamiętywane w rejestrach, a na końcu wykonuje się ich mnożenie po czym znów zamienia się na BCD. Program działa tylko dla liczb 0-9 co jest zrozumiałe ,gdyż nie można zapisać w postaci BCD dwucyfrowej liczby na jednym półbajcie.
Zadanie 3.
Program dokonujący konwersji z BCD do BIN:
BCD EQU 20H ; komórka zawierająca daną w kodzie BCD
BIN EQU 21H ; komórka zawierająca daną w kodzie NB (wynik wykonania
; programu)
LJMP START
ORG 100H
START: LCALL LCD_CLR
MOV BCD,#00111001B ; przykładowo konwersja będzie dokonana na liczbie 39
MOV A,BCD
LCALL WRITE_HEX
MOV R0,#BCD ; do R0 adres komórki z daną wejsciową
MOV R1,#BIN ; do R1 adres komórki z daną wyjsciową
ACALL BCD2BIN ; zamień na postać binarną
MOV A,#'='
LCALL WRITE_DATA
MOV A,BIN
LCALL WRITE_HEX
SJMP $
BCD2BIN:
MOV @R1,#0 ; wyczyść komórkę BIN
MOV A,@R0 ; BCD do ACC
SWAP A ; zamień połówki
ANL A,#0FH ; wyzeruj mniej znaczącą cyfrę
JZ BCD2BIN1 ; jeśli starsza cyfra jest zerem to skocz dalej
MOV R2,A ; w R2 ilość powtórzeń
CLR C
BCD2BIN2:
MOV A,@R1 ; BIN do ACC
ADDC A,#10
MOV @R1,A ; wynik do BIN
DJNZ R2,BCD2BIN2 ; dodawaj 10 tyle razy ,ile wynosi starsza cyfra
BCD2BIN1:
MOV A,@R0 ;BCD do ACC
ANL A,#0FH ; wyzeruj starszą cyfrę
ADD A,@R1 ; dodaj do BIN
MOV @R1,A ; wynik do BIN
RET
Zasada działania programu jest bardzo prosta. Program pobiera daną w postaci BCD , a następnie wydziela z niej starszą cyfrę i sprawdza czy jest ona różna od 0. Jeśli tak to dodaje do siebie tyle razy liczbę 10 ile wynosi starsza cyfra danej wejściowej . Natomiast jeśli starsza cyfra jest zerem to program bezpośrednio zajmuje się tylko młodsza cyfrą i zapisuje ją do komórki BIN jako wynik.