Technika cyfrowa i mikrokomputery

Transkrypt

Technika cyfrowa i mikrokomputery
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 iloczyn skalarny dwóch 8-elementowych
wektorów, znajdujących się w pamięci (segment DS), których współrzędne są
16-bitowe. Przesunięcie (offset) pierwszego wektora wynosi 0000h, drugiego
0010h. Założyć, że wynik będzie 32-bitowy.
Rozwiązanie
Iloczyn skalarny obliczamy korzystając z następującej zależności:
n
AB   ai bi
i 1
Główna pętla programu wykona się 8 razy. Powstanie zatem 8 iloczynów
częściowych. Iloczyny te będą 32-bitowe. Suma 8 iloczynów 32-bitowych
będzie liczbą 36 bitową. Dla uproszczenia jednak załóżmy, iż wynik iloczynu
skalarnego zmieści się w parze rejestrów 16-bitowych.
W programie wykorzystamy rejestr BP oraz rejestr SI. Pierwszy będzie
wskazywał na bieżące słowo pierwszego wektora. Bieżącą współrzędną
drugiego wektora wyznaczymy przez zsumowanie rejestru BP i rejestru SI,
który będzie zawierał stałe przesunięcie pomiędzy dwoma wektorami.
Ponieważ wynik iloczynu będzie zapisany w parze rejestrów DX i AX, a
rejestr CX zostanie zajęty przez licznik pętli, do wykorzystania pozostaje tylko
rejestr BX, zamiast potrzebnych dwóch rejestrów. Do przechowywania sum
częściowych iloczynu skalarnego wykorzystamy zatem mechanizm stosu.
Kod programu
1: XOR
2: PUSH
BX,BX
BX
3: PUSH
BX
4: XOR
BP,BP
5: MOV
SI,10
6: MOV
CX,08
7: loop1:
8: MOV
AX,[BP]
9: MUL
[BP+SI]
10: POP
BX
11: ADD
AX,BX
12: POP
BX
13: ADC
DX,BX
14:
15:
16:
17:
DX
AX
BP
BP
PUSH
PUSH
INC
INC
18: LOOP
loop1
19: POP
20: POP
AX
DX
;Zerowanie rejestru BX
;Umieszczenie na stosie „0”. W komórce tej będziemy
;umieszczać młodsze słowo iloczynu
;Umieszczenie na stosie „0”. W komórce tej będziemy
;umieszczać starsze słowo iloczynu
;Zerowanie rejestru BP. Rejestr BP wskazuje na
;pierwszą współrzędną pierwszego wektora
;W rejestrze SI znajduje się przesunięcie między
;dwoma wektorami. Niezależnie od bieżącej
;współrzędnej przesunięcie to pozostaje stałe
;Ustawianie licznika pętli
;Wczytanie pierwszej współrzędnej pierwszego
;wektora do akumulatora
;Mnożenie akumulatora przez pierwszą współrzędną
;drugiego wektora.
;Pobieranie ze stosu młodszego słowa sumy
częściowej
;Zwiększanie sumy częściowej o zawartość
;akumulatora czyli młodsze słowo bieżącego iloczynu
;Pobieranie ze stosu starszego słowa sumy
;częściowej
;Dodawanie z uwzględnieniem przeniesienia pomiędzy
;słowami starszej części bieżącego iloczynu do
;starszego słowa sumy częściowej
;Zapis na stosie starszego słowa sumy częściowej
;Zapis na stosie młodszego słowa sumy częściowej
;Dwukrotne zwiększenie zawartości rejestru BP.
;Rejestr BP w kolejnym przebiegu pętli wskazywać
;będzie na kolejną współrzędną pierwszego wektora
;Skok do linii 70, automatyczna dekrementacja
;rejestru CX i sprawdzenie, czy jego zawartość
;jest większa od 0
;Odczyt ze stosu młodszego słowa sumy częściowej
;Odczyt ze stosu starszego słowa sumy częściowej,
;wynik znajduje się w parze rejestrów DX:AX
Zadanie 1
Przetestować zadanie. Zmienić przykład tak aby najpierw zadeklarowac
zmienne a i b, a nastepnie wykonać iloczyn skalarny.
Zadanie 2
Napisać program zliczający ilość jedynek w ośmiu kolejnych bajtach pamięci.
Do wykonania zadania można użyć instrukcji SHR, JNC, INC, PUSH, POP,
MOV, LOOP, XOR
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/

Podobne dokumenty