Laboratorium Podstaw Systemów Mikroprocesorowych
Nazwisko i imię wykonawców: Wiesław Rycerz, Tomasz Sugier
|
Symbol grupy ED. 5.4 |
||||||
Data wyk. Ćwiczenia 1997-10-27 |
Symbol ćwiczenia 3b |
Temat zadania Operacje arytmetyczne. |
|||||
|
ZALICZENIE |
|
|
Ocena |
Data |
Podpis |
|
1. Cel ćwiczenia.
Celem ćwiczenia jest zapoznanie się ze sposobem wykonywania podstawowych operacji arytmetycznych na liczbach jednobajtowych oraz metod konwersji formatów stosowanych do reprezentacji danych.
2. Wykonanie ćwiczenia:
1) Dodawanie liczb zapisanych w kodzie U2.
Analizowany program:
***************************************************************
;LEKCJA 3b - OPERACJE ARYTMETYCZNE
;PRZYKŁAD 1 - LICZBY UJEMNE U2
LJMP START
ORG 100H
START:
LCALL LCD_CLR
CLR A ;zeruj A
CLR C ;zeruj C
SUBB A,#1 ;A <- 0-1 = -1
MOV R0,A ;zapamiętaj w R0
LCALL WRITE_HEX
MOV A,R0 ;A <- R0=-1
ADD A,#1 ;A <- A+1 = -1+1 = 0
LCALL WRITE_HEX
SJMP $
***************************************************************************
Program zmodyfikowany:
***************************************************************************
START:
CLR A ;zeruj A
CLR C ;zeruj C
SUBB A,#0AH ;A <- 0-10 = -10
MOV R1,A ;zapamiętaj w R1
LCALL WRITE_HEX
LCALL WAIT_KEY ;wczytaj z klawiatury
ADD A,R1 ;A <- A+10 =-10+key
LCALL WRITE_HEX
SJMP $
***************************************************************************
Schemat blokowy algorytmu:
Wprowadź do rejestru R1
z ACC (-10)
Wczytaj liczbę z klawiatury
Dodaj do tej liczby
wartość z R1
Wynik wyprowadź na LCD
Dodawanie liczb w postaci BCD
***************************************************************************
;LEKCJA 3b - OPERACJE ARYTMETYCZNE
;PRZYKŁAD 2 - SUMOWANIE LICZB W FORMACIE BCD
LJMP START
ORG 100H
START:
LCALL LCD_CLR
LCALL WAIT_KEY ;pobierz pierwszy czynnik
MOV B,#10 ;zamień liczbę na BCD
DIV AB ;dzieląc przez 10
SWAP A
ADD A,B
MOV R0,A ;zapamiętaj w R0 (BCD)
LCALL WRITE_HEX ;wypisz na LCD
MOV A,#'+' ;znak sumy
LCALL WRITE_DATA ;wyświetl jako znak
LCALL WAIT_KEY ;pobierz drugi czynnik
MOV B,#10 ;zamień liczbą na BCD
DIV AB ;dzieląc przez 10
SWAP A
ADD A,B
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
ADD A,R1 ;dodaj drugi czynnik
DA A ;poprawka dodawania
;liczb BCD
LCALL WRITE_HEX ;wypisz wynik na LCD
SJMP $
***************************************************************************
Samodzielne opracowanie programu.
Program ma za zadanie konwertować liczby zapisane w formacie spakowanym BCD na postać binarną.
Listing programu:
***************************************************************************
; ZAMIANA BCD-BIN
LJMP START
ORG 100H
START:
LCALL LCD_CLR
CLR A
CLR C
MOV A,#114 ;WPROWADŹ LICZBĘ 72DEC = 0111 0010BCD
MOV R0,A ;R0<-R0=A=72
MOV B,#10H ;
DIV AB ;OBLICZA CYFRĘ DZIESIĄTEK
MOV B,#10 ;DO B WPROWADŹ 10 DEC
MUL AB ;OBLICZA LICZBĘ DZIESIĄTEK
MOV R1,A ;R1<-R1=A=70
MOV A,R0
SWAP A ;WYZNACZAMY
MOV B,#10H ;CYFRĘ JEDNOŚCI
DIV AB
ADD A,R1 ;DODAJEMY LICZBE DZIESIĘTNĄ DO JEDNOŚCI
LCALL WRITE_HEX ;WYPROWADŹ NA LCD W POSTACI HEX.
SJMP $
***************************************************************************
Schemat blokowy programu:
Wprowadzamy liczbę 72
w postaci spakowanego BCD
Przeliczanie liczby dziesiątek
Przeliczanie liczby jedności
Zestawienie cyfry jedności
z cyfrą dziesiątek
poprzez zsumowanie ich
wartości
4). Mnożenie.
***************************************************************************
;LEKCJA 3b - OPERACJE ARYTMETYCZNE
; MNOŻENIE
LJMP START
ORG 100H
START:
LCALL LCD_CLR
LCALL WAIT_KEY ;pobierz pierwszy czynnik
MOV B,#10 ;zamień liczbę na BCD
DIV AB ;dzieląc przez 10
SWAP A
ADD A,B
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
MOV B,#10 ;zamień liczbą na BCD
DIV AB ;dzieląc przez 10
SWAP A
ADD A,B
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 ;mnożenia A*B
;starsza część wyniku w B
;młodsza część wyniku w A
XCX A,B
LCALL WRITE_HEX ;wypisz starszą część
MOV A,B ;pobierz młodszą część
LCALL WRITE_HEX ;wypisz młodszą część
SJMP $
***************************************************************************
3. Wnioski.
Rozkazy mnożenia i dzielenia są prawidłowo wykonywane tylko dla liczb binarnych. Użycie tych rozkazów dla liczb w kodzie uzupełnienia do 2 lub w BCD daje błędne wyniki.
Podsumowując, należy zauważyć, że mikrokontroler pozwala na bezpośrednią realizację następujących działań na liczbach jednobajtowych:
przy liczbach 0..255:
dodawanie ADD, ADDC,
odejmowanie SUBB,
mnożenie MUL,
dzielenie DIV,
przy liczbach -128..127 w kodzie U2;
dodawanie ADD, ADDC,
- odejmowanie SUBB,
przy liczbach 0.. 99 w kodzie BCD:
- dodawanie ADD, ADDC + rozkaz korekcji dziesiętnej DAA.