Politechnika Lubelska |
Laboratorium podstaw systemów mikroprocesorowych |
||
w Lublinie |
Ćwiczenie nr 3b |
||
Wykonał: Lasota Wojciech
|
Semestr: V |
Grupa: ED 5.1 |
Rok akademicki: 1999/2000 |
Temat ćwiczenia: Podstawowe operacje arytmetyczne |
Data wykonania:
|
Ocena: |
Cel ćwiczenia:
Celem ćwiczenia było zapoznanie się z ze sposobami wykonywania podstawowych operacji arytmetycznych i konwersja formatów stosowanych w mikroprocesorach rodziny 8051 stosowanych w systemie DSM-51.
ZADANIE Nr.1
Poniżej przedstawiony został program którego zadaniem było dodawanie liczb zapisanych w kodzie uzupełnienia do 2:
Listing programu:
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 $
Naszym zadaniem było takie zmodyfikowanie powyższego programu aby dodawał on liczbę -10 do wartości którą pobierał z klawiatury.
Po modyfikacji:
LJMP START
ORG 100H
START:
LCALL LCD_CLR
LOOP:
CLR A ;zeruj A
CLR C ;zeruj C
SUBB A,#10 ;A <- 0-10 = -1
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
Po wprowadzonej zmianie program zapisywał do akumulatora wartość -10 przez odjęcie liczby
10 od 0 . Po zachowaniu tej liczby w rejestrze R0 dodawał ją do drugiej liczby pobranej z
klawiatury.
Ponieważ instrukcja SUBB używała wskażnika bitu C musiał on być zerowany .W przypadku nie
zerowania wskażnika C wynik odejmowania był błędny.
Liczby ujemne podobnie jak liczby dodatnie można zapisywać w postaci uzupełnienia do 2 .
Jednak przez zastosowanie takiego zapisu powoduje dwukrotne zmniejszenie zakresu używanych
liczb. Aby nie popełnić błędu w programowaniu należy pamiętać o tym w jakiej postaci dane są
zapisywane. Wiąże się to z interpretacją danego zapisu przez komputer.
ZADANIE Nr.2
W zadaniu tym analizowaliśmy program służący do sumowania liczb w postaci BCD.
Listing programu:
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 $
Podczas wykonywania programu w akumulatorze pojawia się wynik dzielenia, a w rejestrze B reszta z dzielenia ( instrukcja DIV) .Dla liczb 0-9 będzie to 0 w ACC, a w B wpisana liczba.
Naszym zadaniem była taka modyfikacja programu aby mnożył on liczby w postaci BCD.
Listing programu:
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
Program pobiera obydwa czynniki z klawiatury i zamienia je na kod BCD za pomocą podprogramu TOBCD. Struktura tego podprogramu jest taka sam jak część kodu z poprzedniego przykładu.
Obydwa czynniki są zapamiętywane w rejestrach, a na końcu wykonuje się ich mnożenie. Następnie dokonywana jest zmiana na BCD. Ponieważ nie można zapisać liczby dwucyfrowej na jednym półbajcie program działa tylko dla liczb w zakresie 0-9 .
ZADANIE Nr.3
Poniższy listing przedstawia 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
Program pobiera daną w postaci BCD , wydziela z niej starszą cyfrę i sprawdza czy jest ona różna od 0. Jeżeli warunek jest spełniony to dodaje do siebie tyle razy liczbę 10 ile wynosi starsza cyfra danej wejściowej . Jeżeli starsza cyfra jest zerem to program zajmuje się tylko młodsza cyfrą i zapisuje ją do komórki BIN w postaci wyniku.