• Nem Talált Eredményt

A processzor címzési és adatelérési folyamata

In document Az ábrák listája (Pldal 143-151)

A táblázatok listája

1. A számítógép memóriájának felépítése és működéseműködése

2.3. A processzor címzési és adatelérési folyamata

Következő feladatunk azt megérteni, hogy mindez hogyan áll össze egy teljes folyamattá, és hogy zajlik a memóriában lévő számoknak értelmezése és előre megtervezett végrehajtása. Korábban azt tapasztaltam, hogy ha erről a folyamatról nincs valakinek biztos alapú szemléletes képe, akkor az assembly programozás elemi lépéseinek megértése is gondokat okoz, ezért ezt a folyamatot részletesebben, lépésről-lépésre tanulmányozzuk.

Vegyünk tehát egy interaktív prezentációt, mellyel a fentiek reményeink szerint könnyen érthetővé válnak. A modell és a külső megjelenés kialakításánál nem az volt a célunk, hogy egy processzor teljes működését tökéletesen szimuláljuk, de törekedtünk arra, hogy a címszámítási és az utasítás végrehajtási folyamat minden fontos részletéről szemléletes képet adjunk, mely alapján a regiszterek használata és a gépi kód végrehajtása érthetővé válik.

Képzeletbeli processzorunk nyolc bites adatkezelésű és éppen húsz bites multiplexelt adat és címbusszal rendelkezik, valamint ismeri az Intel gépi kódok egy szűk részhalmazát. A reset gomb megnyomásával feltölti a reset címet egy feltétel nélküli vezérlés átadási utasítással, valamint az ugrási címen egy kis programmal, ahol két számot adunk össze. Megjegyezzük, hogy a reset programrészlet éppen az intel processzorokra írt operációs rendszerek közös első utasítása (EA 5B E0 00 FF), vagyis mostantól büszkén azt mondhatnánk, hogy fejből tudjuk minden intel alapú operációs rendszer első gépi kódját.

6-7. ábra - http://gate575.hu/ITMagister/Memory

Előbányásztunk egy 1985-ből (1985.06.10) származó DOS operációs rendszer reset jump környezetének eredeti forrás nyelvi listáját (lásd ), ahol látható az ominózus jump kód (0xEA), a pedig egy napjainkban használt Windows7-en futó cmd parancs reset dump-ját mutatja ugyanazzal a kóddal, 2005.10.21–es release marker-rel.

6-8. ábra - http://gate575.hu/ITMagister/Memory

A processzor tehát belső regiszterekből áll és a gépi kódok, amit a processzor beolvas, maga a program, amit végre kell hajtania. Azt az elvi kialakítást, melyben az adatok és a programok egy időben, ugyanabban az elérhetőségű memóriában vannak, Neumann-i architektúrának nevezzük, és az ötlet a magyar származású Neumann Jánostól ered (lásd ).

6-9. ábra - http://gate575.hu/ITMagister/Memory

A által mutatott interaktív prezentáción láthatóak a processzor belső regiszterei, valamint a címszámítást magyarázó húszbites kimeneti regiszter, és a fizikai cím kiszámításában közreműködő tizenhat bites szegmens és az ofszetet adó regiszterek.

6-10. ábra -

http://gate575.hu/ITMagister/CpuMemoryhttp://gate575.hu/ITMagister/Memory

A lépésenkénti üzemmódban egy 22 lépéses végrehajtási szekvenciában részletes magyarázatokkal és animációkkal kísérhető végig a végrehajtás úgy, hogy minden lépésnél automatikusan megjelenik az adott lépés részletes leírása és a hozzátartozó információs táblák.

Például az add utasítás dekódolási fázisánál megmutatjuk az utasítások kódolását az operációs kód és a címzési bájt elemzésével. Külön figyelmet érdemel az adat és címbusz tartalmának azonos jelvezetékeken történő eltérő időzítésű kezelése, amit multiplexelési technikának hívunk (lásd ). Ez azt jelenti, hogy a húsz címbit legalacsonyabb helyi értékű bájtja csak a buszciklus első processzorciklusa (CPU ciklus) alatt tartalmazza a címbiteket, a második CPU ciklus alatt már az adatbitek lesznek a buszon.

6-11. ábra - http://gate575.hu/ITMagister/Memory

