Sprzęt i architektura komputerów

Transkrypt

Sprzęt i architektura komputerów
Radosław Maciaszczyk
Mirosław Łazoryszczak
Sprzęt i architektura komputerów
Laboratorium
Temat:
Mikroprocesory i elementy asemblera
Katedra Architektury Komputerów i Telekomunikacji
1. M I KROPROCES ORY I EL E M EN TY A SEM BL ERA
1.1.
ARCHITEKTURA MIKROPROCESORA 8086
Schemat blokowy mikroprocesora 8086 przedstawia rys. 1.
Moduł współpracy z magistralą
Jednostka wykonawcza
magistrala wewnętrzna
1 2 3 4 5 6
magistrala
systemowa
kolejka instrukcji
FR
CS
bufory
sterowanie
IP
ALU
AH
AL
BH
BL
CH
CL
DH
DL
DS
SP
ES
BP
SS
sterowanie
SI
DI
Rys. 1 Schemat blokowy mikroprocesora 8086
Procesor 8086 jest procesorem 16-bitowym. Posiada bowiem 16-bitowe
rejestry oraz 16-bitową magistralę danych. Magistrala adresowa jest 20bitowa, co pozwala na uzyskanie 1MB przestrzeni adresowej.
Budowa rejestru znaczników (FR – flag register)
– SF – znacznik znaku
– ZF – znacznik zera
– PF – znacznik parzystości
– AF – przeniesienie pomocnicze
– CF – przeniesienie
– OF – nadmiar
– IF – interrupt
– DF – znacznik kierunku
– TF – znacznik pułapki
Rejestry robocze:
– AX [AH, AL]– akumulator
– BX [BH, BL]– rejestr bazowy
– CX [CH, CL]– rejestr zliczający
– DX [DH, DL]– rejestr danych
–
–
–
–
SP – wskaźnik stosu
BP – wskaźnik bazy
DI – rejestr adresu przeznaczenia
SI – rejestr adresu operandu źródłowego
Rejestry segmentowe:
– CS – segment programu
– DS – segment danych
– SS – segment stosu
– ES – segment dodatkowy
Tryb adresowania – sposób wyznaczania adresu argumentu lub wyniku
– natychmiastowe (MOV AX, 20 – w rejestrze AX zostanie zapisana
liczba 20)
– rejestrowe (MOV AX, BX – w rejestrze AX zostanie zapisana
zawartość rejestru BX)
– bezpośrednie (MOV AX, [40] – w rejestrze AX zostanie zapisana
zawartość komórki pamięci o adresie 40)
– pośrednie (MOV AX, [CX] – w rejestrze AX zostanie zapisana
zawartość komórki pamięci o adresie, który znajduje się w
rejestrze CX)
– bazowe (MOV AX, [BP])
– indeksowe (MOV AX, [SI])
–
bazowo indeksowe (MOV AX, [SI+BP])
Możemy wyróżnić następujące instrukcje procesora:
– arytmetyczno – logiczne
– przesłań
– skoków, obsługi pętli
– wywołań i powrotów z podprogramów
– obsługi rejestrów segmentowych
– operacje na ciągach słów
– rozkazy we/wy
1.2.
PRZYKŁADY PROGRAMOWA NIA MIKROPROCESORA 8086
Przykład 1
Napisać program obliczający wartość następującego wyrażenia:
A*C + B*D, gdzie: A = 13
B = 43 C = -4 D = 19
Rozwiązanie
Najpierw
należy
zamienić
poszczególne
wartości
na
liczby
hexadecymalne. Liczby ujemne powinny być zapisane za pomocą kodu U2.
Program nie ma charakteru ogólnego, ponieważ wielkość i ilość rejestrów
została dopasowana do danych liczb.
A = 0Dh
B = 2Bh
C = FCh
D = 13h
Kod programu
1: MOV
2: MOV
3: IMUL
AL,0D
AH,FC
AH
4: MOV
BX,AX
5: MOV
6: MOV
7: MUL
AL,2B
AH,13
AH
8: ADD
AX,BX
;Umieszczamy liczbę A w rejestrze AL
;Do rejestru AH wpisujemy liczbę C
;Mnożymy (ze znakiem) zawartość rejestru AL przez
;liczbę z rejestru AH, wynik umieszczony będzie
;w rejestrze AX
;Przechowujemy wynik pierwszego mnożenia
;w rejestrze BX
;Wpisujemy liczbę B do rejestru AL
;W rejestrze AH umieszczamy liczbę D
;Mnożymy (bez znaku) zawartość rejestru AL przez
;liczbę z rejestru AH, wynik umieszczony będzie
;w rejestrze AX
;Do wyniku pierwszego mnożenia dodajemy wynik
;drugiego mnożenia. Wynik dodawania (i całego
;wyrażenia) znajdzie się w rejestrze AX
Realizacja
Uruchomić VirtualBOX oraz maszyne wirtualną DOS. Przejść do katalogu AFD
(cd AFD). Uruchomić program AFD.EXE.
Napisać w oknie poleceń: L NOP.BIN
Napisać w oknie poleceń: A (przejście do trybu wpisywania komend)
Przepisać podany kod (od adresu 103)
Przeprowadzić symulację naciskając krokowe uruchomienie (klawisz F1).
Podać wynik oraz jakie flagi zmieniły się w ostatnim kroku programu.
Dlaczego ?
Przykład 2
Napisać program obliczający sumę ośmiu kolejnych bajtów zapisanych
w pamięci począwszy od adresu DS:SI czyli 0700h:0000h
Rozwiązanie
W programie należy zastosować instrukcję pętli (LOOP). Ma ona
charakter skoku bezwarunkowego, przy czym z rozkazem tym związany jest
rejestr CX pełniący funkcję licznika pętli, dekrementowanego automatycznie
po każdym wykonaniu instrukcji LOOP.
Suma 8 bajtów wykracza poza zakres rejestru połówkowego, wobec tego
wynik musi być umieszczony w rejestrze 16-bitowym.
Kod programu
1:
2:
3:
4:
MOV
XOR
XOR
XOR
CX,08
AX,AX
SI,SI
BX,BX
;Ustawiamy licznik pętli na 8
;Zerujemy rejestry AX, SI, BX (poniżej)
5: MOV
BL,[SI]
6: ADD
AX,BX
7: INC
SI
8: LOOP
5
;Wczytujemy do rejestru BL pierwszy bajt z pamięci
;(rejestr SI wskazuje na pierwszy bajt tablicy).
;Ponieważ sumowane składniki są bajtami, musimy
;zatem pobierać pojedyncze bajty z pamięci. Stąd
;użycie rejestru BL. Gdyby użyto rejestru 16;bitowego jako miejsca przeznaczenia, wówczas
;procesor odczytałby całe słowo (dwa bajty) zamiast
;bajtu
;Wykonanie dodawania. Rejestr BH pozostaje
;wyzerowany, więc do akumulatora zawierającego
;cząstkowe wyniki dodawana jest zawartość rejestru
;BL
;Zwiększenie zawartości rejestru SI o 1, tak aby w
;kolejnym przebiegu pętli możliwy był odczyt
;kolejnego bajtu pamięci
;Wykonanie skoku do linii 5(stała loop1),
automatyczna ;dekrementacja rejestru CX i
sprawdzenie, czy jego ;zawartość jest większa od 0
Realizacja
Przepisać kod. Przejść do adresu wskazywanego przez rejestr DS:SI.
Krokowo wykonać program i sprawdzić jak zmieniają się rejestry procesora.
Wyliczyć ręcznie sumę i porównać z uzyskanym wynikiem.
Przykład 3
Napisać program obliczający sumę dwóch wektorów 8 elementowych,
zadeklarowanych w kodzie programu, współrzedne tych wektorów zostaną
wyznaczone po asemblacji. Założyć, że wynik będzie 16 bitowy.
Rozwiązanie
Najpierw należy zadeklarować dwa wektory wejściowe oraz wektor
wynikowy.
Poczynając od adresu DS:00 wpisać
01 04 06 07 12 23 48 00 00 00
Poczynając od adresu DS:10 wpisać
11 23 12 ad 0f 4e 90 00 00 00
Poczynając od adresu DS:20 wpisać
00 00 00 00 00 00 00 00 00 00
Korzystająć z rejestrów pośrednich należy wczytać adresy wektorów. Do
rejestru CX wczytujemy licznik pętli. Następnie wykonujemy w pętli
dodawanie dwóch wektrów zaś wynik zapisujemy do 3 wektora.
Kod programu
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
MOV SI,00
MOV BX,10
MOV DI 20
MOV CX,08
XOR AX,AX
MOV AL,[SI]
ADD AL,[BX]
MOV [DI],AL
INC SI
INC BX
INC DI
LOOP 6
Realizacja
Przepisz kod, przetestuj jego działanie. Zapisz co jest wykonywane dla
każdej instrukcji
Zadanie 1
Napisać program ustawiający wartość „1” w 6 bicie dowolnego adresu w
pamięci np 0700:0100.
Zadanie 2
Napisać program negujący 4 bit dowolnego adresu w pamięci np 0700:0100.
LITERATURA
[1]. Pr. zbiorowa, red. Stępień C.: Mikroprocesory firmy Intel, PWN, Warszawa 1992.
[2]. Turbo assembler. Quick Reference Guide. Borland International 1991.
[3]. Instrukcje procesorów rodziny 80x86 http://4programmers.net/Assembler/