Balaton Marcell Balázs Assembly jegyzet Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született.
1. Regiszterek Regiszterek fajtái a. Szegmensregiszterek cs (code): utasítások címzéséhez ss (stack): verem címzéséhez ds (data): adat terület címzéséhez es (extra): extra terület címzéséhez b. Index regiszterek si (source): forrásregiszter di (destination): célregiszter c. Vezérlő regiszterek ip (instruction pointer): utasítások számlálása bp (base pointer): az eltolás sp (stack pointer): verem teteje d. Munkaregiszterek ax: általános célra bx: általános célra és címzéshez szokás használni cx: általános célra és ciklusok lépésszámához dx: általános célra és megszakítások kezeléséhez A munkaregiszterek 16 bitesek; megkülönböztetünk alsó és felső részt. Ezeket x helyett l illetve h-val jelöljük. (pl: ah, cl) felső rész h alsó rész l 11011001 10110100 8 bit=1 bájt 8 bit=1bájt 16 bit = 2 bájt = 1 szó Assembly jegyzet 2 Balaton Marcell Balázs
e. Flag regiszter z (zero flag): értéke 1, ha az előző művelet kiértékelése 0-t eredményezett s (sign flag): értéke 1, ha az előjele negatív p (parity flag): értéke 1, ha az alsó bájtban páros számú 1-es bit volt c (carry flag): értéke 1, ha volt átvitel előjelnélküli műveletnél o (overflow flag): értéke 1, ha túlcsordulás volt előjeles műveletnél d (direction flag): értéke 1, ha előre t (trace flag): értéke 1, ha engedélyezett a lépésenkénti végrehajtás i (interrupt flag): értéke 1, ha engedélyezett a megszakítás A flag regisztereket a következő utasításokkal lehet befolyásolni: st_ (beállítás), cl_ (törlés), cm_ (ellentettjére állítás), ahol az aláhúzás helyére az imént felsorolt betűjeleket lehet behelyettesíteni. 2. Utasítások Utasítások általános felépítése utasítás cél vagy utasítás cél,forrás A cél mindig egy regiszter vagy változó, míg a forrás egy szám, egy regiszter vagy egy változó lehet. Bizonyos parancsok esetében nincs forrás (a forrás egyértelmű és fix). Utasítások fajtái a. Mozgató utasítások mov op1, op2: op1=op2 push op: verembe teszi az op értéket pop op: veremből kiveszi a legfelső elemet lea reg, memcím lea reg, offset xchg op1, op2: csere les reg, op lds reg, op Assembly jegyzet 3 Balaton Marcell Balázs
b. Aritmetikai utasítások add op1, op2: op1:=op1+op2 adc op1, op2: op1:=op1+op2+c sub op1, op2: op1:=op1-op2 sbb op1, op2: op1:=op1-(op2+c) inc op op:=op+1 dec op op:=op-1 mul op 2 bájtos op-nál: (dx,ax):=ax*op; 1 bájtosnál ax:=al*op imul op előjeles szorzás div op 2 bájtos op-nál: (dx,ax)/op; hányados ax-be, maradék dx-be. 1 bájtos op-nál: ax/op; hányados al-be, maradék ah-ba kerül. idiv op előjeles; hányados: al-be, maradék ah-ba. cmp op1, op2 összehasonlítja op1-et és op2-t c. Logikai utasítások and op1, op2 or op1, op2 xor op1, op2 not op d. Bitforgató utasítások rol op (rotate left): a bitek balra tolódnak, a jobbra kieső balról visszakerül ror op (rotate right): a bitek jobbra tolódnak, a balra kieső jobbról visszakerül rcl op (rotate carry left): a bitek balra tolódnak, a jobbra kieső bekerül a carry-be, miközben a carry értéke balról visszakerül rcr op (rotate carry right): a bitek jobbra tolódnak, a balra kieső bekerül a carry-be, miközben a carry értéke jobbról visszakerül shl op (shift left): a bitek balra tolódnak, a balra kieső bekerül a carry-be shr op (shift right): a bitek jobbra tolódnak, a jobbra kieső bekerül a carry-be sal op (shift arithmetic left): a bitek balra tolódnak, a balra kieső bekerül a carry-be, a felszabaduló helyre pedig egy 0 Assembly jegyzet 4 Balaton Marcell Balázs
sar op (shift arithmetic right): a bitek jobbra tolódnak, a jobbra kieső bekerül a carry-be, a felszabaduló helyre pedig az első bittel egyező e. Vezérlésátadó utasítások jmp címke: feltétel nélküli vezérlésátadás jz címke (jump zero): vezérlésátadás, ha a zero flag 1 jnz címke (jump not zero): vezérlésátadás, ha a zero flag 0 : a z felcserélhető a flag regiszterhez kapcsolódó más betűjelekkel is je címke: előző előjeles vagy előjelnélküli utasítás = jl címke: előző előjeles utasítás < jg címke: előző előjeles utasítás > jb címke: előző előjelnélküli utasítás < ja címke: előző előjelnélküli utasítás > loop címke: ciklusszervezéshez; visszaugrik a címkéhez, amíg a cx regiszter értéke nem 0 call címke: átadja a vezérlést, a híváskori cím a verembe kerül ret: visszatér arra a címre, ahonnan a call parancs eltérítette a vezérlést 3. Gyakran használt parancspárok Képernyő címzése mov ax,0b800h mov es,ax Képernyőtörlés mov ax,3 ;25x80-as képernyő kódja a 3 int 10h ;az ax regiszterben beállított módban meghívja a törlés bios programot Billentyűvárás xor ax,ax ;nullázza az ax-et int 16h ;meghívjuk a bios programot Kilépés DOS-ba mov ax,4c00h Int 21h Assembly jegyzet 5 Balaton Marcell Balázs
Egyszerű példák Egy betű kiírása Egy karaktert úgy tudunk megjeleníteni a képernyőn, hogy betöltjük az egyik munkaregiszter alsó részébe, színét pedig beállítjuk a felső részébe. Ezek után jöhet a kiíratás. mov ax,0b800h ;Az ax-be betöltjük a 0b800 hexadecimális számot. Ez a képernyő bal felső sarka. mov es,ax ;Az es regiszterbe betöltjük az ax tartalmát, ami az imént betöltött szám lesz. Ezt azért kell két lépésben megtenni, mert az extraregiszter direktbe nem címezhető. mov di,1840 ;Beállítjuk, hogy 1840 karakterrel eltoljuk a kiírás pontját a bal felső sarokból. Kb. a képernyő közepén lesz ez a pont. mov al,"a" ;A regiszter alsó részébe betöltjük az A betűt. Azért tettük macskakörmök közé, mert most karakter formában adtuk meg, de írhattuk volna az A betű ASCII kódját decimális, hexadecimális, vagy akár bináris számmal is - kinek melyik a legszimpatikusabb. Decimális szám esetén csak magát a számot kell leírni, hexadecimálisnál egy h betűt, binárisnál pedig egy b betűt kell a szám végére biggyeszteni. mov ah,24h ;A regiszter felső részébe betöltjük a kiírandó karakter színét. A lentebb látható ábra mutatja, hogy ezt hogyan is számíthatjuk ki. Az itt megadott 24 hexadecimális szám zöld alapon piros betűt eredményez. mov es:[di],ax ;Kiíratjuk az képernyőre, a di eltolással az ax regiszter tartalmát. Szín kiszámítása Az előző példában az ah tartalma a következő volt: 0 0 1 0 0 1 0 0 Az ah-t is két részre osztjuk: a felsőben a háttér színét határozhatjuk meg, az alsóban a előtérét. A bitek szerepe balról jobbra a következő: Villogás Piros Zöld Kék Intenzitás Piros Zöld Kék előtér háttér előtér! A villogás természetesen szintén az előtérre vonatkozik. A végtelen elérése A következő rövid kódrészlet azok számára íródott, akik szeretnének elvont dolgokkal megismerkedni. Várd meg a következő program végét, és megtudod, mi az a végtelen! cimke: jmp cimke ;Ezt a konstrukciót sokan csak végtelen ciklus néven emlegetik. Assembly jegyzet 6 Balaton Marcell Balázs