ASM vizsgasor

From WIKi

Jump to: navigation, search

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??


Tartalomjegyzék

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)
    • 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.

  1. 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)
  2. 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?

  1. 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.
  2. 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.
  3. 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.
  4. 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 ...

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?

  1. Közvetlen vagy konstanscímzés
    • MOV(27,AL);
    • ADD($2B,EBX);
  2. Regisztercímzés
    • MOV(27,AL);
    • ADD($2B,EBX);

      És a memóri megcímzésére szolgáló módok:
  3. Direkt címzés (lényegében a gépi kód tartalmazza az adott címet)
    • MOV(27,[$AB_1234]);
    • SUB(valtozo,EAX);
  4. Regiszter indirekt címzés (A címet az egyik általános regiszter tartalmazza.)
    • DEC([ESI]);
    • MOV(AX,[EBX]);
    • ADD([EDI],BL);
  5. 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);
  6. 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]]]));
  7. 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??

Personal tools