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/