Politechnika Lubelska w Lublinie |
Laboratorium Techniki Mikroprocesorowej |
||||
|
Ćwiczenie Nr 3 |
||||
Nazwisko: Mitura Niegowski
|
Imię: Marek Mirosław |
Semestr V |
Grupa ED 5.5 |
Rok akad. 1999/2000 |
|
Temat ćwiczenia: Pamięć wewnętrzna RAM. Organizacja i wykorzystanie stosu.
|
Data wykonania: 99.10.22 |
Ocena
|
Celem ćwiczenia jest zapoznanie się z wewnętrzną pamięcią RAM (pamięć o dostępie swobodnym), która może być zarówno odczytywana jak i zapisywana. W systemie mikroprocesorowym służy ona do przechowywania danych.
Zadanie 1.
W tym zadaniu zostanie dokonana operacja rejestrowego i bezpośredniego adresowania akumulatora:
LJMP START
ORG 100H
START:
LCALL LCD_CLR ;wyczyść wyświetlacz LCD
MOV A,#10H ;wpisz liczbę do A
LCALL WRITE_HEX ;podprogram systemu
;liczba z akumulatora na wyświetlacz LCD
MOV ACC,#20H ;wpisz liczbę do ACC
LCALL WRITE_HEX
LJMP $
Stosując pracę krokową przy użyciu komputera wpisuję zawartość rejestru stanu PSW oraz stan wyświetlacza LCD do poniższej tabeli:
Bit |
PSW.7 |
PSW.6 |
PSW.5 |
PSW.4 |
PSW.3 |
PSW.2 |
PSW.1 |
PSW.0 |
LCD |
Flaga |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
- |
P |
- |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
- |
3 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
10 |
4 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
10 |
5 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1020 |
Zadanie 2.
Modyfikując program z zadania 1 można dokonać adresowania bezpośredniego wybranych bitów akumulatora. Odpowiedni program zamieszczam poniżej:
LJMP START
ORG 100H
START:
LCALL LCD_CLR ;wyczyść wyświetlacz LCD
MOV A,#10H ;wpisz liczbę do A
SETB ACC.4 ;ustaw bit 4 akumulatora
LCALL WRITE_HEX ;podprogram systemu
;liczba z akumulatora na wyświetlacz LCD
MOV ACC,#20H ;wpisz liczbę do ACC
SETB ACC.3 ;ustaw bit 3 akumulatora
LCALL WRITE_HEX
LJMP $
Adresowanie poszczególnych bitów akumulatora zmienia jedynie zawartość wyświetlacza LCD:
Bit |
PSW.7 |
PSW.6 |
PSW.5 |
PSW.4 |
PSW.3 |
PSW.2 |
PSW.1 |
PSW.0 |
LCD |
Flaga |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
- |
P |
- |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
3 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
31 |
4 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
31 |
5 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
3129 |
Zadanie 3.
Akumulator umieszczony jest pod adresem 0E0H. Przy adresowaniu rejestrowym akumulator oznaczamy przez A (rozkazy nie zawierają w swoim kodzie jego adresu), natomiast przy adresowaniu bezpośrednim przez ACC (adres umieszczony w kodzie rozkazu). Przy oznaczeniu A lub ACC zostanie zapisany cały adres natomiast przy zapisie np.:
SETB ACC.x zostanie ustawiony bit x akumulatora (adresowanie bitowe).
Zadanie 4.
Następny program przedstawia posługiwanie się rejestrami R0-R7 zamiast innymi komórkami pamięci, co jest czasami bardzo wygodne i efektywne. W tym przykładzie zastosowano adresowanie bezpośrednie przy zapisie danych i adresowanie rejestrowe przy odczycie danych.
Listing programu przedstawia się następująco:
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 LCD
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ą zaobserwowałem stan akumulatora, rejestru stanu PSW oraz stan wyświetlacza LCD, co przedstawia poniższa tabela:
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 |
- |
- |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
00 |
2 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
00 |
21 |
3 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
00 |
21 |
4 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
00 |
01 |
5 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0001 |
19 |
6 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0001 |
19 |
7 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0001 |
03 |
8 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
000103 |
FF |
9 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
000103 |
FF |
10 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
000103 |
02 |
11 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
00010302 |
81 |
Zawartość rejestrów R7 w poszczególnych bankach przedstawia poniższa tabela:
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.
Poniższy przykład przedstawia inny sposób adresowania - adresowanie pośrednie, w którym przestrzeń bitowa zostanie zapełniona zawartością EEH:
LJMP START
ORG 100H
START:
LCALL LCD_CLR ;wyczyść wyświetlacz LCD
MOV 13H,#55H ;do komórki pamięci 13H
;wpisz liczbę 55H
;(13H) <- 55H
MOV A,13H ;do akumulatora przepisz
;zawartość komórki 13H
;A <- (13H)=55H
LCALL WRITE_HEX ;akumulator na LCD
MOV R0,#10H ;do R0 wpisz liczbę 10H
;która będzie adresem
MOV R2,#8 ;do R2 wpisz liczbę 8
;-licznik pętli
LOOP: ;ustaw 10 komórek pamięci
;od adresu 10H czyli
;obszar 10H..17H
MOV @R0,#11101110B ;wpisz liczbę EEH pod adres
;umieszczony w R0
INC R0 ;zwiększ adres
DJNZ R2,LOOP ;powtórz zapis n-razy
;zgodnie z licznikiem
MOV A,13H ;A <- (13H)=EE
LCALL WRITE_HEX ;akumulator na LCD
LJMP $
Zadanie 6.
Poniższy program przedstawia adresowanie bitowe. Ustawia on zawartość komórki 21 na 3H i wyświetla ją na wyświetlaczu LCD:
LJMP START
ORG 100H
START:
LCALL LCD_CLR
MOV 21H,#0 ;zeruj komórkę 21H
;(21H) <- 0
MOV A,21H ;A <- (21H)=0
LCALL WRITE_HEX
SETB 21H.0 ;ustaw bit 0 komórki 21H
SETB 21H.1 ;ustaw bit 1 komórki 21H
MOV A,21H ;A <- (21H)=3
LCALL WRITE_HEX
LJMP $
Zadanie 7.
Kolejny przykład dotyczy pamięci podręcznej (przykład 5.1). Listing programu:
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 $
Stosując pracę krokową odczytałem zawartość akumulatora, rejestru stanu PSW, wskaźnika stosu, co przedstawia poniższa tabela:
A |
PSW |
SP |
00 |
00 |
00 |
21 |
00 |
07 |
44 |
00 |
08 |
21 |
80 |
08 |
3D |
81 |
08 |
21 |
80 |
08 |
44 |
80 |
07 |
21 |
80 |
07 |