Vagyis szükséges, hogy a pontosan ismert időzítésű és a processzor egyéb jelvezetékein megjelenő jeleket az adat és a címbusz vonatkozásában szétválasszuk egymástól a számítógép egyéb áramkörei számára. Ehhez olyan speciális tároló áramköröket használunk melyek egy meghatározott időben és jel-kombináció esetén leolvassák a busz cím vagy adatbitjeit, majd a kimenetükön a következő buszciklusig megtartják a lekapuzott (kapuk segítségével kiolvasott) tartalmat. Ezek az integrált áramkörök a 74LS373 és az 74LS245 IC-k.

6-12. ábra -

http://gate575.hu/ITMagister/CpuMemoryhttp://gate575.hu/ITMagister/Memory

A működés közben mutatja prezentációnkat. Ahhoz, hogy megérthessük, be kell vezetnünk egy adatmozgató utasítást, melyet nagyon részletesen fogunk még venni, de most csak úgy használjuk, hogy ennek az utasításnak az eredményeképpen feltöltjük a processzor bizonyos regisztereit egy-egy adattal. Például a mov al,5 az AX regiszter alsó bájtját tölti fel egy 5-ös értékkel. A mov bl,7 pedig a BX regiszter alsó bájtját 7-el. Az add al,bl utasítás összeadja az al tartalmát a bl-lel és az eredményt az al-be helyezi, miközben annak régi tartalma elvész.

Hajtsuk végre a lépésenkénti üzemmódban a tárolt programunkat. Ehhez nyomjuk meg az „Indítás” feliratú nyomógombot. Az alábbiakban megadjuk az egyes lépések leírását.

2.3.1. Reset állapot.

A reset állapot aktív magas szintű jelére a processzor alapállapotba kerül, ha ez a jel legalább 4T (órajel) ideig fennáll. Amikor a magas szintű jel a rendszertáppal együtt érkezik, akkor az alapállapot eléréséhez elég, ha a magas szintű jel 50 nsec ideig tart. Az inicializálást a reset jelnek a negyedik órajel (T) után visszatérő első alacsony szintje indítja. Az inicializálási folyamat a következő regisztereket érinti tartalmuk törlésével, vagyis 'kinullázásukkal': [AX,BX,CX,DX,ES,DS,SI,DI,SP,BP,IP]. A kódszegmens 0xFFFF tartalmat kap, ami azt jelenti, hogy a reset utáni első operációs kódot az időközben beállított PC:0x0000 miatt az [FFFF:0000] logikai, azaz az 0xFFFF0 fizikai címen keresi a processzor.

2.3.2. Operációs kód beolvasás állapot

A reset inicializálásával beállított címről (az ún. reset-címről) a processzor beolvassa az első bájtot, amit, mint operációs kódot fog értelmezni. Ez a bájt általában egy hosszú ugró utasítás kódja, vagyis az utasítást követő bájtok tartalmazzák a célcím szegmens és offszet értékét is, kétszer két 8 bites adat formájában. Ezek az ugró utasítás operandusai. A bájtok a Little Endian szerinti alacsony-magas bájt sorrendűek, vagyis az operációs kódot az offszet alacsony helyi értékű bájtja, majd az offszet magas helyi értékű bájtja követi, ezután következik a szegmens alacsony és magas helyi értékű bájtja EA,5B,E0,00,F0 sorrendben. A processzor a beolvasás eredményét (mint operációs kódot) egy átmeneti belső regiszterben tárolja a dekódolásig. A teljes utasítás feldolgozása az operációs kód után az operandusok beolvasásával folytatódik. A következő operációs kódot az operandusok által meghatározott címen keresi, vagyis az [F000:E05B] logikai, azaz az 0xFE05B fizikai címen.

2.3.3. Operációs kód értelmezése állapot

Az előzőekben beolvasott 0xEA kódot a processzor utasításként értelmezi. Ez az utasítási esetszétválasztás szerint egy olyan feltétel nélküli vezérlés-átadást jelent, ahol az utasítást követő négy bájt határozza meg azt a szegmens és offszet címet, ahol a processzor a következő utasítást találja. Ezért a processzor a dekódolás után

még négy db bájtos olvasást hajt végre, és az egyes operandusokkal később a CS, és a PC regisztereket tölti fel.

