POLITECHNIKA LUBELSKA
Wydział Elektryczny
Grupa laboratoryjna: Rok akademicki:
1. Mazurek Michał 1999/2000
2. Popiołek Aleksander
ED 5.5
Data wykonania ćwiczenia:
1999-10-22
Laboratorium Podstaw Techniki
Mikroprocesorowej
Ćwiczenie nr 3
Temat:
Pamięć wewnętrzna RAM. Organizacja i
wykorzystanie stosu.
Ocena:
..............
ZADANIE 1.
W zadaniu tym należało dokonać operacji adresowania akumulatora:
*********************************
Przykład 3.1 - Pamięć wewnętrzna RAM
- Akumulator
*********************************
LJMP START
ORG 100H
START:
LCALL LCD_CLR ; wyczyść wyświetlacz LCD
MOV A,#10H ; wpisz liczbę do A
LCALL WRITE_HEX ;podprogram systemu DSM-51
; liczba z akumulatora na wyświetlacz LCD
MOV ACC,#20H ;wpisz liczbę do ACC
LCALL WRITE_HEX ;akumulator na LCD
LJMP $
spisując jednocześnie - przy zastosowaniu pracy krokowej przy użyciu komputera - zawartość rejestru PSW oraz stan na wyświetlaczu LCD:
Bit |
PSW.7 |
PSW.6 |
PSW.5 |
PSW.4 |
PSW.3 |
PSW.2 |
PSW.1 |
PSW.0 |
LCD |
Flaga |
CY |
AC |
FO |
RS1 |
RS0 |
OV |
- |
P |
- |
LCALL |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
MOV |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
- |
LCALL |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
MOV |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
10 |
LCALL |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1020 |
ZADANIE 2.
W celu bezpośredniego zaadresowania wybranych bitów akumulatora, np.0 i 2, modyfikujemy program z zadania nr 1:
*********************************
Przykład 3.1a - Pamięć wewnętrzna RAM
- Akumulator
*********************************
LJMP START
ORG 100H
START:
LCALL LCD_CLR ; wyczyść wyświetlacz LCD
MOV A,#30H ; wpisz liczbę do A
SETB ACC.0 ; ustaw bit 0 akumulatora
SETB ACC.2 ; ustaw bit 2 akumulatora
LCALL WRITE_HEX ;podprogram systemu DSM-51
; liczba z akumulatora na wyświetlacz LCD
LJMP $
Tabela przedstawiająca stan rejestru PSW oraz stan wyświetlacza LCD:
Bit |
PSW.7 |
PSW.6 |
PSW.5 |
PSW.4 |
PSW.3 |
PSW.2 |
PSW.1 |
PSW.0 |
LCD |
Flaga |
CY |
AC |
FO |
RS1 |
RS0 |
OV |
- |
P |
- |
LCALL |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
MOV |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
SETB |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
SETB |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
LCALL |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
35 |
ZADANIE 3.
W jaki sposób rozróżnia się adres akumulatora od adresu poszczególnych bitów?
Aby zaadresować poszczególne bity akumulatora, stosujemy rozkaz SETB. Rozkaz ten dotyczy pojedynczego bitu i dlatego po podaniu nazwy rejestru, tzn. ACC, dodajemy jeszcze po kropce rozszerzenie, o który bit komórki nam chodzi .Rozkaz przyjmuje wtedy postać : SETB ACC. X gdzie X-numer bitu któremu chcemy nadać wartość logiczną 1.Odwołując się do akumulatora stosujemy inne komendy, które zmieniają wartość odpowiednich bitów akumulatora.
ZADANIE 4.
Wykonujemy przykład 3.3
***************************************
Przykład 3.3 - PAMIĘĆ WEWNĘTRZNA RAM
- REJAESTRY R0...R7
****************************************
B0R7 EQU 7 ; rejestr R7 z banku 0
B1R7 EQU 8+7 ; rejestr R7 z banku 1
B2R7 EQU 10H+7 ; rejestr R7 z banku 2
B3R7 EQU 18H+7 ; rejestr R7 z banku 3
LJMP START
ORG 100H
START:
MOV B0R7,#0 ; wpisz numer banku
MOV B1R7,#1 ; do rejestru R7
MOV B2R7,#2
MOV B3R7,#3
LCALL LCD_CLR ; wyczyść wyświetlacz LCD
; bank 0
MOV A,R7 ; a<-R7 = 0
LCALL WRITE_HEX ; akumulator na wyświetlacz
SETB RS0 ; bank 1
MOV A,R7 ; A<-R7 = 1
LCALL WRITE_HEX
SETB RS1 ; bank 3
MOV A,R7 ; A<-R7 = 3
LCALL WRITE_HEX
CLR RS0 ; bank 2
MOV A,R7 ; A<-R7 = 2
LCALL WRITE_HEX
LJMP $
Stosując pracę krokową spisujemy zawartość akumulatora, rejestru PSW oraz stan wyświetlacza LCD na przykładzie rejestru R7 w bankach 0,1,2,3.
Bit |
PSW.7 |
PSW.6 |
PSW.5 |
PSW.4 |
PSW.3 |
PSW.2 |
PSW.1 |
PSW.0 |
LCD |
A |
Flaga |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
- |
P |
- |
- |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
00 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
21 |
MOV |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
00 |
LCALL |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
00 |
21 |
SETB |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
00 |
21 |
MOV |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
00 |
01 |
LCALL |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0001 |
19 |
SETB |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0001 |
19 |
MOV |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0001 |
03 |
LCALL |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
000103 |
FF |
CLR |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
000103 |
FF |
MOV |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
000103 |
02 |
LCALL |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
00010302 |
FF |
Wpisujemy zawartość rejestrów R7 w poszczególnych bankach.
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Bank 0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Bank 1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Bank 2 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
Bank 3 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
ZADANIE 5.
Modyfikując przykład z zadania nr5 należało zapełniamy zawartością EEH wybraną przestrzeń adresową, np. od 40H do 48H - wykorzystując adresowanie pośrednie.
LJMP START
ORG 100 H
START :
MOV R0, # 40 H ;do R0 wpisz liczbę 40H
;która będzie adresem
MOV R2, # 9 ;do R2 wpisz liczbę 9
;która będzie licznikiem
;pętli
LOOP : ;zapisz wartość EEH w 9
;komórkach pamięci
;począwszy od adresu
;40H do 48H
@R0, # EE H ;wpisz liczbę EEH pod
;adres umieszczony w R0
INC R0 ;zwiększ adres
DJNZ R2, LOOP ;powtórz zapis zgodnie z
;licznikiem pętli - 9 razy
SJMP $
ZADANIE 6.
Stosując adresowanie bitowe ustawiamy zawartość komórki 21 na 3H i wyświetlamy ją na wyświetlaczu LCD:
LJMP START
ORG 100 H
START :
LCALL LCD_CLR
MOV 21H,#0
MOV A,21H
LCALL WRITE_HEX
SETB 21 H.0
SETB 21 H.1
MOV A, 21 H
LCALL WRITE_HEX
LJMP $
ZADANIE 7.
Wykonujemy przykład 5.1 odczytując jednocześnie zawartość akumulatora, rejestru PSW, wskaźnika stosu oraz zawartość komórek stosu.
;************************************************
;LEKCJA 5 - STOS
;PRZYKŁAD 1 - PAMIĘĆ PODRĘCZNA
;************************************************
LJMP START
ORG 100H
START:
LCALL LCD_CLR
MOV A,#'D' ;wpisz do A kod litery D
PUSH ACC ;przechowaj akumulator
;na stosie
LCALL WRITE_DATA ;wyświetl jako znak
;czyli litera D
MOV A,#'=' ;wpisz znak równości
LCALL WRITE_DATA
POP ACC ;pobierz wartość ze stosu
;do akumulatora
LCALL WRITE_HEX ;wyświetl jako liczbę
;- kod litery D = 44H
SJMP $
|
ACC |
PSW |
SP |
STOS |
|
00 |
00 |
07 |
|
LCALL |
21 |
00 |
07 |
03 |
MOV |
44 |
00 |
07 |
05 |
PUSH ACC |
44 |
00 |
08 |
44 |
LCALL |
21 |
80 |
08 |
44 |
MOV |
3D |
81 |
08 |
44 |
LCALL |
21 |
80 |
08 |
44 |
POP ACC |
44 |
80 |
07 |
11 |
LCALL |
21 |
80 |
|
|
ZADANIE 8.
Postępujemy podobnie jak wyżej posługując się przykładem 5.2:
|
ACC |
PSW |
SP |
STOS |
|
00 |
00 |
07 |
00 |
LCALL |
21 |
00 |
07 |
00 |
MOV A,#137 |
89 |
01 |
07 |
00 |
ACALL |
89 |
01 |
09 |
|
PUSH PSW |
89 |
01 |
0A |
01 |
PUSH B |
89 |
01 |
0B |
00 |
PUSH ACC |
89 |
01 |
0C |
89 |
ACALL |
89 |
01 |
0E |
89 |
MOV B, # 64 |
89 |
01 |
0E |
89 |
DIV A,B |
01 |
01 |
0E |
89 |
PUSH ACC |
01 |
01 |
0F |
01 |
MOV A,B |
25 |
01 |
0F |
01 |
MOV B, # 0A H |
25 |
00 |
0F |
01 |
DIV A,B |
03 |
00 |
0F |
01 |
SWAP A |
30 |
01 |
0F |
01 |
ORL A,B |
37 |
01 |
0F |
01 |
POP B |
37 |
01 |
0E |
89 |
RET |
37 |
01 |
0C |
89 |
XCH A,B |
01 |
01 |
0C |
89 |
LCALL |
21 |
80 |
0C |
89 |
MOV A,B |
37 |
81 |
0C |
89 |
LCALL |
21 |
80 |
0C |
89 |
MOV A,3D H |
3D |
81 |
0C |
89 |
LCALL |
21 |
80 |
0C |
89 |
POP ACC |
89 |
81 |
0B |
00 |
PUSH ACC |
89 |
81 |
0C |
89 |
LCALL |
21 |
80 |
0C |
89 |
MOV A, # 48 |
48 |
80 |
0C |
89 |
LCALL |
21 |
80 |
0C |
89 |
POP ACC |
89 |
81 |
0B |
00 |
POP PSW |
89 |
81 |
0A |
01 |
RET |
89 |
01 |
09 |
00 |
SJMP |
89 |
01 |
07 |
00 |
1