ASM vizsgasor
From WIKi
A feladatsor tele van hibákkal, használata nem ajánlott.
Első csoport . . . Utasítások . . . Eljárások . . . Megírandó programok . . . Mit ír ki a program??
Milyen adattípusokat támogatnak a 80x86-os processzorok?
- Méret szerint (a processzor számára valójában csak ez fontos).
Ezek az ú.n. assembly alaptípusok.
- BYTE, = 1 byte
- WORD, = 2 byte
- DWORD, = 4 byte
- QWORD, = 8 byte
- TBYTE, = 10 byte
- Jelentés szerint
- logikai kifejezések - boolean (1 byte)
- karakterek - char
- karakterfüzér - string
- valós számok
- rövid - real32
- hosszú - real64
- belső - real80
- egész
- pozitív egész (természetes szám)
- egyszerű bináris - uns8, uns16, uns32
- BCD (HLA nem támogatja)
- tömörített (1 byte 2 egész szám)
- zónázott (2 byte)
- előjeles egész
- bináris (1,2,4,8 byte) (kettes komplemens) - int8, int16, int32
- BCD(10 byte pakolt) (előjel byte)
- pozitív egész (természetes szám)
- mutató - pointer, pointer to int16
Mi a kettes komplemens, hogyan kell meghatározni?
Kétféle, egymástól nem független, értelemben szoktuk használni a kettes komplemens kifejezést.
- Egy bitsorozatokon értelmezett transzformáció. Egy n-bit
hosszúságú bitsorozat kettes komplemensét, egy másik n-bit hosszúságú
bitsorozatot, meghatározhatjuk az alábbi módszerek bármelyikével:
- Egyet hozzáadunk az ú.n. egyes komplemenséhez. (Az egyes
komplemens képzéséhez a sorozat minden bitjét az ellentettjére kell
fordítani, azaz a 0-k helyére 1-eseket, az 1-esek helyére 0-kat kell
írni.) Megj. A kettes komplemens kettes komplemense mindig maga az
eredeti szám. Példák.
- BS1=%0_1101_1001, Egyes_komplemens(BS1)=%1_0010_0110, Kettes_komplemens(BS1)= %1_0010_0111
- BS2=%1_1101_1000, Egyes_komplemens(BS2)=%0_0010_0111, Kettes_komplemens(BS2)= %0_0010_1000(=BS3)
- BS3=%0_0010_1000, Egyes_komplemens(BS3)=%1_1101_0111, Kettes_komplemens(BS3)= %1_1101_1000(=BS2)
- BS4=%01_1001, Egyes_komplemens(BS4)=%10_0110, Kettes_komplemens(BS4)=%10_0111(=BS5)
- BS5=%10_0111, Egyes_komplemens(BS5)=%01_1000, Kettes_komplemens(BS5)=%01_1001(=BS4)
- Csökkentjük egyel a számot, majd vesszük az egyes
komplemensét:
- BS1=%0_1101_1001, BS1-1=%0_1101_1000, Kettes_komplemens(BS1)=Egyes_komplemens(BS1-1)=%1_0010_0111
- Kivonjuk a számot 2n-ből.
- BS4=%01_1001 (n=6, 26=64, BS4=25), Kettes_komplemens(BS4)=64-25=39=%10_0111(=BS5)
- BS5=%10_0111 (n=6, 26=64, BS5=39), Kettes_komplemens(BS5)=64-39=25=%01_1001(=BS4)
- Egyet hozzáadunk az ú.n. egyes komplemenséhez. (Az egyes
komplemens képzéséhez a sorozat minden bitjét az ellentettjére kell
fordítani, azaz a 0-k helyére 1-eseket, az 1-esek helyére 0-kat kell
írni.) Megj. A kettes komplemens kettes komplemense mindig maga az
eredeti szám. Példák.
- Előjeles egészek ábrázolására használt módszer. A szám előjelét
a legmagasabb helyiértékű bit határozza meg. Ez a bit pozitív számok
esetén 0, míg negatív számok esetén 1. A negatív számok ábrázolására az
abszolút értékük fentebb ismertetett kettes komplemensét használjuk.
Ennél a számábrázolási módnál a kettes komplemens képzés ekvivalens az
előjelváltással.
- Ha a szám pozitív (legmagasabb helyiértékű bitje 0), akkor az értékét ugyanúgy határozzuk meg, mint az előjel nélküli számok esetén. Másként fogalmazva: az olyan bitsorozatok, melyeknek legmagasabb helyiértékű bitje 0, azonos értéket képviselnek akár előjelesen, akár előjel nélküli természetes számként értelmezzük őket.
- Ha a szám negatív (legmagasabb helyiértékű bitje 1), akkor az abszolut értékét úgy határozhatjuk meg, hogy képezzük az kettes komplemensét.
- A kettes komplemens módszerrel történő előjeles egész ábrázolás esetén az n-biten ábrázolható 2n különböző szám közül 2^{n-1} lesz negatív (-2n-1 .. -1) és ugyanennyi nem-negatív (0 .. 2n-1-1).
- Egy fontos példa: Hogyan ábrázoljuk a (-1)-et n biten? Kiindulunk a +1-ből. Ezt n-1 db 0-t követő 1 db 1-es segítségével írhatjuk le (%000...001). Ha ennek képezzük a kettes komplemensét, ami a fentiek szerint megfelel az előjel váltásnak, megkapjuk a (-1) helyes ábrázolási képét. Első lépésben képezzük az egyes komplemenst: %111....1110, majd adjunk hozzá 1-et: %111....1111. Eredményül azt kapjuk, hogy a (-1) n biten n db 1-essel írható le.
Milyen regiszterei vannak a 80x86-os processzornak?
- A gyakorlati programozás szempontjából legfontosabbak az ú.n.
általános célú regiszterek. Ezek három csoportba sorolhatóak.
- 8 bites regiszterek: AL, AH, BL, BH, CL, CH, DL, DH
- 16 bites regiszterek:
- AX akkumlátor, számítási műveletek (Accumulator)
- BX bázisregiszter, memória címzése (Base)
- CX számláló, ciklus számláló (Counter)
- DX adatregiszter, periféria műveletek (Data)
- SI forrás index (Source Index)
- DI cél index (Destination Index)
- BP bázismutató (Base Pointer)
- SP veremmutató (Stack Pointer)
- 32 bites regiszeterek: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
Ezek nevében az E betű az Extended angol szóból ered, amivel arra utalnak, hogy a megfelelő 16 bites regiszter lett kiterjesztve újabb 16 bit segítségével, és így jött létre az adott 32 bites regiszter. - Nem csak a 16 és 32 bites általános regiszterek között van átfedés, de a 8 bitesek is részét képezik a 16 biteseknek. Pl. az AL regiszter valójában az AX regiszter alacsonyabb (angolul: Lower) helyiértékű bájtja, míg az AH regiszter ugyanennek az AX-nek a magasabb (angolul: Higher) helyiértékű bájtja. Hasonló viszonyban vannak egymással a BL, BH és BX, valamint a CL, CH és CX, továbbá a DL, DH és DX regiszetrek.
- Szintén fontos szerepet játszik a Flag regiszter, amelynek alsó 16 bitjére az F névvel, míg a teljes 32 bites regiszterre az EF névvel szoktunk hivatkozni.
- Az processzor működése szempontjából alapvető szerepe van még az utasítás mutatónak (IP - Instruction Pointer), ill. az újabb rendszerekben a kiterjesztett (32 bites) EIP regiszetrnek.
- A processzor működéséhez további ú.n. rendszer regiszterekre van
még szükség. A teljesség igénye nélkül:
- Szegmensregiszterek,
- CS kódszegmens
- DS adatszegmens
- SS veremszegmens
- ES extra adatszegmens
- FS, GS további "extra" szegmens regiszterek
- Leíró táblák címei (pl. szegmens, megszakítási tábla stb.. leíróinak helye a memóriában)
- Nyomkövetést segítő regiszterek
- Státusz regiszter ...
- Szegmensregiszterek,
Mit olvashatunk ki a Flag regiszterből? Melyik paritásvédelmi módszert támogatja a PF bit?
A felhasználói programok számára a Flag regiszternek az alábbi bitjei a legfontosabbak.
%----ODIT_SZ-A-P-C
Ezek jelentése a következő:
- Állapotjelzők
- OF (owerflow) volt-e tulcsordulás, általában az előjeles műveletek eredményének helyességéről ad tájékoztatást (0 - helyes az eredmény; 1 - az eredmény helytelen)
- SF (sign) negatív-e az eredmény (pontosabban az eredmény legmagasabb helyiértékű bitje másolódik ide)
- ZF (zero) 1 az értéke, ha az eredmény 0, és 0 az értéke, ha az eredmény nem 0
- AF (auxilary carry) történt e köztes átvitel (Összeadás, kivonás esetén jelzi, hogy történt-e átvitel legalacsonyabb helyiértékű két nible (4 bit) között.)
- PF (parity) az eredmény legalacsonyabb helyiértékű bájtjában lévő 1-es értékű bitek számát egészíti ki páratlanra
- CF (carry) Szó szerint átvitelt jelöl. (Természetes (előjel nélküli) számok sszeadása, kivonása esetén jelzi, hogy helyes-e a végeredmény: 0 - helyes az eredmény; 1 - az eredmény helytelen)
- Vezérlő bitek
- DF (direction) sztringműveletek iránya (0 - a sztringet az elejétől a vége felé tudjuk feldolgozni; 1 - a sztringet a végétől az eleje felé tudjuk feldolgozni)
- IF (interrupt) enable 1 - a megszakítások engedélyezve vannak; 0 - a megszakítások le vannak tiltva
- TF (trace) Ha ennek a bitnek 1 az érétéke, akkor minden egyes utasítás végrehajtását követően automatikusan egy eltérülésre kerül sor, a megszakítási táblázat 1-es indexű (második) elemének megfellő megszakítási cím szerint.
PF a páratlan paritásvédelmet támogatja (páratlan számúra egészíti ki az egyes bitek számát).
Milyen címzésmódokat ismernek a 80x86-os processzorok?
- Közvetlen vagy konstanscímzés
- MOV(27,AL);
- ADD($2B,EBX);
- Regisztercímzés
- MOV(27,AL);
- ADD($2B,EBX);
És a memóri megcímzésére szolgáló módok:
- Direkt címzés (lényegében a gépi kód tartalmazza az adott címet)
- MOV(27,[$AB_1234]);
- SUB(valtozo,EAX);
- Regiszter indirekt címzés (A címet az egyik általános regiszter
tartalmazza.)
- DEC([ESI]);
- MOV(AX,[EBX]);
- ADD([EDI],BL);
- Bázis relatív címzés (A címet egy regiszter tartalmának és egy
konstansnak az összege adja meg.)
- MOV(AX,[EBX+4]);
- ADD(valtozo[EDI],BL);
- Indexelt címzés (A címet egy regiszter 1,2,4 vagy 8-szorosának
és egy konstansnak az összege határozza meg.)
- MOV(AX,[EBX*2+4]);
- ADD(valtozo[EDI*8],BL);
- INC((type byte [ESI*8]]]));
- Bázis relatív indexelt címzés (A legáltalánosabb memória címzés.
A címet (legfeljebb) három tag összegeként határozza meg a processzor.)
- ADD(27,valtozo[EBX+ECX*2]);
- MOV([EDX+ESI*4-2*8],EAX);
Ismertesse a mod-r/m bájtot!
A két operandusú utasítások gépi kódjában gyakran előforduló struktúra. Az utasítást meghatározó első bájtot szokta követni. Szerkezete:
mm | reg | r/m
- mm : mod bitek, a legmagasabb helyiértékű 2 bit. Ha ezen 2
bitek értéke:
- 0: Az egyik operandus memóriabeli. A cím eltolás (displacement) nélkül van megadva (pl. regiszter indeirekt címzéssel).
- 1: Az egyik operandus memóriabeli. A címének meghatározásához szükség van egy eltolás értékre is, amely a kódba 8 bites előjeles egészként van beleírva.
- 2: Az egyik operandus memóriabeli. A címének meghatározásához szükség van egy eltolás értékre is, amely a kódba 16 vagy 32 bites előjeles egészként van beleírva - attól függően, hogy milyen a "kódszegmens" típusa, ill, van-e "címmméret felülíró prefix" az utasítás kódja előtt.
- 3: mindkét operandus regiszter
- reg bitek, a 3 "középső" bit. Miután az egyéb körülmények (kódszegmens típusa, adat méret módosító prefix, a kódbájt megfelelő bitje) meghatározták az adatok méretét (8, 16 vagy 32 bit), ez a három bit határozza meg, hogy a 8 db adott méretű általános regiszter közül melyik az utasítás operandusa.
- r/m bitek, az alacsony helyiértékű három bit.
- mod=3 esetén a középső 3 bithez hasonlóan határozzák meg a másik regiszter operandust.
- mod<3 esetén
- kivételektől eltekintve, a regiszter indirect címzéshez (mod=0), ill. a bázisrelatív címzéshez (mod=1,2) használandó regisztert adják meg.
- Ha mod=0 és r/m=5, akkor direkt címzésről van szó, azaz csak egy, a kódba beleírt, 32 biten ábrázolt eltolás érték határozza meg az operandus címét a memóriában.
- Ha mod<3 és r/m=4, akkor a mod-r/m bájtot követni fogja egy ún. SIB bájt, és az operandus címe indexelt, vagy bázisrelatív indexelt címzéssel van megadva.
Ismertesse a SIB (Scale-Index-Base) bájtot!
Bizonyos esetekben az utasításokban lévő mod-r/m bájtot követi egy SIB bájt. A bájt neve egy mozaikszó: Scale-Index-Base.
- Scale: A legmagasabb helyiértékű 2 bit. 2-nek az ennyiedik hatványa, azaz 1, 2, 4 vagy 8 fogja szorozni az index regiszter értékét.
- Index: Az index regisztert kijelölő középső 3 bit.
- Base: A bázis regisztert kijelölő alacsonhelyiértékű 3 bit.
Az eltolás jelenlétén ill. nem jeélenlétét kivételeken keresztül kezeli. Ezen kivételek kezelését az teszi lehetővé, hogy az ESP regiszter nem lehet indexregiszter.
Első csoport . . . Utasítások . . . Eljárások . . . Megírandó programok . . . Mit ír ki a program??