Ennek eredményeképpen a program végrehajtása az adott új címen folytatódik. A beolvasandó bájtok sorrendben a következők: 5B,E0,00,F0. Ez azt jelenti, hogy a Little Endian szerinti offszet low és high, valamint szegmens low és high bájt sorrendben olvassa be a processzor az ugrási utasítás operandusait. Minden olvasáskor a PC tartalmát eggyel növeli a következő operandus eléréséhez. A következő cím tehát, ahonnan az offszet low bájtját fogja beolvasni: [FFFF:0001] logikai, azaz az 0xFFFF1 fizikai címen található.

2.3.4. Az EA ugrási utasítás 1. operandusának beolvasása állapot

Az előzőekben beolvasott 0xEA kódot követő ugrási cím offszetje alacsony bájtjának beolvasása az [FFFF:0001] logikai, azaz az 0xFFFF1 fizikai címről, melynek értéke 0xB5.

2.3.5. Az EA ugrási utasítás 2. operandusának beolvasása állapot

Az előzőekben beolvasott 0xEA kódot követő ugrási cím offszetje magas bájtjának beolvasása az [FFFF:0002]

logikai, azaz az 0xFFFF2 fizikai címről, melynek értéke 0xE0.

2.3.6. Az EA ugrási utasítás 3. operandusának beolvasása állapot

Az előzőekben beolvasott 0xEA kódot követő ugrási cím szegmense alacsony bájtjának beolvasása az [FFFF:0003] logikai, azaz az 0xFFFF3 fizikai címről, melynek értéke 0x00.

2.3.7. Az EA ugrási utasítás 4. operandusának beolvasása állapot

Az előzőekben beolvasott 0xEA kódot követő ugrási cím szegmense magas bájtjának beolvasása az [FFFF:0004] logikai, azaz az 0xFFFF4 fizikai címről, melynek értéke 0xF0.

2.3.8. Az EA ugrási utasítás végrehajtása állapot

Az előzőekben beolvasott 0xEA kód és az operandusai szerinti ugrás végrehajtása. Az eredeti cím, ahonnan az ugrás történik, éppen az aktuális cím, vagyis az [FFFF:0004] logikai, azaz az 0xFFFF4 fizikai cím, melyről az operandusok szerinti [F000:E05B] logikai, azaz 0xFE05B fizikai címre történik az ugrás. Maga a művelet úgy hajtódik végre, hogy a következő olvasási ciklusra a code segmens (CS regiszter) és a program counter (IP/PC regiszter) tartalma az átmenetileg tárolt és előzőleg már beolvasott cím (F000:E05B) adatokkal íródik felül.

Tehát a CS: 0xF000 és a PC: 0xE05B tartalmat veszik fel. A következő utasítást a processzor már erről az új 0xFE05B címről olvassa be.

2.3.9. Operációs kód beolvasás állapot

