PROGRAMOWANIE MC68K W J EZYKU ASEMBLERA
, c Marek Wnuk 7 grudnia 2000
1 Architektura procesora MC68000
Nasze rozwa˙zania na temat architektury mikroprocesora MC68000 rozpoczniemy od przedstawienia og´olnej bu- dowy wewnetrznej komputera. Na tym tle przyjrzymy si, e dok ladniej strukturze wewn, etrznej MC68000 pr´obuj, ac, dociec, dlaczego przyjeto poszczeg´olne rozwi, azania. Om´owimy sposoby wewn, etrznego reprezentowania danych, w mikroprocesorze i tryby adresowania pozwalajace na dost, ep do tych danych.,
1.1 Podstawowe sk ladniki sprz etowe mikrokomputera
,W typowych komputerach mo˙zna z grubsza wydzieli´c trzy elementy sk ladowe:
• jednostke centraln, a,,
• pamie´c,,
• uk lady wej´scia/wyj´scia.
Przep lyw danych nastepuje pomi, edzy ka˙zd, a par, a wymienionych cz, e´sci sk ladowych komputera. Jednostka cen-, tralna steruje praca obu pozosta lych element´, ow.
1.1.1 Jednostka centralna
Jednostka centralna, zwana procesorem lub CPU, stanowi ”m´ozg” komputera. Wykonuje ona odpowiednie (zlecone jej) operacje. Zlecenie (komenda) mo˙ze mie´c r´o˙zna posta´c. We´zmy jako przyk lad dodawanie dw´och, liczb:
Z = A + B
Mo˙zna to zapisa´c w pseudoangielskiej notacji:
ADD X to Y and SAVE the result toZ
co w uproszczonym symbolicznym zapisie mo˙zna przedstawi´c:
X + Y -> Z
co czytamy: ”dodaj liczbe, X do liczby Y i wynik prze´slij do Z”.
Komenda ta, po przet lumaczeniu na zrozumia ly dla CPU kod binarny winna spowodowa´c nastepuj, ace czynno´sci, procesora:
• pobranie liczby X do CPU
• pobranie liczby Y do CPU
• dodanieX iY
• z lo˙zenie wyniku wZ
Takie komendy tworza wewn, etrzny j, ezyk maszyny i s, a zwane instrukcjami maszynowymi. Sk ladaj, a si, e z dw´och, cze´sci:,
• kodu operacji (opcode) ADD,
• warto´sci danych do przetwarzania.
Ciag takich rozkaz´, ow maszynowych nazywamy programem w jezyku maszynowym (machine language program)., Zestaw wszystkich rozkaz´ow maszynowych, kt´ore dany komputer mo˙ze wykonywa´c zwie sie list, a rozkaz´, ow procesora (instruction set). W zale˙zno´sci od typu procesora mo´ze sie ona zawiera´c od kilkunastu do paruset, instrukcji. Procesor mo˙ze dostawa´c sie do danych przechowywanych w pami, eci na wiele r´o˙znych sposob´ow., Sposoby te zwie sie trybami adresowania (addressing modes). Ich ilo´s´c jest r´o˙zna dla r´o˙znych procesor´ow. Z, punktu widzenia programisty istotne sa r´ownie˙z sposoby reprezentacji danych dost, epne w danym komputerze., 1.1.2 Pamie´,c
Opisane wcze´sniej instrukcje maszynowe i zwiazane z nimi dane musz, aby´c przechowywane w pami, eci systemu, komputerowego. W architekturze von Neumann’a kom´orki pamieci s, a identyczne dla instrukcji (programu) i, dla danych. Kom´orka pamieci jest czasem zwana s lowem (word), a ilo´s´c bit´ow sk ladaj, acych si, e na s lowo zwie, sie rozmiarem s lowa (wordsize). Ka˙zdej kom´, orce pamieci jest jednoznacznie przyporz, adkowana liczba zwana, adresem s lowa. Adresy liczy sie zazwyczaj od 0 do pewnej g´ornej granicy, zale˙znej od wielko´sci pami, eci., 1.1.3 Wykonywanie instrukcji
Wr´o´cmy do przyk ladu dodawania dw´och liczb. Jak wspomniano, zar´owno dane, jak i instrukcje musza by´c, zakodowane i umieszczone w kom´orkach pamieci. Rozwa˙zmy, jakie kom´, orki sa niezb, edne do przechowania, programu realizujacego dodawanie oraz danych bbior, acych w nim udzia l.,
Przede wszystkim, kod operacji (ADD) musi zajmowa´c s lowo (co najmniej jedno). Aby m´oc pobra´c liczby X i Y, trzeba zna´c miejsca, w kt´orych sa one przechowywane, czyli adresy kom´, orek na te liczby zarezerwowanych.
Wreszcie, wynik (Z) musi zosta´c wpisany w okre´slone miejsce w pamieci, co wymaga kolejnego adresu. Wida´c, wiec, ˙ze kompletny rozkaz maszynowy w naszym prostym przyk ladzie sk lada´c si, e musi z co najmniej czterech, s l´ow:
• kod operacji,
• adres pierwszej liczby,
• adres drugiej liczby,
• adres wyniku.
Opr´cz tego w wykonaniu tego rozkazu biora udzia l trzy kom´, orki danych przeznaczone naX,Y iZ.
Kom´orki zawierajace kolejne elementy rozkazu umieszczone s, a w pami, eci sekwencyjnie (maj, a kolejne adresy)., Dzieki temu wprowadzenie rejestru zwanego licznikiem rozkaz´, ow (PC – Program Counter) pozwala unikna´c, pamietania dodatkowo w rozkazie maszynowym adresu nastepnego rozkazu do wykonania. Nawiasem m´owiac,
W powy˙zszym przyk ladzie cykl wykonania rozkazy maszynowego (cykl rozkazowy) wyglada lby nast, epuj, aco:, 1. pobranie kom´orki pamieci o adresie zawartym w, PCi zwiekszenie, PC;
2. zdekodowanie pobranej warto´sci jako kodu rozkazu (ADD);
3. wykonanie rozkazuADD:
(a) pobranie adresu pierwszej liczby z kom´orki wskazywanej przez PCi zwiekszenie, PC;
(b) pobranie adresu drugiej liczby z kom´orki wskazywanej przez PCi zwiekszenie, PC;
(c) pobranie adresu wyniku z kom´orki wskazywanej przezPCi zwiekszenie, PC;
(d) pobranie warto´sci pierwszej liczby z kom´orki o adresie pierwszym;
(e) pobranie warto´sci drugiej liczby z kom´orki o adresie drugim;
(f) wykonanie dodawania;
(g) wpisanie sumy do kom´orki o adresie trzecim.
Po takim cykluPCwskazuje na nastepn, a kom´, orke w ci, agu zawieraj, acym program, kt´ora powinna zawiera´c kod, nastepnego rozkazu maszynowego. Nie ma przeszk´od, by cykl zosta l powt´, orzony, oczywi´scie dla kolejnych roz- kaz´ow programu. W przypadku konieczno´sci zmiany sekwencyjnego sposobu wykonania programu pos lugujemy sie rozkazem skoku (GOTO), kt´orego argumentem jest adres kom´, orki pamieci zawieraj, acej kod maszynowy, nastepnego rozkazu. Jego wykonanie polega po prostu na wstawieniu tego adresu do, PC.
Opisany powy˙zej spos´ob pracy procesora dotyczy tzw. maszyn tr´ojadresowych. Latwo sprawdzi´c, ˙ze bezpo´srednie umieszczenie trzech adres´ow w rozkazie wyd lu˙za kod maszynowy programu. We´zmy za przyk lad procesor o 16–
bitowym s lowie i 32–bitowym adresie. Na powy˙zszy rozkaz trzeba zu˙zy´c:
ADD adr.1 adr.2 adr.3
1 + 2 + 2 + 2 = 7
s l´ow. Oczywi´scie, nie wszystkie rozkazy korzystaja z trzech adres´ow. Aby nie marnowa´c miejsca w pami, eci,, wprowadzono zmienna d lugo´s´c instrukcji. Procesor w chwili dekodowania kodu operacji (punkt 2) okre´sla, ile, adres´ow musi pobra´c dla danego typu rozkazu (np. dlaGOTOtylko jeden).
Maszyny dwuadresowe posiadaja rejestr roboczy dla danych, zwany akumulatorem. Sum, e dw´och liczb mo˙zna, wtedy umie´sci´c w tym rejestrze, a nastepnie zapisa´c w pami, eci dodatkowym rozkazem, SAVE:
ADD adr.1 adr.2 (adr.1) + (adr.2) -> AKUMULATOR SAVE adr.3 (AKUMULATOR) -> adr.3
Prosze zwr´oci´c uwag, e, ˙ze, AKUMULATORjest rejestrem, ale jest traktowany jako adres pewnej kom´orki (w niekt´orych typach mikroprocesor´ow akumulatory sa rzeczywi´scie w taki spos´ob zaimplementowane).,
Nastepny krok to ograniczenie ilo´sci adres´ow do jednego:,
LOAD adr.1 (adr.1) -> AKUMULATOR
ADD adr.2 (AKUMULATOR) + (adr.2) -> AKUMULATOR SAVE adr.3 (AKUMULATOR) -> adr.3
co wymaga nowego rozkazuLOAD.
Mo˙zna sprawdzi´c, ˙ze obie powy˙zsze implementacje sa pozornie mniej efektywne od tr´ojadresowej (odpowiednio:, 8 i 9 s l´ow). Poniewa˙z jednak najcze´sciej mamy do czynienia z ci, agami operacji wykonywanych na wsp´olnych, argumentach, proporcje te zmieniaja si, e na korzy´s´c. Prosz, e rozwa˙zy´c sumowanie, N liczb. Sekwencyjny program w maszynie tr´ojadresowej mia lby d lugo´s´c (N−1)×7 s l´ow, a w maszynie jednoadresowej: 3 + ((N−1)×3) + 3.
Ju˙z dlaN= 3 kr´otszy jest program dla maszyny jednoadresowej.
Powy˙zsze przyk lady maja tylko uzmys lowi´c problemy doboru architektury jednostki centralnej przed prezen-, tacja konkretnych rozwi, aza´, n, przyjetych w mikroprocesorach M68K firmy Motorola, kt´ore b, edziemy omawia´c, szczeg´o lowo.
1.1.4 Uk lady wej´sciowo–wyj´sciowe
Uk lady wej´scia/wyj´scia komputer´ow sa szczeg´olnie wa˙zne ze wzgl, edu na konieczno´s´c wsp´o lpracy z otoczeniem, (w tym z cz lowiekiem). Obs luga urzadze´, n zewnetrznych odbywa si, e przy pomocy rozkaz´, ow specjalnych, lub przy pomocy takich samych rozkaz´ow, jakimi mo˙zna operowa´c na kom´orkach pamieci. Wi, a˙ze si, e to bezpo´srednio z, dwoma podstawowymi koncepcjami umieszczenia uk lad´ow we/wy.
Jedna z nich polega na wydzieleniu osobnej magistrali we/wy (isolated i/o). Procesor odwo luje sie do urz, adze´, n zewnetrznych przez specjalne rozkazy, kt´ore mog, a zajmowa´c nieco mniej miejsca i dzia la´c nieco szybciej, ni˙z, odwo lania do danych w pamieci. Zazwyczaj ilo´s´c tych rozkaz´, ow jest ograniczona (w drastycznym przypadku do dw´och: INiOUT). Dodajmy, ˙ze czesto oddzielenie magistrali we/wy polega na wydzieleniu tylko cz, e´sci sygna l´, ow sterujacych (w skrajnym przypadku – jedmego:, memory/io) i wsp´olnym u˙zytkowaniem linii adresowych i danych przes pamie´c i uk lady we/wy.,
Druga koncepcja polega na traktowaniu uk lad´ow we/wy tak samo jak zwyk lych kom´orek pamieci (memory-, mapped i/o). Tu mo˙zna u˙zywa´c wszystkich instrukcji do operowania na urzadzeniach zewn, etrznych, co z, nawiazk, a rekompensuje straty spowodowane wi, eksz, a d lugo´sci, a kodu pojedynczego rozkazu. Warto w tym, miejscu zwr´oci´c uwage, ˙ze nie zawsze da sie skorzysta´c z wygodnych operacji przeznaczonych do dzia lania na, kom´orkach pamieci. Prosz, e rozwa˙zy´c przyk lad jakiejkolwiek operacji modyfikuj, acej s lowo typu RMW (read-, modify-write). Zadzia la ona poprawnie tylko wtedy, gdy rejestr uk ladu we/wy zachowuje sie jak kom´, orka pamieci, to znaczy pozwala odczytywa´c wpisan, a do´, n warto´s´c. W wielu przypadkach rzeczywistych tak nie jest. Dla oszczedno´sci przestrzeni adresowej, pod tym samym adresem bywaj, a umieszczane dwa r´o˙zne rejestry, dostepne w zale˙zno´sci od kierunku przesy lania danych. Mo˙ze to by´c na przyk lad rejestr steruj, acy w czasie za-, pisu, a rejestr stanu przy odczycie. Wykonanie na takim rejestrze operacji np. negacji spowodowa loby zupe lnie niezamierzony skutek: do rejestru sterujacego zosta lby wpisany zanegowany obraz rejestru stanu.,
1.2 Organizacja M68000
Procesor MC68000, kt´orym bedziemy si, e zajmowa´c w dalszym ci, agu, jest maszyn, a o systemie we/wy adreso-, wanym wsp´olnie z pamieci, a. Wykorzystuje instrukcje jedno– i dwuadresowe. W tym (nominalnie szesnasto-, bitowym) procesorze wszystkie wewnetrzne rejestry adresowe i danych s, a trzydziestodwubitowe. Pozwoli lo to, na rozw´oj rodziny a˙z do obecnego 68060 bez zmieniania garnituru rejestr´ow, tylko przez wprowadzanie drob- nych rozszerze´n nie wp lywajacych na zgodno´s´c z pierwszym modelem. Lista rozkaz´, ow tego procesora zawiera tylko 56 symbolicznych nazw instrukcji (mnemonics). Jej obszerno´s´c zawdzieczamy g l´, ownie du˙zej ilo´sci tryb´ow adresowania (16), kt´ore u latwiaja implementowanie r´o˙znych struktur danych i oprogramowywanie system´ow, operacyjnych. Poniewa˙z wiekszo´s´c tryb´ow adresowania mo˙ze by´c zastosowana do wi, ekszo´sci instrukcji, oraz, ze wzgledu na symetryczny zestaw rejestr´ow, mo˙zna m´owi´c o, prawieortogonalnej strukturze listy rozkaz´ow 68000.
1.2.1 Rejestry
Procesor 68000 odr´o˙znia sie wyra´znie od swoich poprzednik´ow, jak r´ownie˙z od wsp´o lczesnych sobie rywali ilo´sci, a, uniwersalnych rejestr´ow i szeroka gam, a dost, epnych tryb´ow adresowania, kt´ore z tych rejestr´ow korzystaj, a., Wszystkie uniwersalne rejestry, zar´owno danych (Di), jak i adresowe (Aj), maja d lugo´s´c 32 bit´ow. Podobnie,
USP (A7) A6 A5 A4 A3 A2 A1 A0
31 16 15 0
D7 D6 D5 D4 D3 D2 D1 D0
31 16 15 8 7 0
SSP (A7’)
X N Z V C CCR T S I2 I1 I0 X N Z V C SR
Rysunek 1: Rejestry procesora MC68000
itp. Dzieki ich wykorzystaniu w r´o˙znych trybach adresowania mo˙zna zaoszcz, edzi´c wielokrotnego pobierania, z pamieci pe lnego adresu (w tym przypadku 4 bajty), poprzestaj, ac na znacznie kr´otszym adresie wzgl, ednym, wewnatrz struktury (tablicy). Daje to podw´ojn, a oszcz, edno´s´c: 4 bajty kodu i czas ich pobierania z pami, eci przy, dekodowaniu instrukcji.
Rejestr adresowy A7 ma wyznaczona dodatkow, a, wa˙zn, a funkcj, e. Pe lni rol, e wska´znika stosu dla wywo la´, n podprogram´ow i obs lugi zdarze´n specjalnych (exceptions). Przy wywo laniu podprogramu (JSR - Jump to SubRoutine) do kom´orek pamieci adresowanych przez zawarto´s´c, A7sk ladowana jest dotychczasowa zawarto´s´c licznika rozkaz´ow (PC), stanowiaca adres, spod kt´orego nale˙za loby pobra´c kod kolejnej instrukcji maszynowej po, rozkazieJSR. Dzieki temu, przy wywo laniu rozkazu zako´, nczenia poprogramu (RTS - ReTurn from Subroutine), stan licznika rozkaz´ow mo˙ze by´c odtworzony i sekwencyjne wykonanie programu podjete na nowo.,
Przy okazji trzeba doda´c, ˙ze procesor 68000 mo˙ze sie znajdowa´c w jednym z dw´och stan´ow:,
• tryb pracy u˙zytkownika (user-mode)
• tryb pracy systemowy (uprzywilejowany – supervisor-mode)
RejestrA7wystepuje w dw´och wcieleniach:, USP – User Stack PointeriSSP – Supervisor Stack Pointer. W sys- temowym trybie pracy procesor mo˙ze wykonywa´c wszystkie rozkazy i ma dostep do wszystkich zasob´ow (w tym, r´ownie˙z do USP). W trybie pracy u˙zytkownika niekt´ore instrukcje (w szczeg´olno´sci te, przy pomocy kt´orych mo˙zliwe by loby przeprowadzenie procesora w systemowy tryb pracy) staja si, e nielegalne. Uk lad dekodowa-, nia operacji wykrywa to i generuje zdarzenie specjalne odpowiadajace naruszeniu uprzywilejowania (privillege, violation). Podobnie dzieje sie przy pr´obie dost, epu do chronionych zasob´ow (jak na przyk lad, SSP w try- bie u˙zytkownika). Dzieki temu tw´, orca oprogramowania systemowego mo˙ze latwo skonstruowa´c zabezpieczenia przed b ledami zwyk lych u˙zytkownik´, ow.
Rejestr stanu procesora (SR) ma r´ownie˙z dwa wcielenia. W systemowym trybie pracy dostepny jest w ca lej (16-, bitowej) okaza lo´sci. Zwyk ly u˙zytkownik mo˙ze operowa´c tylko na jego mniej znaczacym bajcie zwanym rejestrem, flagowym (CCR – Condition Code Register). Jeden z bit´ow niedostepnej cz, e´sci, SR(bit 13, zwanyS) decyduje o aktualnym trybie pracy procesora. Mo˙zna wiec porzuci´c tryb systemowy (przez modyfikacj, e rejestru, SR), lecz nie mo˙zna w ten sam spos´ob do´n wr´oci´c. Og´olnie m´owiac, procesor wchodzi w systemowy tryb pracy, tylkow wyniku zdarze´n specjalnych, do kt´orych nale˙za przerwania, b l, edy wykrywane sprz, etowo i restart procesora., 1.2.2 Organizacja pamieci,
Jak ju˙z wspomniano przy omawianiu licznika rozkaz´ow, najmniejsza jednostk, a pami, eci jest o´smiobitowy bajt., Faktyczny rozmiar magistrali danych w procesorze 68000 wynosi 16 bit´ow, wiec r´ownocze´snie mo˙zna po niej, przekazywa´c dwa bajty, wobec czego pamie´c musi by´c dost, epna przez 16-bitow, a bram, e. W czasie jednego, dostepu do pami, eci (cyklu magistrali danych) wystawiany jest jeden adres na magistrali adresowej. Latwo, zauwa˙zy´c, ˙ze adres A0 nie bierze udzia lu w wyborze 16-bitowego s lowa na magistrali. W zwiazku z tym dwa, kolejne bajty w pamieci tworz, a jedno s lowo. Motorola przyj, e la tzw. leksykaln, a konwencj, e kolejno´sci bajt´ow, w s lowie (im starszy bajt, tym wcze´sniej wystepuje), odwrotn, a w stosunku do konwencji Intela, lecz r´ownie, rozpowszechniona na ´swiecie (prosz, e zwr´oci´c uwag, e, ˙ze jest ona naturalna dla ludzi pisz, acych liczby od lewej, ku prawej stronie, poczawszy od najbardziej znacz, acej cyfry). Z tej konwencji wynika, ˙ze s lowa 16-bitowe, (dla skr´ocenia zapisu bedziemy je dalej nazywali po prostu s lowami – word) sa dostepne na magistrali danych
1.3 Podstawowe typy danych w M68000
Typy danych stosowane w jezykach wy˙zszego rz, edu, jak Pascal lub C, mo˙zna podzieli´c na podstawowe (proste), i z lo˙zone. Pierwsze z nich maja bezpo´sredni, a implementacj, e w j, ezyku maszynowym, drugie (jak si, e p´o´zniej, przekonamy) czasem te˙z, cho´c na og´o l wymagaja specjalnych technik dla uzyskania efektywnej implementacji,, wykorzystujacych podstawowe typy danych jako elementy sk ladowe.,
Procesory M68K maja nast, epuj, ace podstawowe typy danych:,
• bit,
• cyfra dziesietna (BCD),,
• bajt,
• s lowo (16-bitowe),
• d lugie s lowo (32-bitowe).
Ka˙zdy z powy˙zszych typ´ow danych posiada w lasne odwzorowanie w pamieci, kt´ora, jak pami, etamy, ma organi-, zacje bajtow, a.,
1.3.1 Bit
Bit mo˙ze mie´c jeda z dw´och warto´sci: 1 lub 0. Mo˙ze by´c umieszczony na dowolnej z o´smiu pozycji w bajcie, (kom´orce pamieci) lub na dowolnej z 32 pozycji w rejestrze danych procesora. Adres wzgl, edny bitu mie´sci si, e, wtedy (odpowiednio) w przedziale 0-7 lub 0-31.
1.3.2 Cyfra dziesietna (BCD),
Binarna reprezentacja cyfr dziesietnych (BCD – Binary Coded Decimal) bywa u˙zywana (raczej rzadko) przy, niekt´orych zastosowaniach mikroprocesor´ow. Polega ona na zapisie pozycyjnym liczb przy podstawie dziesietnej, z r´ownoczesnym naturalnym (binarnym) kodowaniem cyfr dziesietnych. Nie jest to najefektywniejszy spos´ob, kodowania liczb, poniewa˙z na 16-bitowym s lowie mo˙zna zmie´sci´c tylko liczby BCD o zakresie 0 – 9999, podczas gdy binarny kod pozwala zmie´sci´c liczby od 0 do 65535. Ka˙zda cyfra w tym kodzie zajmuje cztery bity. Mamy do dyspozycji dwa warianty liczb BCD: upakowane i nieupakowane. Pierwszy z nich mie´sci w ka˙zdym bajcie pamieci dwie cyfry dziesi, etne, przy czym starsza z nich zajmuje starsz, a cz, e´s´c bajtu, drugi wykorzystuje tylko, mniej znaczac, a po low, e bajtu na jedn, a cyfr, e.,
1.3.3 Bajt
Bajt jest podstawowym elementem, z kt´orego zbudowana jest pamie´c procesor´ow 68000. Mo˙ze on by´c wykorzy-, stany do przechowywania znak´ow (ASCII – American Standard Code for Information Interchange), lub ma lych liczb binarnych (w zakresie od 0 do 28−1 = 255) zakodowanych naturalnie. Mo˙zna te˙z w bajcie przechowywa´c liczby ze znakiem. Motorola u˙zywa reprezentacji liczb ze znakiem (signed byte) w kodzie uzupe lnienia do 2 (two’s complement). Daje to zakres od−27=−128 do +27−1 = +127.
1.3.4 S lowo
Domy´slnym rozmiarem s lowa w procesorach 68000 sa dwa bajty (16 bit´ow). Daje to zakres liczb ca lkowitych bez, znaku (unsigned integers) od 0 do 216−1 = 65535, oraz ze znakiem od−215=−32788 do +215−1 = +32787.
Zgodnie z wcze´sniejszymi rozwa˙zaniami dotyczacymi pami, eci, s lowa musz, a by´c umieszczone pocz, awszy od, parzystych adres´ow, starszy bajt s lowa pod adresem parzystym, m lodszy pod nastepnym (nieparzystym)., 1.3.5 D lugie s lowo
Dwa s lowa 16-bitowe tworzy´c moga d lugie s lowo (longword). Zakres liczb ca lkowitych bez znaku wynosi dla, d lugiego s lowa od 0 do 232−1 = 4294963295, a ze znakiem od−231=−2147481648 do +231−1 = 2147481647.
Tu r´ownie˙z obowiazuj, a te same uwagi dotycz, ace kolejno´sci bajt´ow i umieszczenia pocz, awszy od adres´ow parzy-, stych.
1.3.6 Reprezentacja instrukcji
Kod operacji mo˙ze zajmowa´c w s lowie rozkazowym pole o sta lej ilo´sci bit´ow (wielko´sci). Na przyk lad 8-bitowe pole kodu operacji dawa loby 256 mo˙zliwych kod´ow. Poniewa˙z jednak nie ka˙zdy rozkaz wymaga takiej samej ilo´sci argument´ow, a co za tym idzie - dodatkowych bit´ow w s lowie rozkazowym, w procesorach Motoroli rodziny M68K zastosowano zmiennej d lugo´sci pole kodu operacji. Rozpieto´s´c tego pola wynosi od 2 do 16 bit´ow., Kody operacji (opcodes) mo˙zna podzieli´c na:
• bezadresowe (implicit address opcodes)
• jednoadresowe (single-address opcodes)
• p´o ltoraadresowe (one-and-a-half-address opcodes)
• dwuadresowe (two-address opcodes)
Odpowiednio dla ka˙zdej z tych kategorii mo˙zemy poda´c reprezentant´ow:
• RTS(ReTurn from Subroutine) - powr´ot z przerwania
• JMP <ea>(JuMP) - skok do adresu
• ADD <ea>,Dn - dodanie zawarto´sci adresu do Dn
• MOVE <ea>,<ea>- przes lanie zawarto´sci jednego adresu pod drugi
Operacje bezadresowe nie u˙zywaja informacji adresowej. Rozkazy takie maj, a kody 16-bitowe .Przyk ladowy, rozkazRTS laduje zawart´o´s´c licznika rozkaz´ow (PC) z kom´orki pamieci wskazywanej przez wska˙znik stosu (SP):,
RTS ((SP)) -> PC
Operacje jednoadresowe wykorzystuja 6-bitowe pole w s lowie rozkazowym zwane deskryptorem adresu (effective, address), kt´ore jest w r´o˙zny spos´ob wykorzystywane do tworzenia wynikowego adresu 32-bitowego. Sposoby te, zwane trybami adresowania zostana om´owione w kolejnym rozdziale. Rozkaz, JMP <ea> laduje wynikowy adres otrzymany z<ea>do licznika rozkaz´ow:
JMP <ea> <ea> -> PC
Przyk ladem nastepnej klasy jest, ADD. Ta operacja u˙zywa dw´och argument´ow. Jeden z nich mo˙ze by´c dostepny, przez<ea>analogicznie, jak dla operacji jednoadresowych, a drugimusiby´c w rejestrze danych:
ADD <ea>,Dn (<ea>) + (Dn) -> Dn ADD Dn,<ea> (Dn) + (<ea>) -> <ea>
Operacja dwuadresow, a jest, MOVE. Przesy la ona dane z jednej do drugiej lokacji:
MOVE <eas>,<ead> (<eas>) -> <ead>
Operacje moga specyfikowa´c rozmiar danych, na kt´orych operuj, a. Dost, epne (nie we wszystkich przypadkach), rozmiary to bajt, s lowo i d lugie s lowo.
Reasumujac, s lowo rozkazowe zawiera kod operacji, specyfikacj, e rozmiaru danych, i od zera do dw´och deskryp-,
1.4 Adresowanie
Podstawowym problemem przy dostepie do danych zawartych w pami, eci jest spos´ob podania adresu, pod, kt´ory chcemy sie zwr´oci´c. Metoda bezpo´srednia, cho´c oczywista, ma jednak podstawow, a wad, e, kt´or, a jest, konieczno´s´c umieszczenia w kodzie maszynowym programu pe lnych adres´ow. Moga one mie´c d lugo´s´c 32 bit´ow, (jak to jest w omawianych procesorach) i przez to zajmowa´c po cztery bajty na adres. Rejestry dostepne w, jednostce centralnej pozwalaja z lagodzi´c ten problem przez tymczasowe przechowywanie najcz, e´sciej potrzebnych, danych. Inna metod, a jest u˙zycie r´o˙znych sposob´ow adresowania, dopasowanych do specyficznych potrzeb. Du˙za, ilo´s´c tryb´ow adresowania w procesorach rodziny M68K Motoroli usprawnia prace program´ow, ale r´ownocze´snie, wymaga od programisty ich zrozumienia i opanowania technik ich stosowania.
Przedstawimy tryby adresowania od najprostszych do najbardziej z lo˙zonych, pos lugujac si, e w miar, e potrzeby, odwo laniami do analogii z jezyka C (kt´orego znajomo´s´c za lo˙zyli´smy na wst, epie).,
Nasze rozwa˙zania dotyczace tryb´ow adresowania b, edziemy ilustrowa´c przyk ladami. We´zmy instrukcj, e:, MOVE.W <skad>,<dokad>
przesy lajac, a s lowo dwubajtowe (.W) z miejsca okre´slonego specyfikacj, a,skaddo miejsca okre´slonego przezdokad.
Zawarto´s´c ´zr´od la nie ulega zmianie, w miejscu przeznaczenia dwubajtowe s lowo zostaje zastapione warto´sci, a, taka, jak, a ma ´zr´, od lo, a rejestr flagowy (CCR) zostanie odpowiednio zmodyfikowany.
InstrukcjaMOVE.Wjest zakodowana nastepuj, aco:,
bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 1 ‘---v---’ ‘---v---’
kod rozmiar adres przeznaczenia adres zrodla operacji danych (dokad - destination) (skad - source)
Kod operacjiMOVEzajmuje tylko dwa bity (00), rozmiar danych jest te˙z dwubitowy ( 01 - bajt, 11 - slowo, 10 - d lugie s lowo). Adresy ´zr´od la i przeznaczenia, sa okre´slone na sze´sciobitowych polach w s lowie zawieraj, acym kod, maszynowy instrukcjiMOVE.W. Pole to sk lada sie z dw´och trzybitowych cz, e´sci. Jedna z nich, zwana jest trybem, (Mode), a druga stanowi numer rejestru (Register). Nie wszystkie tryby adresowania u˙zywaja rejestr´ow. Dla, nich zarezerwowano wsp´olna warto´s´c pola trybu (%111), przy kt´orej pole rejestru stanowi w la´sciwy wyr´o˙znik, trybu adresowania. W ten spos´ob jednostka centralna po pobraniu pierwszego s lowa rozkazu mo˙ze ustali´c jednoznacznie tryby, przy pomocy kt´orych zaadresowano argumenty operacji. Oczywi´scie, wiekszo´s´c tryb´ow, bedzie wymaga la pobrania dalszych s l´, ow sk ladajacych si, e na pe lny rozkaz.,
1.4.1 Tryb bezpo´sredni rejestru danych (data register direct)
Tryb ten umo˙zliwia dostep do danych zawartych w rejestrach danych procesora. Pole trybu ma warto´s´c, %000, a w polu rejestru podany jest numer wybranego rejestru danych. Adres efektywny odnosi sie bezpo´srednio do, rejestru danych (nie ma dostepu do pami, eci):,
EA=Dn W naszym przyk ladzie:
MOVE.W D1,D2 (D1) -> D2
koduje sie:,
3 4 0 1
___ ___ ___ ___
’ ‘ ’ ‘’ ‘’ ‘
00 11 010 000 000 001 -- -- --- --- --- ---
| | | | | |__rejestr zrodlowy nr 1 \
| | | | | > skad
| | | | |______tryb bezposredni rejestru danych /
| | | |
| | | |__________tryb bezposredni rejestru danych \
| | | > dokad
| | |______________rejestr przeznaczenia nr 2 /
| |
| |_________________rozmiar danych - slowo (.W)
|
|____________________kod instrukcji MOVE
Jak wida´c, ta instrukcja zajmuje tylko jedno s lowo, co daje jednoczesna oszcz, edno´s´c miejsca w pami, eci programu, i czasu zu˙zytego na jej wykonanie (tylko jeden dostep do pami, eci).,
1.4.2 Tryb bezpo´sredni rejestru adresowego (address register direct)
Tryb ten jest podobny do porzedniego (pole trybu%001), ale mo˙ze by´c stosowany tylko dla danych o d lugo´sci s lowa (.W) lub d lugiego s lowa (.L). Adres efektywny odnosi sie bezpo´srednio do rejestru adresowego (nie ma, dostepu do pami, eci):,
EA=An Nasz przyk lad:
MOVE.W D1,A2 (D1) -> A2
koduje sie:,
00 11 010 001 000 001 -- -- --- --- --- ---
| | | | | |__rejestr zrodlowy nr 1 \
| | | | | > skad
| | | | |______tryb bezposredni rejestru danych /
| | | |
| | | |__________tryb bezposredni rejestru adresowego \
| | | > dokad
| | |______________rejestr przeznaczenia nr 2 /
| |
| |_________________rozmiar danych - slowo (.W)
|
|____________________kod instrukcji MOVE
R´ownie˙z w tym trybie oszczedzamy zarazem na d lugo´sci kodu, jak i na czasie jego wykonania. Obu om´owionych, tryb´ow u˙zywa sie do operowania na cz, esto wykorzystywanych danych, po´srednich wynikach itp.,
1.4.3 Tryb bezwzgledny d lugi (absolute long),
Operowanie na danych (nawet w przypadku om´owionych tryb´ow rejestrowych) wymaga kontaktu z zawarto´scia, pamieci (cho´cby po to, by za ladowa´c dane do rejestr´ow i przekaza´c wyniki). Omawiany tryb pozwala zaadre-, sowa´c dowolna kom´ork, e pami, eci w ca lej (4GB) przestrzeni adresowej procesora. Wymaga to podania cztero-, bajtowego (dwa s lowa) adresu. W tym trybie nie bierze udzia lu ˙zaden rejestr, wiec specyfikacja trybu ma pole,
%111, a pole rejestru zawiera %001. Ten (w sumie sze´sciobitowy) kod trybu adresowania powoduje, ˙ze procesor pobiera dwa s lowa nastepuj, ace po kodzie maszynowym rozkazu i sk lada je w d lugie s lowo traktowane jako adres, kom´orki pamieci, do kt´orej ma si, e odwo la´c:,
EA= ((P C) + 2) : ((P C) + 4) Asembler (program t lumaczacy) na podstawie tekstu ´zr´, od lowego:
DANEWEJ EQU $123456
MOVE.W DANEWEJ,D2 (DANEWEJ) -> D2
gdzie EQU jest pseudoinstrukcja (dyrektyw, a) przypisuj, ac, a etykiecie, DANEWEJ warto´s´c$123456, wytworzy kod maszynowy:
$3435 kod maszynowy MOVE.W z odpowiednimi trybami
$0012 starsze slowo dlugiego adresu bezwzglednego
$3456 mlodsze slowo dlugiego adresu bezwzglednego
Jego pobranie wymaga trzech odwo la´n do pamieci, a wykonanie - kolejnego dost, epu w celu odczytania s lowa, DANEWEJzawartego w kom´orce o adresie$123456. W przypadku instrukcji:
DANEWEJ EQU $123456 DANEWYJ EQU $345678
MOVE.W DANEWEJ,DANEWYJ (DANEWEJ) -> DANEWYJ
pobranie rozkazu zajmie pie´c dost, ep´, ow, a wykonanie - sz´osty. Wida´c, ˙ze ten tryb adresowania powinien by´c stosowany ze szczeg´olnym umiarem. Jego cecha jest (zgodnie z nazw, a), bezwzgledna, specyfikacja adresu. W pewnych przypadkach jest to zaleta, gdy˙z pozwala odwo lywa´c sie do ustalonych po lo˙ze´, n w przestrzeni adresowej procesora (np. kom´orek zwiazanych z rezydentnym oprogramowaniem, port´ow). Z drugiej strony, nie jest to, tryb godny polecenia w celu odwo lywania sie do roboczych danych programu, o ile chcieliby´smy uzyska´c kod, niezale˙zny od po lo˙zenia w pamieci (PIC - Position Independent Code), a tym bardziej kod wsp´o lu˙zywalny, (sharable/reentrant code).
1.4.4 Tryb bezwzgledny kr´, otki (absolute short)
Nie zawsze istnieje potrzeba stosowania 32-bitowego adresu kom´orki pamieci. Wydzielono podobszar przestrzeni, adresowej, kt´ory mo˙zna adresowa´c przy pomocy adresu 16-bitowego. Tryb bezwzgledny kr´otki ma pole trybu,
%111 i pole rejestru%000. Procesor obs luguje go w ten spos´ob, ˙ze pobiera nastepne s lowo po kodzie rozkazu i, traktuje je jako liczbe zapisan, a w kodzie uzupe lnienia do 2 (U2). Aby uzyska´c 32-bitowy adres, przeprowadza, operacje rozci, agni, ecia znaku (sign extension), kt´ora polega na uzupe lnieniu brakuj, acych, bardziej znacz, acych, bit´ow (w tym przypadku ca lego starszego s lowa) zgodnie z najstarszym (tu – 15) bitem s lowa rozszerzanego.
Dzieki temu uzyskuje liczb, e ze znakiem (U2) o tej samej warto´sci, lecz wi, ekszej d lugo´sci. W rezultacie otrzymuje, adres, kt´ory dotyczy albo najni˙zszych, albo najwy˙zszych 32kB przestrzeni adresowej procesora:
EA= ((P C) + 2)SEX
Zwr´o´cmy uwage, ˙ze najwy˙zsza cz, e´s´c przestrzeni adresowej jest rozumiana z dok ladno´sci, a do ilo´sci bit´ow adreso-, wych wykorzystywanych do sprzetowego dekodowania adresu pami, eci i urz, adze´, n. Na przyk lad, u˙zywajac tylko, adres´ow do A19 w lacznie, uzyskamy w tym trybie dost, ep do obszar´ow:,
$00000 -- $07FFF i $F8000 -- $FFFFF cho´c wewnetrzna reprezentacja adres´ow b, edzie nadal 32-bitowa:,
$00000000 -- $00007FFF i $FFFF8000 -- $FFFFFFFF
Asembler w czasie t lumaczenia programu preferuje tryb bezwzgledny kr´otki. Warunkiem jego zastosowania jest, znajomo´s´c liczbowej warto´sci adresu odpowiadajacego ewentualnej nazwie symbolicznej (etykiecie), w chwili tworzenia kodu rozkazu. W przypadku niespe lnienia tego warunku wybierany jest tryb bezwzgledny d lugi,, jako zawsze realizowalny, cho´c czasem nieoptymalny. W wiekszo´sci asembler´, ow istnieje mo˙zliwo´s´c wymuszenia trybu d lugiego przez opatrzenie sta lej liczbowej przyrostkiem.Llub u˙zycie zer nieznaczacych.,
1.4.5 Tryb natychmiastowy (immediate)
W opisanych trybach bezwzglednych dane pobra´c mo˙zna z kom´, orki pamieci, kt´orej adres podamy w kodzie, programu. Czesto istnieje potrzeba u˙zycia danych sta lych, kt´ore mog, a stanowi´c na przyk lad granice p, etli,, wsp´o lczynniki wyra˙ze´n itp. Ich umieszczenie w kom´orkach pamieci jest oczywi´scie mo˙zliwe, ale nieoptymalne., Zamiast pobiera´c z kodu programu s lowa sk ladajace si, e na adres kom´, orki zawierajacej sta l, a warto´s´c i nast, epnie, pobiera´c te warto´s´c z pami, eci danych, mo˙zna j, a pobra´c bezpo´srednio z kodu programu. Oszcz, edzamy w ten, spos´ob zar´owno kom´orke pami, eci przeznaczon, a na sta l, a, jak i czas potrzebny na dost, ep do niej.,
Tryb natychmiastowy w procesorach M68K jest symbolicznie wskazywany w tek´scie ´zr´od lowym programu przez poprzedzenie argumentu znakiem ”#”:
STALA EQU $55AA
MOVE.W #STALA,D2 STALA -> D2
Pole trybu wynosi%111, a pole rejestru%100. Rozmiar u˙zytych danych zale˙zy od specyfikacji w kodzie operacji:
• .W– s lowo 16-bitowe,EA= (P C) + 2
• .L– d lugie s lowo (32-bitowe),EA= (P C) + 2
• .B– 8-bitowy bajt,EA= (P C) + 3
Brak specyfikacji rozmiaru oznacza domy´slnie s lowo 16-bitowe. Zar´owno s lowo, jak i bajt zajmuja w kodzie, maszynowym drugie s lowo po kodzie rozkazu, natomiast sta la o rozmiarze d lugiego s lowa - dwa kolejne s lowa (podobnie jak w przypadku d lugiego adresu).
Zwr´o´cmy uwage, ˙ze sta le w programie nie powinny by´c kodowane w postaci ”magicznych liczb”. U˙zywanie ich, w postaci symbolicznej po nadaniu warto´sci dyrektywa,EQUpozwala uporzadkowa´c program i procentuje przy, konieczno´sci zmiany sta lych warto´sci przy jego modyfikowaniu.
Da˙zenie do skracania kodu maszynowego program´ow przejawia si, e we wprowadzeniu kr´otkiej odmiany danych, natychmiastowych (quick immediate constants). Dla instrukcji MOVE istnieje odmianaMOVEQ, kt´ora korzysta z 8-bitowego pola wygospodarowanego w s lowie zawierajacym kod rozkazu, podobne pola 3-bitowe wygospoda-, rowano w instrukcjachADDQiSUBQbed, acych mutacjami dodawania i odejmowania, a w la´sciwie – uog´olnieniem, operacji inkrementacji i dekrementacji rejestr´ow danych.
1.4.6 Tryb po´sredni rejestru adresowego (address register indirect)
Wyobra´zmy sobie, ˙ze w naszym systemie musimy czesto dostawa´c si, e do portu (rejestru urz, adzenia zewn, etrznego),, kt´orego adres jest d lugi. Z dotychczas prezentowanych tryb´ow nadawa l sie do tego celu bezwzgl, edny d lugi. Roz-, kaz wpisania 16-bitowych danych natychmiastowych do tego portu:
Dane EQU $55AA #define Dane 0x55aa
PortAdd EQU $FFF000 #define PortAdd 0xfff000
* Deklaracja zmiennych ORG PortAdd
Port DS.W 1 short Port @ Portadd;
* Przeslanie danych do portu
MOVE.W #Dane,Port Port = Dane;
zajmuje przy ka˙zdym dostepie do portu 4 s lowa 16-bitowe, a jego pobranie i wykonanie wymaga 5 dost, ep´ow do, pamieci.,
Znacznie lepszym sposobem jest ustawienie w jednym z rejestr´ow adresowych procesora wska´znika na ten port i wykorzystanie go do po´sredniego adresowania:
Dane EQU $55AA #define Dane 0x55aa
PortAdd EQU $FFF000 #define PortAdd 0xfff000
* Deklaracje zmiennych
* short *ptr; /* rejestr A0 */
* Inicjacja wskaznika
ORG ROM
MOVEA.L #PortAdd,A0 ptr = (short *)PortAdd;
* Przeslanie danych do portu
MOVE.W #Dane,(A0) *ptr = Dane;
Notacja ´zr´od lowa(AO)oznacza, ˙ze zawarto´s´c rejestruA0jest adresem, do kt´orego chcemy siegn, a´c:, EA= (An)
Pole trybu wynosi%010, wska´znikiem mo˙ze by´c tylko rejestr adresowy.
Teraz wprawdzie jednorazowa inicjacja wska´znika w rejestrze A0 zajmuje 3 s lowa (3 dostepy), ale za to rozkaz, wpisu danych natychmiastowych do portu skraca sie do 2 s l´, ow (3 dostepy). Latwo sprawdzi´c, ˙ze op laca si, e to, ju˙z przy dwukrotnym dostepie do portu przy jednej inicjacji wska´znika.,
1.4.7 Tryb po´sredni rejestru adresowego z autopostinkrementacja (address register indirect with postincrement)
Rozszerzona wersja po´sredniego trybu adresowania pozwala uzyska´c sekwencyjny dostep do kolejnych kom´, orek pamieci bez wyd lu˙zania kodu maszynowego programu i czasu jego realizacji. Znana np. z j, ezyka C operacja, autoinkrementacji wska´znika po wykonaniu dostepu do danych zosta la zaimplementowana bezpo´srednio w jed-, nym z tryb´ow adresowania procesor´ow M68K. Dzieki temu przepisywanie zawarto´sci jednego obszaru pami, eci, do drugiego nie wymaga dodatkowych operacji na wska´znikach:
* Deklaracje zmiennych
ORG RAM
* short *ptrA; /* rejestr A0 */
* short *ptrB; /* rejestr A1 */
TablA DS.W 100 short TablA[100];
TablB DS.W 100 short TablB[100];
* Inicjacja wskaznikow
ORG ROM
MOVEA.L #TablA,A0 ptrA = &TablA[0];
MOVEA.L #TablB,A1 ptrB = &TablB[0];
* Przepisanie elementow i przesuniecie wskaznikow MOVE.W (A0)+,(A1)+ *ptrB++ = *ptrA++;
Pole trybu tej operacji wynosi%011, jako wska´zniki moga by´c u˙zywane tylko rejestry adresowe. Po wystawieniu, adresu na magistrale, w celu uzyskania dost, epu do wybranej kom´, orki pamieci, zawarto´s´c rejestru adresowego, jest zwiekszana o rozmiar danych (SIZE) bior, acych udzia l w operacji wyra˙zony w bajtach (”.B” – 1, ”.W” –, 2, ”.L– 4):
EA= (An) (An) +SIZE→An
Dzieki temu wska´znik jest ustawiony na nast, epny element tablicy, a poniewa˙z operacja ta odbywa si, e w rejestrze, wewnetrznym procesora, jej wykonanie nie zajmuje dodatkowego czasu.,
1.4.8 Tryb po´sredni rejestru adresowego z autopredekrementacja (address register indirect with predecrement)
W niekt´orych sytuacjach potrzebne jest przepisywanie tablic w odwrotnej kolejno´sci, na przyk lad przy cze´sciowym, pokrywaniu sie obszaru ´zr´, od lowego z docelowym. Wtedy mo˙zna u˙zy´c trybu przeciwstawnego do poprzednio opisanego :
* Przesuniecie wskaznikow i przepisanie elementow MOVE.W -(A0),-(A1) *--ptrB = *--ptrA;
Kod trybu wynosi %100, rejestr musi by´c adresowy. Tym razem modyfikacja (odpowiednie do typu danych zmniejszenie zawarto´sci) rejestru adresowego nastepuje, przedwystawieniem adresu na magistrale:,
(An)−SIZE→An EA= (An)
Wa˙znym zastosowaniem tryb´ow po´srednich z automodyfikacja s, a operacje na stosie. Istnieje wersja instrukcji, MOVE, zwana MOVEM (MOVE Multiple), kt´ora pozwala przes la´c na stos lub pobra´c z niego dowolny podzbi´or rejestr´ow danych i adresowych procesora przy pomocy rozkazu z lo˙zonego z dw´och s l´ow: kodu rozkazu i maski zestawu rejestr´ow.
1.4.9 Tryb po´sredni rejestru adresowego z przesunieciem (address register indirect with displa-, cement)
Innym rozszerzeniem po´sredniego trybu rejestru adresowego jest dodanie sta lego przesuniecia (przemieszcze-, nia) adresu wynikowego w stosunku do zawarto´sci rejestru adresowego, zwanej adresem bazowym. Przesuniecie, to jest podawane w postaci 16-bitowego s lowa po kodzie rozkazu, traktowanego jako liczba ze znakiem. Ad- res wystawiany na magistrale budowany jest z zawarto´sci rejestru adresowego przez dodanie przesuni, ecia po, rozciagni, eciu jego znaku na s lowo 32-bitowe:,
EA= (An) + ((P C) + 2)SEX
Typowe zastosowanie tego trybu to dostep do danych wewn, atrz struktur:,
* Definicja struktury data_t
ORG 0
typedef struct{
Dzien DS.B 1 char Dzien;
Miesiac DS.B 1 char Miesiac;
Rok DS.W 1 short Rok;
* } data_t;
Data_L
* Data_L = sizeof(data_t);
* Deklaracje zmiennych
ORG RAM
* data_t *ptr; /* w rejestrze A0 */
Data DS.B Data_L data_t Data;
* Dostep do wnetrza struktury
ORG ROM
MOVEA.L #Data,A0 ptr = &Data;
MOVE.W #1996,Rok(A0) ptr->Rok = 1996;
Pole trybu wynosi%101, rejestr – adresowy, przesuniecie – 16-bitowe.,
1.4.10 Tryb po´sredni rejestru adresowego z indeksem i przesunieciem (address register indirect, with index and displacement)
Dostep do element´ow tablic wymaga znajomo´sci dw´och parametr´ow: adresu pocz, atku tablicy i kolejnego nu-, meru (indeksu) elementu, o kt´ory nam chodzi. Oba te parametry mo˙zemy zada´c w opisywanym trybie w postaci zawarto´sci dw´och rejestr´ow. Pierwszy z nichmusiby´c rejestrem adresowym i zawiera adres bazowy, a drugi mo˙ze by´c dowolnym z uniwersalnych rejestr´ow procesora i jest zwany rejestrem indeksowym. Dodatkowa mo˙zliwo´s´c u˙zycia sta lego przesuniecia wzgl, edem rejestru bazowego (jak poprzednio) pozwala na dost, ep do ta-, blic zawartych w strukturach. Adres efektywny tworzony jest przez zsumowanie zawarto´sci rejestru bazowego, 8-bitowego przesuniecia wzgl, edem bazy rozszerzonego znakowo i zawarto´sci rejestru indeksowego (rozszerzonego, w przypadku u˙zycia jego 16-bitowej cze´sci):,
EA= (An) + ((P C) + 3)SEX+ (Xm)SEX
Oto ilustracja u˙zycia opisywanego trybu w celu dostepu do tablicy pomiar´ow zawartej w pewnej strukturze:,
* Definicja struktury pomiar_t
ORG 0
typedef struct{
Datas DS.B Data_L data_t Datas;
Temp DS.B 24 char Temp[24];
* } pomiar_t;
Pomiar_L
* Pomiar_L = sizeof(pomiar_t);
* Deklaracje zmiennych
ORG RAM
* pomiar_t *ptr; /* w rejestrze A0 */
* int NumerPom; /* w rejestrze D1 */
* char Wynik; /* w rejestrze D0 */
Pomiar DS.B Pomiar_L pomiar_t Pomiar;
* Dostep do elementu tablicy wewnatrz struktury
ORG ROM
* Inicjacja wskaznika struktury
MOVEA.L #Pomiar,A0 ptr = &Pomiar;
* Inicjacja indeksu w tablicy
MOVE.L #0,D1 NumerPom = 0;
* odczyt pomiaru z tablicy
MOVE.B Temp(A0,D1.L),D0 Wynik = ptr->Temp[NumerPom];
Przyjrzymy sie teraz sposobowi kodowania trybu indeksowego w procesorze M68K. Pole trybu wynosi, %110, a pole rejestru zawiera numer rejestru bazowego. W kolejnym s lowie umieszczone sa parametry dotycz, ace rejestru, indeksowego i 8-bitowe przesuniecie bazowe:,
bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0
D/A ‘---v---’ W/L ‘---v---’
typ / numer /czesc przesuniecie bazowe
rejestru indeksowego
Zwr´o´cmy uwage, ˙ze trybu tego mo˙zna r´ownie˙z u˙zy´c do szybkiej implementacji tablic dwuwymiarowych. Jeden, z indeks´ow tablicy stanowi´c mo˙ze rejestr bazowy, a drugi - rejestr indeksowy.
W procesorach M68K poczawszy od MC68020 wprowadzono dodatkowo skalowanie indeksu, kt´ore polega na, wykorzystaniu bit´owb9 ib10 drugiego s lowa rozkazowego do zakodowania rozmiaru elementu tablicy:
bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0
D/A ‘---v---’ W/L ‘-v-’ ‘---v---’
typ / numer /czesc skala przesuniecie bazowe rejestru indeksowego elem.
Kodowanie jest naturalne, rozmiar elementu okre´slony jest jako 2SKALA. W poni˙zszym przyk ladzie zmieniono typ element´ow tablicy nalong, by zlustrowa´c u˙zycie skalowania:
* Definicja struktury pomiar_t
ORG 0
typedef struct{
Datas DS.B Data_L data_t Datas;
Temp DS.L 24 long Temp[24];
* } pomiar_t;
Pomiar_L
* Pomiar_L = sizeof(pomiar_t);
* Deklaracje zmiennych
ORG RAM
* pomiar_t *ptr; /* w rejestrze A0 */
* int NumerPom; /* w rejestrze D1 */
* long Wynik; /* w rejestrze D0 */
Pomiar DS.B Pomiar_L pomiar_t Pomiar;
* Dostep do elementu tablicy wewnatrz struktury
ORG ROM
* Inicjacja wskaznika struktury
MOVEA.L #Pomiar,A0 ptr = &Pomiar;
* Inicjacja indeksu w tablicy
MOVE.L #0,D1 NumerPom = 0;
* odczyt pomiaru z tablicy
MOVE.L Temp(A0,D1.L*4),D0 Wynik = ptr->Temp[NumerPom];
1.4.11 Tryb po´sredni licznika rozkaz´ow z przesunieciem (program counter indirect with displa-, cement)
Szczeg´olne zalety ma mo˙zliwo´s´c u˙zycia licznika rozkaz´ow jako rejestru bazowego. Taki tryb adresowania pozwala stworzy´c kod maszynowy dzia lajacy niezale˙znie od po lo˙zenia w pami, eci (PIC – Position Independent Code)., Adres jest tworzony przez dodanie rozszerzonego znakowo przesuniecia do zawarto´sci licznika rozkaz´, ow po pobraniu pierwszego s lowa rozkazu:
EA= (P C) + 2 + ((P C) + 2)SEX
Pozornie skomplikowane zadanie obliczania warto´sci przesuniecia jest przerzucone na asembler, kt´ory oblicza, r´o˙znice pomi, edzy bi, e˙z, ac, a warto´sci, a swojego licznika adresowego, a warto´sci, a przypisan, a nazwie (etykiecie), okre´slajacej miejsce w pami, eci, do kt´orego si, e odwo lujemy.,
ORG ROM
Napis DC.B ’Ala ma kota’
DC.B 0
*
* Dostep do pierwszego znaku napisu MOVE.B Napis(PC),D0
Zalety tego trybu adresowania sa jeszcze lepiej widoczne przy u˙zyciu instrukcji, LEA(Load Effective Address), kt´ora obliczony dla u˙zytego w niej trybu adresowania adres wynikowy przesy la do zadanego rejestru adreso- wego. Dalej mo˙zna tego rejestru u˙zy´c jako bazowego dla innych (w szczeg´olno´sci automodyfikowalnych lub indeksowych) tryb´ow:
ORG ROM
Napis DC.B ’Ala ma kota’
DC.B 0
*
* Inicjacja rejestru bazowego LEA.L Napis(PC),A0
*
* Dost/ep do kolejnych znakow napisu MOVE.B (A0)+,Port
Pole trybu –%111, pole rejestru –%010, przesuniecie – 16-bitowe.,
Zwr´o´cmy uwage, ˙ze prawid lowe zastosowanie tego trybu pozwala uzyska´c niezale˙zno´s´c kodu od po lo˙zenia, jak, r´ownie˙z jego wsp´o lu˙zywalno´s´c (sharable/reentrant code). Opisany tryb jest przeznaczony do odczytu, a nie do zapisu danych. Nie stanowi to jednak ˙zadnego ograniczenia. W systemach wielozadaniowych r´o˙zne procesy moga korzysta´c z tej samej kopii kodu w r´o˙znych chwilach. Nie mog, a jednak modyfikowa´c stanu zmiennych, globalnych zwiazanych z tym kodem. Dla zmiennych lokalnych stosuje si, e r´o˙zne rozwi, azania (lokalne wska´zniki, obszaru danych statycznych dla procesu, dane dynamiczne – na stosie itp.).
1.4.12 Tryb po´sredni licznika rozkaz´ow z indeksem i przesunieciem (program counter indirect, with index and displacement)
Analogicznie do poprzedniego, ten tryb pozwala sie odwo lywa´c do danych zawartych w kodzie programu. Tym, razem moa to by´c tablice, jak to by lo przy trybie indeksowym z rejestrem bazowym. Pole trybu –, %111, pole rejestru –%011. Teraz role rejestru bazowego pe lni licznik rozkaz´, ow (jego zawarto´s´c jest zmodyfikowana o 2 po pobraniu kodu rozkazu):
EA= (P C) + 2 + ((P C) + 3)SEX+ (Xm)SEX
Pozosta le informacje, dotyczace drugiego s lowa rozkazowego nie ulegaj, a zmianie.,
Przyk ladem zastosowania tego trybu mo˙ze by´c tablica konwersji danych wpisana do kodu programu:
ORG ROM
* Deklaracja danych stalych const char
TabPierw DC.B 1,2,3,5,7,11 TabPierw[6] = {1,2,3,5,7,11}
* Inicjacja indeksu w tablicy
MOVE.W #5,D1 NumerLiczby = 5;
* Odczyt liczby z tablicy
MOVE.B TabPierw(PC,D1.W),D0 Wynik = TabPierw[NumerLiczby];
W procesorach poczawszy od MC68020 wprowadzono skalowanie indeksu w tym trybie na identycznej zasadzie,, jak w trybie indeksowym z rejestrem adresowym.
1.5 Rozszerzenia tryb´ ow adresowania w rodzinie M68K
Ju˙z przy omawianiu tryb´ow indeksowych okaza lo sie, ˙ze procesor MC68020 wni´os l istotne rozszerzenia nie tylko, w dziedzinie spretowej, ale r´ownie˙z do adresowania. Przedstawimy teraz cztery indeksowe tryby adresowania,, kt´ore pojawi ly sie w tym procesorze i w rzeczywisto´sci dostarczy ly kilku tryb´ow pochodnych.,
Wr´o´cmy do drugiego s lowa rozkazowego w trybach indeksowych. Bitb8(dotychczas zawsze ustawiony na warto´s´c
”0”) sta l sie flag, a wyr´o˙zniaj, ac, a nowe tryby. W przypadku ustawienia tego bitu na ”1”, dolny bajt drugiego, s lowa rozkazowego przestaje by´c traktowany jako 8-bitowe przesuniecie i otrzymuje now, a rol, e:,
bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 1 1 1 0 1 0 0 1 0 0 0 1 0
D/A ‘---v---’ W/L ‘-v-’ BS IS ‘-v-’ ‘---v---’
typ / numer /czesc skala | | rozmiar I/IS rejestru indeksowego elem. | | przes.
| |_______ brak indeksowania
|______ brak rejestru bazowego
Jak wida´c, mo˙zliwe jest wy laczenie rejestru bazowego, rejestru indeksowego, wyb´or wielko´sci przesuni, ecia ba-, zowego (w tym wielko´sci zerowej, nie wymagajacej dalszych s l´, ow rozkazowych) i wreszcie – wyb´or trybu in- deksowania. Znaczenie poszczeg´olnych opcji bedzie ja´sniejsze po om´owieniu podstawowych odmian po´srednich, tryb´ow indeksowych.
1.5.1 Tryb adresowania po´sredniego przez pamie´,c z postindeksacja (memory indirect postinde-, xed)
Tym razem zaczniemy od algorytmu tworzenia adresu efektywnego:
EA= ((An) +bdSEX) + (Xm)SEX? SCALE+odSEX
Adres wynikowy sk lada sie tu z:,
• zawarto´sci 32-bitowego s lowa zaadresowanego przez zawarto´s´c rejestru bazowego z przesunieciem, base displacement: ((An) +bdSEX)
• zawarto´sci rejestru indeksowego ze skalowaniem : (Xm)? SCALE
• zewnetrznego przesuni, ecia, outer displacement: odSEX
Zauwa˙zmy, ˙ze ten tryb adresowania sk lada sie z dw´och omawianych wcze´sniej tryb´ow po l, aczonych kaskadowo., Tryb po´sredni rejestru adresowego z przesunieciem s lu˙zy do pobrania z pami, eci adresu bazowego dla trybu, indeksowego. Zewnetrzne przesuni, ecie odnosi si, e do tego w la´snie trybu. W ten z lo˙zony spos´ob mo˙zna si, e, odwo la´c w jednym adresie wynikowym do:
wybranego (Xm, SCALE) elementu tablicy bed, acej polem (bd, SEX) struktury wskazywanej przez wska´znik zawarty w polu (odSEX) struktury wskazywanej przez zawarto´s´c rejestru bazowego (An) .
Rozbudujmy wcze´sniejszy przyk lad:
* Definicja struktury pomiar_t
ORG 0
typedef struct{
Datas DS.B Data_L data_t Datas;
Temp DS.L 24 long Temp[24];
* } pomiar_t;
Pomiar_L
* Pomiar_L = sizeof(pomiar_t);
* Definicja struktury pacjent_t
ORG 0
typedef struct{
Nazwisko DS.B 20 char Nazwisko[20];
Imie DS.B 20 char Imie[20];
Badanie_p DS.L 1 pomiar_t *Badanie_p;
* } pacjent_t;
Pacjent_L
* Pacjent_L = sizeof(pacjent_t);
* Deklaracje zmiennych
ORG RAM
* pacjent_t *ptr; /* w rejestrze A0 */
* int NumerPom; /* w rejestrze D1 */
* long Wynik; /* w rejestrze D0 */
Pacjent DS.B Pacjent_L pomiar_t Pacjent;
* Dostep do elementu tablicy wewnatrz struktury
ORG ROM
* Inicjacja wskaznika struktury zewnetrznej
MOVEA.L #Pacjent,A0 ptr = &Pacjent;
* Inicjacja indeksu w tablicy wewnetrznej
MOVE.W #12,D1 NumerPom = 12;
* odczyt pomiaru z tablicy
MOVE.L ([Badanie,A0],D1.W*4,Temp),D0
* Wynik = ptr->Badanie->Temp[NumerPom];
Jak wida´c, w pojedynczym adresie docieramy do elementu tablicy podw´ojnie zag lebionej w strukturach. Nazwa
1.5.2 Tryb adresowania po´sredniego przez pamie´,c z preindeksacja (memory indirect preindexed), Odwr´ocenie kolejno´sci tryb´ow sk ladowych daje:
EA= ((An) +bdSEX+ (Xm)SEX? SCALE) +odSEX
Tak mo˙zemy sie odwo la´c do:,
pola (odSEX) struktury wskazywanej przez wska´znik bed, acy wybranym (Xm, SCALE) elementem, tablicy bed, acej polem (bd, SEX) struktury wskazywanej przez zawarto´s´c rejestru bazowego (An). Oto ilustracja:
* Definicja struktury data_t
ORG 0
typedef struct{
Dzien DS.B 1 char Dzien;
Miesiac DS.B 1 char Miesiac;
Rok DS.W 1 short Rok;
* } data_t;
Data_L
* Data_L = sizeof(data_t);
* Definicja struktury wizyty_t
ORG 0
typedef struct{
Nazwisko DS.B 20 char Nazwisko[20];
Imie DS.B 20 char Imie[20];
DniWiz DS.L 30 data_t * DniWiz[30];
* } wizyty_t;
Wizyty_L
* Wizyty_L = sizeof(wizyty_t);
* Deklaracje zmiennych
ORG RAM
* wizyty_t *ptr; /* w rejestrze A0 */
* int NumerWiz; /* w rejestrze D0 */
* char DzienW; /* w rejestrze D1 */
Wizyty DS.B Wizyty_L wizyty_t Wizyty;
ORG ROM
* Inicjacja wskaznika struktury zewnetrznej
MOVEA.L #Wizyty,A0 ptr = &Wizyty;
* Inicjacja indeksu w tablicy zewnetrznej
MOVE.W #12,D0 NumerWiz = 3;
* odczyt pomiaru z tablicy
MOVE.L ([DniWiz,A0,D0.W*4],Dzien),D0
* DzienW = ptr->DniWiz[NumerWiz]->Dzien;
W opisanym trybie adresowanie indeksowe jest wykonywane w celu znalezienia w pamieci adresu po´sredniego,, stad nazwa ”preindeksacja”.,
W obu powy˙zszych trybach wystepuj, a dwa sta le przesuni, ecia: wewn, etrzne (bazowe) i zewn, etrzne. S, a one, umieszczane po drugim s lowie rozkazu w takiej w la´snie kolejno´sci. Jak wspomniano wcze´sniej, jest wiele wa- riant´ow tryb´ow adresowania za po´srednictwem pamieci, kt´ore wynikaj, a z pomini, ecia niekt´orych sk ladnik´, ow
adresu wynikowego. W odniesieniu do podanych wcze´sniej element´ow dolnego bajtu drugiego s lowa rozkazo- wego warianty te zawarte sa w tabelach:,
Pole Definicja
BS wykluczenie rejestru bazowego Base register Suppress
0 = jest rejestr bazowy 1 = brak rejestru bazowego IS wykluczenie indeksu
Index Suppress 0 = jest indeksowanie 1 = brak indeksowania BD SIZE rozmiar przesuniecia bazowego,
Base Displacement SIZE 00 = zarezerwowane 01 = zerowe przesuniecie, 10 = 16-bitowe przesuniecie, 11 = 32-bitowe przesuniecie, I/IS wyb´or podtryb´ow
Index/Indirect Selection
wraz z polem IS opisane w nastepnej tablicy,
IS I/IS Opis trybu
0 000 brak odwo lania po´sredniego
0 001 preindeksacja bez zewnetrznego przesuni, ecia,
0 010 preindeksacja z 16-bitowym zewnetrznym przesuni, eciem, 0 011 preindeksacja z 32-bitowym zewnetrznym przesuni, eciem, 0 100 zarezerwowane
0 101 postindeksacja bez zewnetrznego przesuni, ecia,
0 110 postindeksacja z 16-bitowym zewnetrznym przesuni, eciem, 0 111 postindeksacja z 32-bitowym zewnetrznym przesuni, eciem, 1 000 brak odwo lania po´sredniego
1 001 po´srednie bez zewnetrznego przesuni, ecia,
1 010 po´srednie z 16-bitowym zewnetrznym przesuni, eciem, 1 011 po´srednie z 32-bitowym zewnetrznym przesuni, eciem, 1 100–111 zarezerwowane