5009


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.



Wyszukiwarka

Podobne podstrony:
M 5009 Jacket with shawl collar and decorative trimming
5009
5009
5009
5009
praca-licencjacka-b7-5009, Dokumenty(8)
5009
5009
5009
L 5009 Jacket with shawl collar and decorative trimming
5009

więcej podobnych podstron