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.
b.
c.
d.
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
Index regiszterek •
si (source): forrásregiszter
•
di (destination): célregiszter
Vezérlő regiszterek •
ip (instruction pointer): utasítások számlálása
•
bp (base pointer): az eltolás
•
sp (stack pointer): verem teteje
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:
•
les reg, op
•
lds reg, op
Assembly jegyzet
csere
3
Balaton Marcell Balázs
b.
c.
d.
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
Logikai utasítások •
and op1, op2
•
or op1, op2
•
xor op1, op2
•
not op
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
• e.
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ő
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 int 10h
;25x80-as képernyő kódja a 3 ;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 mov mov mov
mov
mov
;Az ax-be betöltjük a 0b800 hexadecimális számot. Ez a képernyő bal felső sarka. 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ő. 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. 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. 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. 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 előtér
Piros
Zöld háttér
Kék
Intenzitás
Piros
Zöld
Kék
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 Assembly jegyzet
;Ezt a konstrukciót sokan csak végtelen ciklus néven emlegetik. 6
Balaton Marcell Balázs