A végrehajtott feltétel nélküli vezérlésátadás után az új ([F000:E05B] logikai, azaz 0xFE05B fizikai címről ismét egy operációs kód betöltése indul, melyet a processzor az átírt CS:PC alapján talál meg. Ennek az utasításnak a beolvasása előtt az előző utasítás operandusainak átmeneti tárolása megszűnik.

2.3.10. Operációs kód értelmezése állapot

Az előzőekben beolvasott 0xB0 kódot a processzor, mint utasítást, értelmezi. Ez az utasítási esetszétválasztás szerint egy olyan adatmozgató utasítást jelent, melynek a célregisztere az akkumulátor alacsony helyi értékű bájtja. Az utasítás dekódolásából az is nyilvánvaló, hogy a mozgatandó adat közvetlen címzésű, vagyis az operációs kódot követő - a kódszegmens (CS) és az utasításszámláló (IP/PC) által mutatott - cím + 1. memória rekeszben van. Ez azt jelenti, hogy az utasítás végrehajtásához a processzornak még egy darab bájtos olvasást kell megvalósítania, hogy utána a beolvasott bájt adatot az akkumulátor (al) regiszterbe töltse. A digitális számítógépek működésének leggyakrabban végrehajtott utasítása valamilyen adatmozgató utasítás.

2.3.11. A 0xB0 (mov al,2) adatmozgató utasítás operandusának beolvasása állapot

Az előzőekben beolvasott 0xB0 kódot követő ún. közvetlen címzésű operandus beolvasása az [F000:E05C]

logikai, azaz az 0xFE05C fizikai címről, melynek értéke 0x02. A beolvasással egyidejűleg megtörténik az operáció végrehajtása is, azaz a beolvasott 0x02 bekerül az ax regiszter alsó bájtjába.

2.3.12. Operációs kód beolvasás állapot

A következő operációs kódot az adatmozgató mov al,2 utasítás és annak operandusa után találja a processzor, melynek címe [F000:E05D] logikai, azaz 0xFE05D fizikai cím. Az utasítás most a: mov bl,xx parancs (tehát egy másik adatmozgató utasítás) aminek kódja: 0xB3.

2.3.13. Operációs kód értelmezése állapot

Az előzőekben beolvasott 0xB3 kódot a processzor, mint utasítást, értelmezi. Ez az utasítási esetszétválasztás szerint egy olyan adatmozgató utasítást jelent, melynek a célregisztere a BX regiszter alacsony helyi értékű bájtja. Az utasítás dekódolásából az is nyilvánvaló, hogy a mozgatandó adat közvetlen címzésű, vagyis az operációs kódot követő - a kódszegmens (CS) és az utasításszámláló (IP/PC) által mutatott - cím + 1. memória rekeszben van. Ez azt jelenti, hogy az utasítás végrehajtásához a processzornak még egy darab bájtos olvasást kell megvalósítania, hogy utána a beolvasott bájt adatot a bl regiszterbe töltse.

2.3.14. A 0xB3 (mov bl,3) adatmozgató utasítás operandusának beolvasása állapot

Az előzőekben beolvasott 0xB3 kódot követő ún. közvetlen címzésű operandus beolvasása a [F000:E05E]

logikai, azaz az 0xFE05E fizikai címről, melynek értéke 0x03. A beolvasással egyidejűleg megtörténik az operáció végrehajtása is, azaz a beolvasott 0x03 bekerül a bx regiszter alsó bájtjába.

2.3.15. Operációs kód beolvasása állapot

A következő operációs kódot az adatmozgató mov bl,3 utasítás és annak operandusa után találja a processzor, melynek címe [F000:E05F] logikai, azaz az 0xFE05F fizikai cím. Az utasítás most az: add al,bl parancs (tehát egy aritmetikai utasítás), aminek kódja: 0x00.

2.3.16. A 0x00 (add) aritmetikai utasítás dekódolása állapot

A beolvasott 0x00 kód egy aritmetikai utasítást jelent. Az utasítás azonban nem tartalmazza a forrás és a cél regiszterekre való hivatkozást, hanem csak az aritmetikai műveletet azonosítja. A processzor tervezői úgy oldották meg az összeadásban résztvevő forrás és cél regiszterek, esetleg memória meghatározását, hogy az utasítást követően még egy ún. címzési bájtot feltételeznek az utasítás primer kódja után. Ennek a szerkezete egy db két bites és két db három bites bitmintából áll, melynek elemzésével pontosan meghatározható, hogy az adott utasítás által meghatározott feladat mely regiszterek közötti hajtódjék végre. A két bites mező neve MOD, a két három bitesé pedig rendre REG és R/M, a bájtban MOD REG R/M sorrendben helyezkednek el.

2.3.17. A 00 (add) utasítás címzési bájtjának beolvasása állapot

A beolvasott 0x00 kód egy aritmetikai utasítást jelent. Az utasítás azonban nem tartalmazza a forrás és a cél regiszterekre való hivatkozást, hanem csak az aritmetikai műveletet azonosítja. A processzor tervezői úgy oldották meg az összeadásban résztvevő forrás és cél regiszterek, esetleg memória meghatározását, hogy az utasítást követően még egy ún. címzési bájtot feltételeznek az utasítás primer kódja után. Ennek a beolvasása zajlik most.

2.3.18. A 00 (add) aritmetikai utasítás dekódolása állapot

A beolvasott 0x00 kód egy aritmetikai utasítást jelent. Az utasítás azonban nem tartalmazza a forrás és a cél regiszterekre való hivatkozást, hanem csak az aritmetikai műveletet azonosítja. A processzor tervezői úgy oldották meg az összeadásban résztvevő forrás és cél regiszterek, esetleg memória meghatározását, hogy az utasítást követően még egy ún. címzési bájtot feltételeznek az utasítás primer kódja után. Ennek a szerkezete egy db két bites és két db három bites bitmintából áll, melynek elemzésével pontosan meghatározható, hogy az adott utasítás által meghatározott feladat mely regiszterek/memóriatartalmak közötti hajtódjék végre. A két bites mező neve: MOD a két három bitesé pedig rendre REG és R/M, a bájtban MOD REG R/M sorrendben helyezkednek el.

Az ADD operációs kód szerkezete az ban látható:

ADD operációs

kód 7 6 5 4 3 2 1 0

0 0 0 0 0 0 d w

A fenti táblázatban d (direction) bit a művelet irányát jelzi. d=0 esetén a REG-ből az R/M felé, d=1 esetén pedig R/M-ből REG felé zajlik a művelet. A w (wide) bit a műveletben résztvevő operandusok szélességéről hordoz információt. w=0 esetén 8 bites, w=1 esetén pedig 16 v. 32 bites operandusok vesznek részt az utasításban.

Az utasítást követő címzési bájt szerkezetű a szerint:

MOD-REG-R/M bájt 7 6 5 4 3 2 1 0

MOD REG R/M

A felső két bit, a MOD bitek az utasítás 2. operandusában használt címzési módot határozza meg.

A címzési módokat később részletesen bemutatjuk, ezért a ban magyarázat nélkül felsoroljuk a MOD bitek jelentését:

00 Memória címzés A címszámításban az R/M mező által meghatározott regiszterek vesznek részt, nincs eltolás (displacement) a címzésben

01 Memória címzés A címszámításban az R/M mező által meghatározott regiszterek vesznek részt. Az eltolás 8 bites, 16 bitre kiterjesztve homogén előjel kiterjesztéssel.

Pld. ('11111111 00000111' jelenti - 7 )

10 Memória címzés A címszámításban az R/M mező által meghatározott regiszterek vesznek részt. Az eltolás 16 bites

11 Regiszter címzés Az utasításban regiszterek vesznek részt, a REG bitek és az R/M bitek is egy-egy regisztert kódolnak

Számunkra most a MOD=11 érdekes. Ekkor a REG, illetve az R/M bitek értéke a szerint a következő lehet:

REG és

1 0 1 CH BP

1 1 0 DH SI

1 1 1 BH DI

Az fenti táblázatokon az add al,bl utasítás kódolása is nyomon követhető. Az utasítás bájtja 0x00 = 0b0000 0000. A kódban tárolt w bit értéke 0, ezért bájtos műveletről van szó, a d bit szintén 0, vagyis az R/M mezőtől a REG mező irányába zajlik a művelet. A címzési bájt 0xD8 = 0b11 011 000. Ez azt jelenti, hogy a MOD bitminta 11, vagyis regiszterek között zajlik a művelet, a REG bitminta 011, vagyis a w =0 miatt BL vesz részt a műveletben, az R/M bitminta pedig 000, ami a w=0 miatt az AL regisztert jelöli ki.

2.3.19. Processzoron belüli AL+BL → AL állapot

A beolvasott címzési bájt alapján a korábban feltöltött AL=02 és BL=03 tartalmak között egy olyan összeadási művelet zajlik le, melynek célregisztere az AL. Az AL korábbi tartalma elvész, illetve felülíródik az eredményül kapott 05 adattal.

2.3.20. Operációs kód beolvasás állapot

A következő operációs kódot az összeadás után az [F000:E061] logikai, azaz az 0xFE061 fizikai címről olvassa be a processzor. Ez a hlt parancs, ami egy vezérlő utasítás.

2.3.21. Operációs kód értelmezése állapot

Az előzőekben beolvasott F4 kódot a processzor, mint utasítást, értelmezi. Ez az utasítási esetszétválasztás szerint egy olyan vezérlési utasítás, ami arra utasítja processzort, hogy a regiszterek tartalmának érintetlenül hagyása mellett álljon le. Ez azt jelenti, hogy nem olvassa be a F4 utáni bájtot, mint operációs kódot, a folyamatos programvégrehajtás megszűnik. Újraindítani csak egy RESET, vagy egy, a processzor meghatározott bemenetére érkező külső jellel lehet (NMI) lehet.

In document Az ábrák listája (Pldal 143-151)