You are on page 1of 53

1

Assembly
Programlama Dili
T e m m u z 2 0 0 3
Hazrlayan : Fehmi Noyan S
fni18444@gantep.edu.tr fnoyanisi@yahoo.com
http://www2.gantep.edu.tr/~fni18444
2
3
Bu dokmanda Intel firmasnn 80x86 serisi olarak nitelendirilen 8086, 80186, 80286, 80386,
80486 ve Pentium ilemcileri iin 16-bit Assembly programlama dili genel yaps ile anlatlacaktr .
Bu sebepten, dokmanda sadece 8086, 80186 ve 80286 (Intel firmasnn 16-bit ilemcileri)
ilemciler iin assembly dili anlatlacaktr. rnekler MS-DOS iletim sistemi iin yazlmtr.
Windows iletim sistemi iin assembly programlama 32-bit olup bu dokmanda ele alnmayacaktr.
Dokmanda bulunan Linux Altnda Assembly Dili blmnde, Linux iletim sistemi altnda
assembly dilinin kullanm anlatlmaktadr.
Assembly programlama dili ile ilgili elinize geecek birok kaynakta baz temel terim ve
ifadeler srekli orijinal ngilizce halleriyle kullanldklar iin ben de birok terimin ve ifadenin
Trke karln kullanmadm. Bu, baz durumlarda anlatm biraz vasatlatrmsa da kavramlarn
ok bilinen adlar ile renmenin daha faydal olacan dnyorum.
Fehmi Noyan S
4
indekiler
Giri
Blm 1 : Temeller
1.1 Say Sistemleri
1.2 Veri Tipleri
1.2.1 Bit
1.2.2 Bayt
1.2.3 Word
1.2.4 Double Word (Long)
1.3 Bitler zerinde Mantksal lemler
1.4 retli ve aretsiz Saylar
1.5 Shift ( Kaydrma ) ve Rotate ( Dndrme )
lemleri
Blm 2 : Mikro lemci (CPU) ve Bellek
2.1 Mikro lemci ve Yaps
2.1.1 Data Register'lar
2.1.2 Pointer ve Index Register'lar
2.1.3 Segment Register'lar
2.1.4 Instruction Pointer
2.1.5 Flag Register
2.1.5.1 Carry Biti
2.1.5.2 Parity Biti
2.1.5.3 Auxilary Carry Biti
2.1.5.4 Zero Biti
2.1.5.5 Sign Biti
2.1.5.6 Trace Biti
2.1.5.7 Interrupt Biti
2.1.5.8 Direction Biti
2.1.5.9 Overflow Biti
2.2 Bellek ve Yaps
2.3 Stack
2.4 80x86 lemcilerde Bellek Adresleme
2.4.1 Dorudan Adresleme (Direct Addressing)
2.4.2 Dolayl Adresleme (Indirect Addressing)
2.4.3 Indexed Adresleme
2.4.4 Based Indexed Adresleme
2.4.5 Based Indexed + Sabit(Disp) Adresleme
Blm 3 : 80x86 Komut Kmesi
3.1 Transfer Komutlar
3.1.1 MOV Komutu
3.1.2 XCHG Komutu
3.1.3 LEA Komutu
3.1.4 PUSH Komutu
3.1.5 PUSHF Komutu
7
8
8
8
8
8
8
8
9
9
10
11
11
11
12
12
12
12
13
14
14
14
14
14
14
15
15
15
16
18
18
18
19
19
20
20
21
22
23
23
24
24
5
3.1.6 POP Komutu
3.1.7 POPF Komutu
3.1.8 LAHF Komutu
3.1.9 SAHF Komutu
3.2 Giri/k Komutlar
3.2.1 IN Komutu
3.2.2 OUT Komutu
3.3 Aritmetiksel Komutlar
3.3.1 ADD Komutu
3.3.2 ADC Komutu
3.3.3 SUB Komutu
3.3.4 SBB Komutu
3.3.5 MUL Komutu
3.3.6 IMUL Komutu
3.3.7 DIV Komutu
3.3.8 IDIV Komutu
3.3.9 INC Komutu
3.3.10 DEC Komutu
3.3.11 CMP Komutu
3.4 Mantksal Komutlar
3.4.1 AND Komutu
3.4.2 TEST Komutu
3.4.3 OR Komutu
3.4.4 XOR Komutu
3.4.5 NOT Komutu
3.5 Kaydrma ve Dndrme Komutlar
3.5.1 SHL/SAL Komutlar
3.5.2 SHR Komutu
3.5.3 SAR Komutu
3.5.4 RCL Komutu
3.5.5 ROL Komutu
3.5.6 RCR Komutu
3.5.7 ROR Komutu
3.6 Dallanma Komutlar
3.6.1 JMP (Koulsuz Dallanma) Komutu
3.6.2 JZ/JE Komutlar
3.6.3 JNZ/JNE Komutlar
3.6.4 JB/JC/JNAE Komutlar
3.6.5 JBE/JNA Komutlar
3.6.6 JNB/JNC/JAE Komutlar
3.6.7 JG/JNLE Komutlar
3.6.8 JA/JNBE Komutlar
3.6.9 JL/JNGE Komutlar
3.6.10 JLE/JNG Komutlar
3.6.11 JS ve JNS Komutlar
3.6.12 JO ve JNO Komutlar
3.6.13 JCXZ Komutu
3.7 Dng Komutlar
24
25
25
25
26
26
26
26
27
27
27
28
28
29
29
30
30
31
31
32
32
32
32
32
33
33
33
33
33
34
34
34
34
35
35
36
37
38
38
38
38
38
38
38
38
39
39
39
6
3.7.1 LOOP Komutu
3.7.2 LOOPZ/LOOPE Komutlar
3.7.3 LOOPNZ/LOOPNE Komutlar
Blm 4 : Kesme (Interrupt) Kullanm
Blm 5 : DEBUG Program
Blm 6 : Linux letim Sistemi Altnda Assembly
Kullanm
6.1 Intel ve AT&T Szdizimleri
6.1.1 Kaynak-Hedef Yn
6.1.2 nekler
6.1.3 Sonekler
6.1.4 Bellek lemleri
6.1.5 INT 0x80 ve Linux Sistem arlar (Syscalls)
rnekler
nternet Adresleri
39
40
40
40
41
44
45
46
46
46
47
47
48
52
7
Giri
Assembly programlama dili dk seviyeli bir dil olup C, C++, Pascal, Basic gibi yksek
seviyeli programlama dillerine gre anlalmas biraz daha zordur. Assembly dili ile program
yazarken kullanlan bilgisayarn donanm zellikleri programc iin nemlidir. Yazlan kodlar
ounlukla donanma bal yazlr ki bu da programn tanabilirliini azaltan bir faktrdr.
Assembly dili ile program yazarken programc dorudan bilgisayarn ilemcisi ve hafzas ile
urar. Yani hafzadaki ( RAMdeki ) ve ilemci gzlerindeki deerleri dorudan deitirme
olana vardr.
Yksek seviyeli dillerdeki derleyicilerden farkl olarak, assembly kaynak dosyalarn
alabilir dosya haline getirebilmek iin assembler ve linker ad verilen programlar
kullanlr. Aslnda derleyiciler de bir tr assembler programdr denebilir. Fakat derleyiciler,
ekstra bir parametre kullanlmad taktirde, kaynak dosyasn nce gerekli Object dosyasna
eviriler daha sonra, bir hata ile karlalmaz ise, elde edilen object dosyas linker yardm ile
alabilir dosya haline getirilir.
Bilgisayarmzda altrlan tm programlar nce bilgisayarmzn RAMine yklenir. Daha
sonra RAM zerinde altrma ilemi gerekletirilir. RAMe yklenen bilgi programmzn
makine dili karlndan baka bir ey deildir. Makine dilinin kullanc tarafndan anlalabilir
ekline ise assembly dili demek pek yanl olmaz.
Aslnda assembly programlarnn en nemli zellikleri boyutlarnn yksek seviyeli bir dil ile
yazlan programlara nazaran ok kk olmas ve buna bal olarak ok daha hzl
almalardr.
Programlarn hzl almalarn kodlarnn sadeliinden kaynaklanmaktadr. Fakat gnmzde
kullanlan yksek hzl ilemciler ve byk kapasitelere sahip sabit diskler assembly
programlarnn bu zelliklerini nemsiz klmaktadr. Aadaki rnekte ekrana A harfini
basan bir program nce assembly dili ile daha sonra C ve Pascal dilleri ile yazlmtr.
Programlarn yaptklar ilerin ayn olmasna karn boyutlar arasndaki byk farka dikkat
edin.
Assembly Program C Program Pascal Program
MOV AH,02
MOV DL,41
INT 21
INT 20
#include <stdio.h>
main()
{
printf(A);
}
begin
write(A)
end.
Assembler Bilgileri
MS-DOS DEBUG
Derleyici Bilgileri
MS-DOS iin Turbo C 2.01
Derleyici Bilgileri
MS-DOS iin FreePascal
0.9
Boyut : 8 bayt Boyut : 8330 bayt Boyut : 95644 bayt
Grdnz gibi C ile yazlan programn boyu assembly ile yazlannkinin boyunun 1000
katndan daha byk! Pascal ile yazlan programn boyu ile assembly ile yazlannkinin boyunu
karlatrmaya bile gerek yok sanrm. Bu fark eski bir bilgisayar iin nemli olabilir fakat
gnmz standartlarndaki bir bilgisayar iin pek nemli deildir. Bu sebepten assembly
programlama dili gnmzde daha ok sistem programclar tarafndan ve inline olarak dier
8
programlama dilleri ierisinde kullanlmaktadr. inline assembly ile kastedilmek istenen,
assembly kodlarnn olduu gibi yksek seviyeli bir dil ierisinde kullanlmasdr. Bu, bize
sabit diskin herhangi bir blmne ( mesela MBR ), BIOS gibi sistem kaynaklarna veya belirli
bellek blgelerine kolayca erime olana salar.
Blm 1 : Temeller
1.1 Say Sistemleri
Gnlk hesaplamalarmzda kullandmz sistem onluk say sistemidir ve bu sistem
0,1,2,3,4,5,6,7,8 ve 9 rakamlarndan oluur. Dier saylar ise bu rakamlar kullanlarak elde
edilir. Kullandmz bilgisayar iin (aslnda tm elektronik cihazlar iin dersek daha iyi olur)
durum byle deildir. Bilgisayar binary say sistemi dediimiz ikilik say sistemini kullanr ki
bu sistemde sadece 0 ve 1 vardr. Bilgisayar iin 0n anlam yanl ( FALSE ) ve 1in
anlam
( TRUE ) dorudur. Buna karn assembly programlar yazlrken kullanlan say taban
hexadecimal olarak bilinen on altlk say tabandr. Bu sistemde kullanlan ilk on rakam
onluk sistemdeki ile ayn olup 0,1,...,9 rakamlarndan oluur. 10, 11, 12, 13, 14 ve 15 iin
srasyla A, B, C, D, E ve F harfleri kullanlr. On altlk saylar gsterilirken sonlarna h
veya Hharfi konur. Assembly dili ile onaltlk say sisteminin kullanlmasnn sebebi, bellek
adresi gibi uzun rakamlarn ikilik sistem ile gsterilmesinin zorluudur. Say taban
bydke herhangi bir sayy gstermek iin gereken basaman saysnn azalaca aktr.
Mesela 1BA5:010F gibi bir bellek blgesinin adresini ikilik sistem ile gstermek isteseydik
0001101110100101:0000000100001111 eklinde olacakt ki bu hem aklda tutmas hem de
yazmas zor bir say.
1.2 Veri Tipleri
1.2.1 Bit
Bilgisayarn ikilik say sistemini kullandndan bahsettik. Bu sistemdeki her bir
basamaa Binary Digit anlamna gelen bit denir. Yani bir bit ierisinde 0 veya 1 olmak
zere iki bilgiden biri bulunabilir. Bilgisayar iin en kk bilgi birimi bittir.
1.2.2 Bayt
Sekiz adet bitin oluturduu toplulua bayt denir. Bir bayt ierisinde 0-255 arasnda
olmak zere 256 deiik deer tutulabilir.
(ikilik) 00000000 = 0 (onluk)
(ikilik) 11111111 = 255 (onluk)
Grld gibi bir baytn alabilecei maksimum deer 255 ve minimum deer 0dr.
1.2.3 Word
ki baytlk (16-bitlik) bilgiye Word denir. Bir wordun alabilecei maksimum deer
65535 ve minimum deer 0dr. Bu da bir word ierisinde 65536 farkl deer
saklanabilecei anlamna gelir.
1.2.4 Double Word (Long)
ki ayr wordun birletirilmesi ile bir Double Word elde edilir. Bir double word 32-bit
uzunluundadr.
9
8086, 80186 ve 80286 ilemcilerde ayn anda ilenebilecek bilgi saysnn 16 bit
uzunluunda olmasndan dolay bu ilemcilere 16-bit ilemci ad verilir. Intel firmas
80386 ve sonras ilemcilerinde 32 bitlik bilgi ileme sistemi kullanmtr ve bu ilemcilere
de 32-bit ilemci ad verilir.
1.3 Bitler zerinde Mantksal lemler
lemciler birok ilemi mantksal karlatrmalar yardm ile yaparlar. Assembly
programlama dili ierisinde AND, OR, XOR ve NOT olmak zere drt adet mantksal komut
kullanlr. Aada bu komutlarn doruluk tablolar verilmitir.
AND 1 0
1 1 0
0 0 0
OR 1 0
1 1 1
0 1 0
XOR 1 0
1 0 1
0 1 0
NOT 1 0
0 1
Bilgisayarmzda kullanlan baytlar da 1 ve 0lardan olutuu iin CPU her mantksal ilemde
bitler zerinde ayr ayr ilem yapar. Aada birka rnek verdim.
1001 0110 1001 1111
1011 1101 0001 1110
AND _______________________________
1001 0100 0001 1110
1011 0010 1110 1010
1011 0000 0000 0000
OR ____________________________
1011 0010 1110 1010
1010 1010 1000 1111
1110 1110 1100 0001
XOR________________________________
0100 0100 0100 1110
0010 0000 0000 1111
NOT______________________________
1101 1111 1111 0000
1.4 retli ve aretsiz Saylar
Daha nce veri tipleri anlatlrken bayt iin deer aral 0-255 word iin 0-65535 olarak
tanmland. Peki ilemlerimizde negatif saylar kullanmak istersek ne yapmalyz? Bu
durumda bayt, word veya long iin ayrlan blgenin yars negatif dier yars da pozitif
saylar iin tahsis edilir. Yani bir baytn alabilecei deerler 128....-1 ve 0....127 arasnda
olur. Ayn ekilde word iin bu deer 32.768......+32.767 arasnda olur. Bir bayt, word yada
long iin en soldaki bite iaret biti denir. aretli saymzn iaret bitinin deeri 0 ise say
pozitif, 1 ise negatif olarak deerlendirilir. Yani
0110 0101 1110 1100 pozitif bir say (word)
1000 1100 1010 0000 negatif say (bayt)
Herhangi bir saynn negatifini bulmak iin ikiye tmleyeni bulunur. Bu i iin
1) Say NOT ileminden geirilir
2) Elde edilen sonuca 1 eklenir
imdi, 13 bulmaya alalm.
+13 = 0000 1101 (bayt)
1) Say NOT ileminden geirilir
10
0000 1101
NOT______________
1111 0010
2) Elde edilen sonuca 1 eklenir
1111 0010
1
+------------
1111 0011 -13
imdi elde ettiimiz sonucu bir test edelim.
13+(-13) = 0000 1101 + 1111 0011
Yukardaki ilemin sonucu sfr olaml.
0000 1101
1111 0011
+--------------
1 0000 0000
Eldeki 1 gz ard edilirse sonu sfr bulunur ki bu bizim ilemimizin doru olduunu
gsteriyor.
1.5 Shift ( Kaydrma ) ve Rotate ( Dndrme ) lemleri
Bit dizgileri zerinde yaplan bir dier mantksal ilemler de kaydrma (shift) ve dndrme
(rotate) ilemleridir. Bu iki ilem kendi ilerinde saa kaydrma (right shift), sola kaydrma
(left shift) ve saa dndrme (right rotate), sola dndrme (left rotate) olarak alt kategorilere
ayrlabilir.
1 0 1 1 1 0 0 1
Yukardaki gibi bir bayta saa kaydrma (right shift) ilemi uygulanrsa 7. bit 6.nn yerine,
6. bit 5.nin yerine, 5. bit 4.nn yerine .... geer. Bo kalan 7. bit pozisyonuna 0 yazlr ve 0.
bit iersindeki 1 deeri bit darsna atlr.
Sola kaydrma (left shift) ilemi de ayn ekilde gerekletirilmektedir. Bu sefer bo kalan
0. bit pozisyonuna 0 yazlr ve 7. bit ilem d kalr.
0 1 0 1 1 1 0 0
Saa kaydrma sonras
0 1 1 1 0 0 1 0
Sola kaydrma sonras
Dndrme (rotate) ileminde de yine kaydrma ileminde olduu gibi bitler bir saa veya
sola kaydrlr fakat burada bo kalan 7. veya 0. bit yerine sfr deil de 7. bit iin 0. bitin ve
0. bit iin de 7. bitin deeri yerlerine yazlr. Yani yukardaki baytmza srasyla saa ve sola
dndrme ilemleri uygulanrsa aadaki gibi sonular elde edilir.
1 1 0 1 1 1 0 0
Saa dndrme sonras
0 1 1 1 0 0 1 1
Sola dndrme sonras
11
Blm 2 : Mikro lemci (CPU) ve Bellek
2.1 Mikro lemci ve Yaps
Bugn kullandmz bilgisayarlarda bilgileri yorumlayan ve ileyen ksm bilgisayarn
merkezi ilem nitesidir. Merkezi ilem nitesi (Central Processing Unit CPU) bellek ve
eitli giri/k niteleri ile bus ad verilen veri yollarn kullanarak haberlemektedir.
lemciler, dahili ve dsal hatlarnn bilgi transferi ve ileyebilecekleri maksimum bilgi
kapasitesine gre 8 bitlik, 16 bitlik ve 32 bitlik ilemciler olarak adlandrlr. Bu dokmanda
anlatlan assembly dili 16 bitlik bir ilemci olan Intel 8086 (dsal ve dahili veri transferi
wordler halinde yaplmaktadr) serisi iindir. Dilin 8086 serisi iin olmas, yazdnz
programlarn 8088, 80186, 80286, 80386, 80486, Pentium ve Celeron serileri ve AMD
ilemciler zerinde almayaca anlamna gelmemektedir.
lemci, register ad verilen blmelerden oluur. Bu registerlar Data registerlar, Pointer
ve Index registerlar, Segment registerlar, Instruction Pointer (komut gstergeci) ve
Program Status Word (Flag register) olarak gruplandrabiliriz. Aada 8086 ilemcinin
register yaps basite gsterilmitir.
2.1.1 Data Registerlar
ekilde de grld gibi 8086 ilemci 14 adet 16-bit kapasiteli registera sahiptir. Bu
registerlardan Data registerlar ( AX, BX, CX ve DX ) kendi ilerinde 8-bit kapasiteli iki
registera blnmektedir. Bu registerlar AX iin AH ve AL, BX iin BH ve BL, CX iin CH
ve CL ve DX iin DH ve DL olarak adlandrlr. AH, 16-bitlik AX registernn 8-bitlik
yksek(High) seviyeli blm ve AL ise 16-bitlik AX registernn 8-bitlik alak (Low)
seviyeli blm olarak adlandrlr. Programlarmz yazarken 8-bitlik verilerin ilenmesinde
bu 8-bitlik registerlardan faydalanrz. Daha sonraki blmlerde de greceimiz gibi data
registerlar bir ok ilemde (dnglerde, interrupt kullanlmasnda, matematiksel
ilemlerde...) CPU tarafndan rezerv edilmilerdir. Bu durumlarda bizim register ierisindeki
deeri deitirme ansmz yoktur.
12
Programlarmzda BH veya BL registernn deerinin deimesi dorudan BX registernn
deerini deitirecektir. Ayn durum dier data registerlar iin de geerlidir. Bir rnek
vermek gerekirse: BX registermzn deeri A43F olsun. Bu durumda BH=A4 ve BL=3F
olur. Simdi BLnin deerini 05 olarak deitirelim. Son durumda BX=A405, BH=A4 ve
BL=05 olacaktr. (Yukardaki ekil incelenirse verilen rnek daha kolay anlalacaktr)
2.1.2 Pointer ve Index Registerlar
Pointer ve index registerlar bellek ierisindeki herhangi bir noktaya erimek iin kullanlr.
Bu i iin eriilmek istenen noktann offset ve segment adresleri gerekli registerlara atanarak
ilem gerekletirilir. ( Blm 2.2, Bellek ve Yaps ksmnda bu konu daha ayrntl ele
alnacaktr.)
2.1.3 Segment Registerlar
Segment registerlar (CS, DS, SS ve ES) , programmz bilgisayarn belleine yklendii
zaman bellek ierisinde oluturulan blmlerin (Segment) balang adreslerini tutarlar. Yani
bu registerlara bir eit yer gstergeci denebilir. CS, programmzn altrlabilir kodlarn
barndran (Code Segment) bellek blgesinin balang adresini tutar. Yani CS ile gsterilen
yerde makine dili kodlarmz vardr. DS, programmz ierisindeki deikenlerin sakland
blmdr. SS, bellekte programmz iin ayrlan stack blmnn balang adresini tutar.
Stack, ileride greceimiz PUSH ve POP komutlar ile bellee deer atlmas ve alnmas
iin, programlarn ve fonksiyonlarn sonlandrldktan sonra nereye gideceklerini belirten
adres bilgisini tutmak iin ve program ve fonksiyonlara gnderilen parametreleri saklamak
iin kullanlr. UNIX tabanl sistemlerde kesme (interrupt) kullanm iin gerekli
parametrelerin belirtilmesi iin de stack kullanlr. ES (Extra segment) daha ok dizgi
ilemleri iin kullanlr.
2.1.4 Instruction Pointer
Instruction Pointer register ilemci tarafndan ilenecek bir sonraki komutun bellekteki
adresini saklar. Bu register zerinde programc tarafndan herhangi bir ilem yaplamaz. Her
komut iletildikten sonra CPU otomatik kullanlan komuta gre gerekli deeri bu registera
atar.
2.1.5 Flag Register
Flag Register dier registerlardan daha farkl bir durumdadr. Dier resigterlarn 16-bit
halinde bir btn olarak ele alnmalarndan farkl olarak flag registern her biti CPU iin ayr
bir deere sahiptir (8086 ilemci tarafndan sadece 9 tanesi kullanlmaktadr). Bu bitlerin zel
olarak isimlendirilmeleri aada verilmitir.
O : Overflow flag
D : Direction flag
I : Interrupt flag
T : Trace flag
S : Sign flag
Z : Zero flag
A : Auxilary Carry flag
P : Parity flag
C : Carry flag
13
Bilgisayar ikilik say sistemini kullandna gre bu registerlar ierisindeki deer herhangi
bir anda ya 1 yada 0dr. Bir bitin 1 olma durumuna Set, 0 olma durumuna ise Reset
denir. lemci birok komutu icra ederken bu bitlerin durumlarndan faydalanr.
2.1.5.1 Carry Biti
lemci tarafndan yaplan herhangi bir ilem srasnda alc alana yerletirilen saynn alc
alana smamasndan doan olaya carry(tama) denir. CPU bir ilem sonucunda tama ile
karlarsa carry flagn deeri 1 yaplar.
Aada 16-bitlik iki say toplanmtr ve sonuta bir tama olmutur. (Taan bit krmz ile
gsterilmitir)
1111 1001 0110 1010 F96A
0010 1010 1111 1001 2AF9
+----------------------------
1 0010 0100 0110 0011 2463 CF=1
F96A ile 2AF9un toplanmas sonucu 2463 says elde edilmitir ki bu iki saydan da kktr.
Elimizdeki saylar pozitif olduuna gre toplama ilemi sonucunda elimizdeki saylardan daha
kk bir say elde etmemiz imkanszdr. CPU bu durumda carry flagn deerini 1 yaparak 17-
bitlik bir say elde eder.
C:\WINDOWS\Desktop>debug
-a100
1E40:0100 MOV AX,F96A
1E40:0103 MOV BX,2AF9
1E40:0106 ADD AX,BX
1E40:0108
-t
AX=F96A BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0103 NV UP EI PL NZ NA PO NC
1E40:0103 BBF92A MOV BX,2AF9
-t
AX=F96A BX=2AF9 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0106 NV UP EI PL NZ NA PO NC
1E40:0106 01D8 ADD AX,BX
-t
AX=2463 BX=2AF9 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0108 NV UP EI PL NZ AC PE CY
1E40:0108 A394D3 MOV [D394],AX DS:D394=A2A2
Yukardaki ekran grnts verdiim rnein debug program altnda denenmesi sonucu elde
edilmitir.
lk nce MOV AX,F96A ile AX registernn deeri F96A yaplmtr. Bunu ilk t
komutundan sonra AX=F96A ile grebiliriz (1. t komutundan sonraki blmde AXin deerini
inceleyin). Daha sonra MOV BX,2AF9 ile BXin deeri 2AF9 yaplmtr (2. t komutundan
sonraki blmde BXin deerini inceleyin). En son ADD AX,BX ile bu iki deer toplanp
AXe atanmtr. Son t komutundan sonra AX=2463 olmutur ve en sondaki NC ifadesi
CYye dnmtr ki bu da ilemin sonucunda bir tama olduunu gsterir.
14
2.1.5.2 Parity Biti
Bir ilem sonucunda wordun dk seviyeli bayt iki ile tam blnyorsa bu bite 1 aksi
taktirde 0 atanr. lemin yksek seviyeli baytndaki saynn iki ile blnp blnmemesi bu
flag iin nemli deildir.
2.1.5.3 Auxilary Carry Biti
CPU tarafndan gerekletirilen ilem sonucunda alc alann ilk drt biti zerinde bir tama
gerekleiyorsa bu flagn deeri 1 yaplr.
Yukarda carry flag iin verilen rnekte ilk saynn ilk drt biti olan 1010 (hex A) ve ikinci
saynn ilk drt biti olan 1001 (hex 9) toplam sonucu 0011 says elde edilmi ve bir sonraki
bite bir elde say aktarlmtr. ADD ilemi ncesinde NA (0) olan bitin deeri, ilem
sonrasnda AC (1) olmutur.
2.1.5.4 Zero Biti
Yaplan herhangi bir ilem sonucu sfr ise bu flag set edilir.
-a100
1E40:0100 mov ax,12
1E40:0103 xor ax,ax
1E40:0105
-t
AX=0012 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0103 NV UP EI PL NZ NA PO NC
1E40:0103 31C0 XOR AX,AX
-t
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0105 NV UP EI PL ZR NA PE NC
1E40:0105 F0 LOCK
1E40:0106 01D8 ADD AX,BX
Yukarda nce AX registernn deeri 12 yaplyor. Daha sonra bu register kendisi ile XOR
ilemine tabi tutulmutur. Bir saynn kendisi ile XOR ilemine tabi tutulmas sonucu 0 elde
edilir. Bu durum zero flagn deerini set etmitir ( NZ ZR ).
2.1.5.5 Sign Biti
aretli saylarda bayt (8 bit) iin saynn 7. ve word (16 bit) iin saynn 15. biti iaret biti
olarak adlandrlr. Yaplan bir ilem sonucunda alc alan iersindeki iaret biti sign flag
ierisine kopyalanr. Yani sign bitinin deeri 0 ise elde edilen sonu pozitif, 1 ise elde edilen
sonu negatif kabul edilir.
2.1.5.6 Trace Biti
CPUnun sadece bir komut altrp beklemesi iin kullanlr. DEBUGn kulland Trace
ilemi bu flagn set edilmesi ile gerekletirilir.
2.1.5.7 Interrupt Biti
CPUnun eitli aygtlardan gelen kesme isteklerini dikkate alp almayacan bildirir. 0 olmas
durumunda istekler dikkate alnmayacaktr.
15
2.1.5.8 Direction Biti
Bu flagn deeri genellikle dizgi ilemleri zerindeki ilemin ynn belirtmek iin kullanlr.
2.1.5.9 Overflow Biti
aretli saylar zerindeki tamay kontrol etmek iin kullanlr. Hatrlarsanz iaretsiz saylar
iin carry flag kullanlmtr. Fakat durum iaretli saylar iin biraz daha farkldr. aretli
saylarda meydana gelecek bir tama bayt veya wordun iaret bitini etkileyecei iin pozitif
(iaret biti 0) olan bir iaretli saynn tama sonucu negatif (iaret biti 1) gibi alglanmas
mmkndr. Bu durumda overflow flag set edilir ve ilem sonucunun yanl alglanmas
engellenir.
2.2 Bellek ve Yaps
Bilgisayarmzda bir program altrdmz zaman program nce RAMe yklenir ve daha
sonra altrlr. Ykleme ilemi programn kod, data gibi blmlerinin eitli belek alanlarna
ayr ayr yklenmesi ile yaplr. Bu alanlara segment ad verilir. 8086 ilemcide bu
segmentlerden her birinin boyu 64 Kb (65535 bayt) boyundadr. Bu deer 32-bit ilemcilerde 4
Gb kadardr. Biz 8086 ilemci ve 16-bit uzunluundaki bellek blgeleri ile altmza gre
adresleyebileceimiz maksimum alan 64 Kb boyundadr. 8086 ilemci programcya zerinde
alabilecei drt adet segment salar. Bunlar : CODE, DATA, EXTRA ve STACK
segmentleridir. Bu segmentlerin balang adresleri CODE SEGMENT iin CSde, DATA
SEGMENT iin DSde, EXTRA SEGMENT iin ESde ve STACK SEGMENT iin SSde
saklanr.
Yukarda anlattmz 64 Kblk segmentler de kendi ilerinde 1 baytlk blmlere
ayrlmlardr. Segmentlerin ierisindeki bu bir baytlk blmlere OFFSET ad verilir. Yani bir
segment ierisinde 65535 tane offset vardr. Programc tarafndan girilen her komut tuttuu
bayt says kadar offset adresini ileri alr.
Bellek ierisindeki herhangi bir noktaya erimek iin SEGMET:OFFSET ikilisi kullanlr.
Code segment ierisindeki bir noktaya erimek iin segmet adresi olarak CSdeki deer ve
offset adresi olarak IP ierisindeki deer kullanlr. Ayn ekilde stack segment ierisindeki bir
deere ulamak iin segment adresi olarak SS ierisindeki deer ve offset adresi olarak SP veya
BPden biri kullanlr.
Bellek ve verilerin nasl depoland konusunda aadaki rnek size yardmc olacaktr.
-A100
1E40:0100 MOV AH,01
1E40:0102 INT 21
1E40:0104 CMP AL,45
1E40:0106 JNE 0100
1E40:0108 INT 20
1E40:010A
-G
GGHJRE
Program normal olarak sonlandrld
-U 100
1E40:0100 B401 MOV AH,01
1E40:0102 CD21 INT 21
1E40:0104 3C45 CMP AL,45
1E40:0106 75F8 JNZ 0100
1E40:0108 CD20 INT 20
1E40:010A D3E8 SHR AX,CL
1E40:010C 94 XCHG SP,AX
1E40:010D 00726D ADD [BP+SI+6D],DH
16
1E40:0110 E87000 CALL 0183
1E40:0113 A396D3 MOV [D396],AX
1E40:0116 8A04 MOV AL,[SI]
1E40:0118 3C20 CMP AL,20
1E40:011A 740C JZ 0128
1E40:011C 3400 XOR AL,00
1E40:011E 2F DAS
1E40:011F 1E PUSH DS
-
Yukardaki ksa program klavyeden girilen her tuu okur ve girilen E oluncaya kadar okuma
ilemine devam eder. (Bu arada programn boyunun sadece 10 bayt olduuna dikkat edin. C
veya Pascal ile ayn program ka KB tutard acaba!! ). nce program yazdk ve daha sonra
G ile altrdk. En son olarak da U 100 ile 100. offset adresinden itibaren datma
(unassemble) ilemi yaptk. Dikkat ederseniz her satrn banda 1E40:0104 gibi, iki nokta
ile ayrlm iki say var. Bu saylar sras ile komutun segment ve offset adresleridir. Yani
bilgisayarmzn 1E40. segmenti o anki geerli kod segmentimiz ve bu segment ierisindeki
0104. offset de (aslnda 0104. ve 0105. offsetler) ierisinde CMP AL,45 komutunu
barndrmaktadr. Bir sonraki satrda bu saylar 1E40:0106 halini alyor ki buda bize offset
adresimizin 2 arttn gsteriyor. Yani CMP AL,45 komutu bilgisayarmzn belleinde 2
baytlk yer kaplyor. Datma ileminde segment ve offset adreslerinin sandaki saylar ise
sizin girdiiniz komutlarn bellekte bulunduklar hallerinin on altlk tabandaki karlklardr.
te bilgisayar asl olarak bilgiyi belleinde saylar halinde saklar ve assembly dili bu saylarn
insan iin daha okunur hale gelmi halidir. Yani CPU 3C45 (0011 1100 0100 0101 = 16-bit )
ile karlat zaman bunun bir karlatrma komut olduunu anlar ve ona gre ilem yapar.
Dier komutlarda ayn ekilde ilem grmektedir. Eldeki bilginin komut mu yoksa bir deiken
mi olduu, bilginin bulunduu segment aracl ile anlalr.
2.3 Stack
Yksek seviyeli programlama dillerinde deerler deiken ad verilen alanlarda saklanr.
Assembly dilinde ise programc deerleri saklamak iin CPU registerlarn ve stack
kullanlr. Stack, bilgilerin geici olarak depoland bir blmdr. 8086 ilemci programcya
64 Kb boyundu bir stack segment salar. Bu segmentin balang adresi SS ierisinde ve o anki
geerli offset adresi ise SP (Stack Pointer) ierisinde bulunur.
Stack ierisinde, program ierisindeki fonksiyonlarn geri dn deerleri, fonksiyonlara
aktarlan argmanlar, komut satr parametreleri gibi deerler saklanr. Ayrca programc baz
deerleri geici olarak bu alana depolayp daha sonra kullanabilir.
Stack iersinde yerletirme ilemi kelimeler (word) halinde olur. Yani, stack zerinde bir
ilemde her seferinde iki offset geriye veya ileriye gidilir. Stack programcya sral eriim
salar. Stack segmentimizin 0000-FFFF arasnda deien offset adresleri ve SPnin o anki
deerinin FFFF olduunu varsayarsak, stack zerine konulacak ilk deer FFFF ve FFFE
adreslerine yazlr (ki bayt veri yazlp okunabilir). Daha sonra SPnin deeri yazlacak bir
sonraki deerin adresini
belirtmek zere FFFD olarak deitirilir.
17
Yukarda stack pointern ilk deeri FFFFdir (ekil1). Stack zerine ilk bilgi aktarmndan
sonra bir sonraki bilginin yazlaca adresi belirtmek iin SP=FFFD oluyor (ekil 2). FFFF ve
FFFE adreslerine srasyla 89 ve 67 saylar yazlm. Bu bize stack zerine yazlan bilginin
6789h olduunu gsteriyor. Ayn ekilde, daha sonra 1234h deeri stack zerine aktarlyor
(ekil 3) ve SPnin deeri FFFB olarak deiiyor. ekil 4te stack zerinden bilgi alnyor. lk
iki ilemin tersine bu sefer SPnin deeri 2 artyor ve FFFB+2=FFFD oluyor. Yani o andan
sonra yazlacak ilk deer FFFD ve FFFC adreslerine yazlacaktr. Ksaca, stack zerine bilgi
yazld zaman SPnin deeri azalr ve bilgi okunduu zaman artar.
Stack LIFO (Last-In First-Out) prensibi ile alr. Yani stack zerine yazlan en son bilgi
alnabilecek ilk bilgi ve yazlan ilk bilgi de alnabilecek son bilgidir. Yukardaki rnekte ilk
nce 6789h says daha sonra 1234h says stack zerine yazld. lk yazlan deer olan 6789ha
ulamak iin nce 1234h okunmal.
Stack zerindeki ilemler PUSH ve POP komutlar ile gerekletirilmektedir.
MOV komutu: Bir sonraki blm olan 80x86 lemcilerde Bellek Adresleme ksmnda bellek
ve CPU registerlar arasndaki bilgi transferi MOV komutu kullanlarak anlatlacaktr.
MOV hedef,kaynak
MOV komutunun kullanm ekli yukardaki gibidir. Bu komut kaynak ierisindeki bilgiyi
hedefe aktarr. Yani
MOV AX, 1234h
MOV BX, AX
Yukarda ilk nce AX registerna 1234h deeri yazlmtr. Daha sonra bu deer AX
registerndan BX registerna aktarlmtr. Yani Program sonunda AX=1234h ve BX=1234h
olur.
Komutun kullanmnda dikkat edilmesi gereken en nemli nokta hedef ve kaynak
alanlarnn eit boyutlarda olmasdr (rneimizde 16-bit.).
18
2.4 80x86 lemcilerde Bellek Adresleme
8086 ilemci programcya bellee ulam iin 17 eit adresleme metodu salar. Assembly
programlama dilinde bellek adresleme ve bellee eriim en nemli ve iyi bilinmesi gereken
konulardandr.
Displacement-only
Base
Displacement + Base
Base + Indexed
Displacement + Base + Indexed
Kullanlan 17 eit adresleme metodu yukardaki be ana kategoriden tretilmektedir.
2.4.1 Dorudan Adresleme (Direct Addressing)
Bu adresleme metodu anlalmas en kolay olandr. Bu yolla adresi verilen herhangi bir bellek
gzne okuma veya yazma yaplr. Kullandmz bellek 16-bitlik adreslerden olutuuna gre
adres sabitlerimiz de drt hanelik on altlk saylardan olumaldr.
MOV AX, [4126]
MOV CX, CS:[4A4C]
MOV DS:[41C8], BX
Yukarda ilk satrda MOV AX, [4126] ile bellekteki 4126h ve 4127h adreslerindeki
deerler AX registerna atanmtr. 4126h adresi 1 bayt ve AX register 2 bayt olduu iin
hem 4126h hem de 4127h adresindeki deerler okunmutur.
kinci rnekte Code Segment ierisindeki 4A4Ch ve 4A4Dh adresindeki deerler CX
registerna atanmtr. Grdnz gibi CS:[4A4C] gibi bir ifade kullanarak istediiniz
herhangi bir segment ierisindeki bilgiye eriebiliyorsunuz.
Son olarak da MOV DS:[41C8], BX komutu ile BX ierisindeki deer Data Segment
ierisindeki 41C8h ve 41C9h adreslerine yazlyor.
2.4.2 Dolayl Adresleme (Indirect Addressing)
Bu metot ile herhangi bir register ierisinde barndrlan deerin gsterdii bellek
blgesindeki alan ile ilem yaplr. Bu metot iin kullanlabilecek drt register BX (Base), BP
(Base Pointer), SI (Source Index) ve DI (Destionation Index)dr. Bu yol ile adreslemeye
aada birka rnek verdim.
Based
MOV BX, 1234
MOV AX, [BX]
nce BXin deeri 1234h olarak
deitiriliyor. Daha sonra bellekte
1234 ile iaret edilen yerdeki deer
AX ierisine atanyor. Yani
yandaki komut kmesi
MOV AX, [1234]
ile ayn ii yapyor.
Based
MOV BP, 45C8
MOV AX, [BP]
BP = 45C8h
MOV AX, [45C8]
19
Indexed
MOV DI, 76A7
MOV AX, [DI]
DI = 76A7h
MOV AX, [76A7]
Indexed
MOV SI, D78C
MOV AX, [SI]
SI = D78Ch
MOV AX, [D78C]
lk iki adresleme ynteminde Base registerlar olan BX ve BP kullanld iin bu yntem
Based olarak adlandrlr. Ayn ekilde DI ve SI ile yaplan adreslemelerde de Index registerlar
kullanld iin Indexed olarak adlandrlr.
Bir nceki blmde olduu gibi bu yntemde de ulalmak istenen offset iin ayr bir
segment belirtilebilir. Yukarda BX, DI ve SI n tanml olarak DS (Data Segment)i kullanr.
BP iin n tanml segment SS ( Stack Segmenttir).
2.4.3 Indexed Adresleme
Bu metot ile istenilen yere ulamak iin hem bir sabit hem de yukardaki gibi bir register
kullanlr. stenilen offset adresi kullanlan sabit ile register ierisindeki deerin toplamdr.
Yine yukarda olduu gibi BX, DI ve SI n tanml olarak DSi ve BP n tanml olarak BPyi
segment olarak kullanr. Tabi ki istenildii taktirde farkl segmentlerdeki verilere ulamak
mmkndr.
MOV BX, 7A82
MOV AL, 78[BX]
BX = 7A82
7A82 + 78 = 7AFA
MOV AL, [7AFA]
Grdnz gibi yukarda MOV AL, 78[BX] komutu ile BX ierisinde bulunan 7A82h
deeri ile sabitimiz olan 78h deerini toplam olan 7AFAh offseti ierisindeki deer ALye
atanyor. Tabi, BX kullanld iin kaynak segment olarak Data Segment kullanlmaktadr.
2.4.4 Based Indexed Adresleme
Bu yntem dolayl adresleme yntemi ile benzerlik gstermektedir. Tek fark burada bir deil
,biri Base dieri Index register olmak zere iki farkl register kullanlmasdr. Hedef blgeye
atanacak deer bu iki register ierisindeki deerin toplamnn gsterdii offset ierisindeki
deerdir.
MOV BX, D854
MOV SI, 278C
MOV AL, [BX][SI]
BX = 7A82
SI = 278C
D854 + 278C = FFE0
MOV AL, [FFE0]
20
MOV BP, 54AC
MOV DI, 4444
MOV AL, [BP][DI]
BP = 54AC
DI = 4444
54AC + 4444 = 98F0
MOV AL, [98F0]
Yukardaki ilk rnekte n tanml segment Data Segment ve ikincide ise Stack Segmenttir.
2.4.5 Based Indexed + Sabit(Disp) Adresleme
Bu yntem yukardaki btn yntemleri kapsar. Genel formu aadaki gibidir ve registerlar
ierisindeki deer ile sabitin toplamnn verdii offset adresindeki deer ile ilem yaplr.
MOV AL, DISP[BX][SI]
MOV BL, DISP [BX+DI]
MOV BH, [BP+SI+DISP]
MOV AH, [BP][DI][DISP]
Blm 3 : 80x86 Komut Kmesi
Bu blmde Intel firmasnn 80x86 serisi ilemcilerini programlamak iin kullanlan
assembly komutlarndan bir ksmn inceleyeceiz.
Transfer komutlar
MOV
XCHG
LEA
PUSH
PUSHF
POP
POPF
LAHF
SAHF
Giri/k komutlar
IN
OUT
Aritmetiksel Komutlar
ADD
ADC
SUB
SBB
MUL
IMUL
DIV
21
IDIV
INC
DEC
CMP
Mantksal Komutlar
AND
OR
XOR
NOT
TEST
Kaydrma ve Dndrme Komutlar
SAL/SHL
SHR
SAR
RCL
ROL
RCR
ROR
Dallanma Komutlar
JMP
JZ/JE
JNZ/JNE
JB/JC/JNAE
JBE/JNA
JNB/JNC/JAE
JG/JNLE
JA/JNBE
JL/JNGE
JLE/JNG
JS ve JNS
JO ve JNO
JCXZ
Dng Komutlar
LOOP
LOOPZ/LOOPE
LOOPNZ/LOOPNE
3.1 Transfer Komutlar
Bu grup ierisindeki komutlar herhangi bir bilgiyi register-register, bellek-register ve register-
bellek blgeleri arasnda transfer etmek iin kullanlr.
22
3.1.1 MOV Komutu
MOV komutuna daha nce bellek adresleme blmnde ksaca deinilmiti. Bu ksmda
komutun kullanm hakknda daha ayrntl bilgi verilecektir. Mov komutunun eitli kullanm
biimleri aadaki gibidir.
Genel Form : mov hedef, kaynak
mov register, register
mov bellek, register
mov register, bellek
mov bellek, sabit deer
mov register, sabit deer
Yukarda mov komutunun eitli kullanm ekilleri gsterilmitir. Dikkat ederseniz kullanm
ekilleri arasnda bellek-bellek arasnda transfer yok. Yukardaki register ifadeleri hem genel
amal registerlar hem de segment registerlarn temsil etmektedir. Yalnz, kesinlikle bir sabit
deer dorudan bir segment registerna atlamaz. Byle bir ilem aadaki gibi iki aamada
gerekletirilir.
mov ax, 1234
mov cs, ax
Yukardaki rnekte CS ierisine 1234h deeri atanmtr.
Dikkat edilmesi gereken bir baka nemli nokta da transferi yaplacak deerlerin boylarnn
ayn olmasdr. Yani AH ierisine 16-bitlik bir deer atams yaplamaz. Ayn ekilde 8-bitlik
bir registerdan 16-bitlik bir resgistera da transfer yaplamaz.
Herhangi bir bellek blgesi dolayl adresleme ile adreslenip ierisine sabit bir deer atanmak
istendii zaman atanacak deerin uzunluu belirtilmelidir.
mov [bx], 12 Hata !
mov byte ptr [bx], 12
yada
mov word ptr [bx], 1234
byte ptr ve word ptr nekleri ile transfer edilecek bilginin boyu hakknda ilemciye bilgi
verilmektedir.
NOT: 32-bit ilemcilerde ( 80386 ve sonrasnda ) dword ptr neki ile 32-bit bilgi transferi
yaplabilmektedir.
MOV komutu flag registerlar zerinde herhangi bir deiiklik yapmamaktadr.
23
3.1.2 XCHG Komutu
XCHG (exchange) komutu iki deeri karlkl olarak deitirmek iin kullanlr. Tabi yine
deiiklik yaplacak deerlerin ayn boyda olmas gerekmektedir. Genel formu aadaki
gibidir.
xchg register, register
xchg bellek, register
xchg komutunun kullanmnda operandlarn yerleri nemli deildir. Yani xchg bellek,
register ile xchg register, bellek ayn ii yapmaktadr.
mov ax,1234 AX=1234h
mov bx, 5678 BX=5678h
xchg ax,bx AX=5678h BX=1234h
XCHG komutu flag registerlar zerinde herhangi bir deiiklik yapmamaktadr.
3.1.3 LEA Komutu
LEA komutunun kullanm MOV komutu ile benzerlik gstermesine karn baz durumlarda
programcya iki yada komut ile yaplacak bir ilemi tek komut ile yapma olana
salamaktadr. Genel formu aadaki gibidir.
lea register, bellek
Komutun kullanmna birka rnek verince programcya salad kolaylklar daha basit
anlalacaktr.
lea ax, [bx] mov ax, [bx]
lea bx, 3[bx] BX = BX+3
Yukardaki kullanmlar lea komutu dnda tek bir komut ile icra edilebilecek durumlardr.
(BX = BX+3 ifadesinin assembly dilindeki karl daha anlatlmad iin normal bir gsterim
kullanlmtr) Aadaki rnekler incelenirse komutun salad kolaylk aka fark
edilecektir.
lea ax, 3[bx] BX = BX+3 mov ax, bx
lea ax, 8[bx+di]
LEA komutunun genel kullanm amac herhangi bir registera bir bellek adresi saklamaktr.
Komut kullanm srasnda flag registerlar zerinde herhangi bir etki yapmamaktadr.
24
3.1.4 PUSH Komutu
PUSH komutu herhangi bir bilgiyi bilgisayarn stack ad verilen blmne kaydetmek iin
kullanlr. PUSH komutu ile stack zerine atlacak bilgi 16-bit uzunluunda olmaldr.
Komutun genel formu aadaki gibidir.
PUSH deer
Yukarda deer ile gsterilen ksm daha ncede belirtildii gibi 16-bit uzunluunda
olmaldr. Bunun yan sra deer ile gsterilen ksm sabit bir deer alamaz. Yani PUSH ile
stack zerine yazlacak deer ya bir register ierisindeki deer yada bir bellek blgesindeki
deer olmaldr.
PUSH komutu ile stack zerine bilgi yazld iin SPnin deeri deimektedir. cra edilen
her PUSH komutu SPnin deerini 2 azaltacaktr (PUSH ile 2 bayt bilgi aktarld iin).
Aada PUSH komutu ile stack zerine bilgi aktarlmasna bir rnek verilmitir.
mov ax,1234 AX = 1234h
push ax AX > STACK , SP = SP-2
Stack zerine bilgi yazma ilemi gerekli deerlerin geici bir sre saklanmas iin ve baz
UNIX sistemlerde kesme kullanmnda gerekli parametrelerin aktarlmas iin iaretiler ile
birlikte kullanlr.
3.1.5 PUSHF Komutu
PUSHF komutu ile PUSH komutuna benzer olarak stack zerine bilgi aktarlr. Yalnz burada
tek fark, PUSHF komutu ile aktarlacak bilginin herhangi bir register yada bellek blgesinden
deil de flag registerdan alnmasdr. Komutun kullanm aadaki gibidir.
PUSHF
Grld gibi komutun kullanm srasnda hibir register yada bellek adresi
kullanlmamtr. Onun yerine stack zerine atlacak bilgi dorudan 16-bit uzunluundaki flag
resigter ierisindeki deerdir.
Komut herhangi bir ilem srasnda flag registern mevcut deerini korumak iin kullanlr.
Yine PUSH komutunda olduu gibi PUSHF komutu da SPnin deerini 2 azaltacaktr.
3.1.6 POP Komutu
POP komutu ile stack zerinden bilgi okumas yaplr. Yani PUSH komutu ile stack zerine
yazlan bilgi POP komutu ile geri okunur. Okunan bilgi 16-bit uzunluunda olmaldr.
POP komutu ile alnacak bilgi stack zerine yazlan son bilgidir. PUSH ve POP komutlar ile
bilgi transferi yaplrken yazlan ve okunan bilgilerin sralamas nemlidir. Programlar
yazlrken stack zerindeki ilemlerde hesaplama hatas yaplmas sk karlalan
durumlardandr. Komutun genel kullanm aadaki gibidir.
POP alc_alan
Yukarda alc alan bir bellek blgesi veya register olabilir.
25
mov ax,1234 AX = 1234h
push ax AX > STACK , SP = SP-2
mov ah,01 AH = 01 ,AXin deeri deiti!
pop ax AX = 1234h
rneimizde nce AXe bir deer atanyor ve daha sonra AHn deeri deitirilmek sureti
ile dolayl olarak AXinde deeri deitiriliyor. Son ilemde de POP komutu ile AXin nceden
stack zerine PUSH ile atlan eski deeri geri alnyor.
3.1.7 POPF Komutu
POP komutu ile PUSH eletirilir ise PUSHF komutu ile de POPF komutunu eletirmek
yanl olmaz. POPF komutu ile stack zerinden 16-bitlik bilgi flag registera yazlr. Alnan 16
bitin hepsi ilemci tarafndan dikkate alnmaz. Bitlerin word ierisindeki sralarna gre ilemci
iin ifade ettikleri deerler aada verilmitir.
0. bit Carry biti
2. bit Parity biti
4. bit Auxilary biti
6. bit Zero biti
7. bit Sign biti
8. bit Trap biti
9. bit Interrupt biti
10. bit Direction biti
11. bit Overflow biti
POPF komutu anlalaca zere flag registern deerini tamamen deitirmektedir. Komut
tpk PUSHF komutunda olduu gibi tek bana kullanlr.
PUSH, PUSHF, POP ve POPF komutlarnn stack zerinde ileyilerini tam olarak
kavrayabilmek iin yaznn daha nceki blmlerinde yer alan Stack ksmn tekrar
okumanz tavsiye ederim.
3.1.8 LAHF Komutu
LAHF (Load AH from Flags) komutu AH registerna flag registern dk seviyeli baytn
kopyalar. Kopyalanan bitler sign, zero, auxilary, parity ve carry bitleridir. Bunlarn dnda
kalan overflow, direction, interrupt ve trace bitlerinin komut ile bir ilgisi yoktur. Komutun
kullanm aadaki gibidir.
lahf
Grld gibi komut tek bana kullanlmaktadr. Komutun icras srasnda flag registerda
herhangi bir deiiklik olmaz.
3.1.9 SAHF Komutu
SAHF (Store AH into Flags) komutu da LAHF komutu gibi flag register zerinde ilem
yapar. AH ierisindeki deer flag registern dk seviyeli baytna kopyalanr. Yine ilemden
26
etkilenen bitler sign, zero, auxilary, parity ve carry bitleridir. Komutun kullanm LAHF
komutunda olduu gibi tek banadr.
3.2 Giri/k Komutlar
80x86 serisi ilemcilerde giri ve k birimlerine ulamak iin in ve out komutlar
kullanlr. Aslnda bu komutlar bir bakma MOV komutu ile benzer ekilde i yapmaktadr. Tek
fark bu komutlarn zel olarak bilgisayarn G/ birimi iin ayrlm olan bellek blgesi ile
almalardr.
3.2.1 IN Komutu
in ax/al, port
in ax/al, dx
IN komutunun genel kullanm yukarda gsterilmitir. IN komutu ile port veya dx ile
belirtilen port adresinden okunan bilgi boyutuna gre AX yada AL ierisine kopyalanr.
Eriilmek istene port 0-255 arasnda ise port numaras kullanlr. Aksi taktirde, yani eriilmek
istenen port 256 ve 80x86 ilemcinin maksimum destekledii port numaras olan 65535
arasnda ise istenen port numaras DX ierisine atlr ve daha sonra IN komutu ile eriim
salanr. Komutun icrasnda flag register herhangi bir deiiklie uramaz.
3.2.2 OUT Komutu
out port, ax/al
out dx, ax/al
OUT komutunun kullanm IN komutu ile benzerlik gstermektedir. Tek fark IN komutunda
port ierisindeki bilgi AX/ALye atanrken OUT komutunda AX/AL ierisindeki bilgi porta
gnderilir. Yine IN komutunda olduu gibi 0-255 aras adreslerde dorudan port numaras
girilirken 256-65535 aras adreslerde DX ile adresleme yaplr. Komutun icrasnda flag register
herhangi bir deiiklie uramaz.
mov al, 2e AL = 2Eh
out 70, al 70h. Porta 2E deeri gnderiliyor
in al,71 Gnderilen istee karlk 71h.
porttan geliyor. Gelen deer AL
ierisine alnyor.
Yukarda OUT komutu ile 70h CMOS portuna bilgi yollanyor. CMOS gelen sinyale 71h
portundan cevap veriyor ve biz gelen cevab IN komutu ile AL ierisine kaydediyoruz.
3.3 Aritmetiksel Komutlar
80x86 programcya toplama, karma, arpma, blme gibi temel aritmetiksel ilemlerin yan
sra elde edilen sonular deiik biimlerde saklama olana salar. Aritmetiksel komutlarn
icras srasnda flag register deiiklie uramaktadr.
27
3.3.1 ADD Komutu
ADD komutu toplama ilemini gerekletirmek iin kullanlr. Genel formu aadaki gibidir.
add hedef, kaynak
ADD komutu ile kaynak ierisindeki deer hedef ile toplanp hedef ierisine
kaydedilir. hedef ve kaynak alanlar register-register, bellek-register, register-bellek
iftlerinden birisi olabilir.
mov ax, 1234 AX = 1234h
mov word ptr [4444], 1000 [4444] = 1000h
add word ptr ax, [4444] AX = AX + [4444]
= 1234h + 1000h
= 2234h
Yukardaki rnekte ilk nce AXe 1234h deeri atanmtr. Daha sonra 4444h adresli bellek
gzne word uzunluklu 1000h deeri yazlmtr (Bu ilem iin iki bellek gz kullanlmtr).
En son olarak da AX ierisindeki deeri 4444h bellek gz ile iaret edilen word ile toplanp
sonu yine AX ierisine atlmtr.
3.3.2 ADC Komutu
ADC komutu da tpk ADD komutu gibi toplama ilemi iin kullanlr. Tek fark ADC
komutunda toplama bir de carry flagn deerinin eklenmesidir. Genel formu aadaki gibidir.
adc hedef, kaynak
Yaplan ilemi aritmetiksel olarak gstermek gerekirse aadaki gsterim yanl
olmayacaktr.
hedef = hedef + kaynak + carry flagn deeri
ADC komutu ile pe pee yaplan toplama ilemlerinde eldelik saynn gz ard edilmemesi
salanmaktadr.
3.3.3 SUB Komutu
SUB komutu karma ilemi iin kullanlr. Kullanm ADD komutunda olduu gibidir.
sub hedef, kaynak
kaynak ierisindeki deer hedef ierisinden kartlp sonu hedef ierisinde saklanr.
lemin aritmetiksel gsterimi
hedef = hedef kaynak
28
eklindedir. Aslnda CPU, SUB komutu ile hedef ile -kaynak deerlerini toplamaktadr.
Gerekte yaplan ilem yine bir toplama ilemidir.
mov ax, 8da7 AX = 8DA7h
mov bx, 4a43 BX = 4A43h
sub ax, bx AX = AX BX
= 8DA7h 4A43h
= 4364h
3.3.4 SBB Komutu
sbb hedef, kaynak
SBB komutu ile SUB arasndaki iliki, ADD komutu ile ADC arasndaki iliki ile ayndr.
SUB komutu ile ayn ie yaplr yalnz burada hedef alana atlan deerden carry flagn
deeri de kartlr. lemin aritmetiksel gsterimi
hedef = hedef kaynak carry flagn deeri
3.3.5 MUL Komutu
MUL komutu arpma ilemini gerekletirmek iin kullanlan komuttur. Aritmetiksel olarak
arpma ilemi iki deer ile gerekletirilmesine karn MUL komutu sadece bir deer alr.
MUL komutu ile kullanlan deer gizli olarak ax/al ierisindeki deer ile arpma ilemine tabi
tutulur.
mov ax,0045 AX = 0045h
mov bx,11ac BX = 11ACh
mul bx AX = AX * BX
= 0045h * 11Ach
= C35Ch
Yukarda arpma ileminin bir elaman olan 0045h says AX ierisine atlmtr. Bir sonraki
admda ileme sokulmak istenen dier say olan 11ACh says BX ierisine atldktan sonra
mul bx komutu ile BX ierisindeki say dorudan AL (AH=00) ile ileme sokuluyor ve elde
edilen arpm AX ierisinde saklanyor.
mov ax, 0005 AX = 0005h
mov word ptr [4000], 1212 [4000] = 12 , [4001] = 12
mul word ptr [4000] AX = AX*[4001][4000]
29
Yukarda arpma ilemi iin kullanlacak ikinci saymz bir bellek blgesinden okunmaktadr.
Dikkat ederseniz ilemlerimde word ptr ile atama yaptm deerin uzunluu hakknda
ilemciye bilgi veriyorum. MUL komutunu kullanrken ilem yapacanz say bir bellek
blgesinde ise word ptr ve byte ptr gibi yardmc bilgilerle ilemciye zerinde ilem
yaplacak bilginin uzunluu hakknda bilgi vermeniz gerekmektedir
Diyelim ki arpma ilemi sonunda bulduunuz sonu 16-bitlik bir alana smyor. Byle bir
durumda bulunan sonu DX:AX ikilisi ierisinde saklanr.
mov ax, 4321 AX = 4321h
mov cx, 4586 CX = 4586h
mul cx AX * CX = 4321h * 4586h
= 123B0846h (32-bit)
= DX = 123Bh , AX = 0846h
3.3.6 IMUL Komutu
IMUL komutu da MUL komutu gibi arpma ilemi iin kullanlr tek fark IMUL komutunun
iaretli saylar zerindeki ilemler iin kullanlan bir komut olmasdr. IMUL komutu ile
gerekletirilen bir ilem sonucunda AH (sonu AX ierisine syor ise) veya DX (sonu AX
ierisine smyor ise) sfrdan farkl ise arpma ileminin sonucu negatiftir. Eer ilem
sonucunda bir tama olmu ve AH veya DX ierisinde sonucun iaretine deil de kendisine ait
bir deer varsa carry ve overflow flaglar set edilmi olacaktr.
3.3.7 DIV Komutu
Blme ilemi iin kullanlan bir komuttur. DIV komut da MUL komutundan olduu gibi
sadece bir deer ile ileme girer ve gizli olarak AX registern kullanr. Genel formu aadaki
gibidir.
div blen_deer
Blme ileminde blen_deeriin uzunluu, ilem srasnda kullanlacak blnen deerin
uzunluunu da belirler. Szgelimi, blen_deeriin 8-bitlik bir deer olmas halinde blnen
olarak 16-bitlik AX register ileme alnacaktr. lem sonunda blm deeri AL, kalan deeri
de AH ierisine kopyalanr. Ayn ekilde blen_deeri 16-bitlik bir deer ise blnn deeri
olarak DX:AX ifti ileme alnr. Yine ilem sonundaki blm deeri AX ve kalan deeri de
DX ierisine atlr.
8-bitlik bir sayy yine 8-bitlik bir sayya ve 16-bitlik bir sayy yine 16-bitlik bir sayya
blmek iin srasyla AH ve DX registerlarna 0 deeri atanr.
blen_deer olarak bir bellek blgesi kullanlmas halinde ilemciye kullanlan deerin
uzunluu hakknda bilgi verilmelidir.
mov ax, 4a2c
div byte ptr [2155]
30
DIV komutunu kullanrken dikkat edilmesi gereken bir husus da sfr ile blme durumu ile
karlamamak ve blm ksmndaki deerin alc alana sp smaddr. Mesela aadaki
gibi bir ilem sonunda hata ile karlalacaktr.
mov ax, aaaa
div 4
Yukardaki ilemin sonucu ( AAAAh / 4H = 2AAAH 16-bit ) olan 2AAAh says 8-bit bir
register olan AL ierisine smayaca iin hatal olacaktr.
3.3.8 IDIV Komutu
IDIV komutu DIV komutu gibi blme ilemi iin kullanlr. DIV komutundan fark, IDIV
komutunun iaretli saylar zerinde ilem yapmak iin kullanlmasdr. DIV komutu iin
yukarda anlatlanlarn dnda IDIV komutunun kullanmnda dikkat edilmesi gereken bir
nokta AH veya DX deerleri sfrlanrken saynn iaret bitinin korunmasdr. Mesela ileme
konulacak blen deer 8-bit bir negatif say ve blnen de 8-bit bir say ise AHn btn
bitlerine AL ierisindeki 8-bitlik negatif saynn iaret biti olan 1 deeri atanmaldr.
3.3.9 INC Komutu
INC komutu kendisine verilen register yada bellek blgesi ierisindeki deeri bir arttrr. C
dilindeki ++ komutu ile ayn ii yapmaktadr. Aada, komutun kullanmn C dilindeki gibi
gstermeye altm.
mov ax, 000f degisken = 15 ;
inc ax degisken++ ;
Flag register zerinde, carry flag dnda, ADD komutu ile ayn etkiyi yapar.
add ax,1
inc ax
Yukardaki iki komut da ayn ii yapmaktadr. Fakat INC komutu ile gerekletirilen ilem,
ilemci tarafndan daha hzl bir ekilde gerekletirilir ve bellekte kaplad alan ilkinin te
biri kadardr. Bu sebeplerden add ax,1 gibi kullanmlar yerine inc ax komutu
kullanlmaktadr.
inc byte ptr [125a]
inc word ptr [7ad8]
inc byte ptr [bx+di]
31
Bir bellek blgesindeki deer INC komutu ile ileme alnacaksa, ilemciye zerinde ilem
yaplacak bilginin uzunluu belirtilmelidir.
3.3.10 DEC Komutu
DEC komutu kendisine verilen register yada bellek blgesi ierisindeki deeri bir azaltr.
Yine INC komutundan olduu gibi C dilinden bir rnek vermek istiyorum.
mov ax, 000f degisken = 15 ;
dec ax degisken-- ;
Yukarda da grld gibi DEC komutu C dilindeki -- komutuna karlk gelmektedir.
DEC komutu ile yaplan bir azaltma ilemi sub ax,1 komutu ile de gerekletirilebilirdi fakat
DEC komutu SUB komutuna gre bellekte daha az yer kaplar ve daha hzl alr.
dec word ptr a8[bx+di]
DEC komutu ile azaltlacak deer bir bellek blgesinde ise deerin uzunluu word ptr yada
byte ptr ile ilemciye bildirilmelidir.
3.3.11 CMP Komutu
CMP komutu SUB komutu gibi alr.
cmp deger1, deger2
Yukarda deger1 ve deger2 yerine srasyla register-register, register-bellek blgesi,
bellek blgesi-register ve register-sabit deer deerleri kullanlabilir.
CMP komutu ksaca deger1den deger2yi karmaktadr. Fakat SUB komutundan farkl
olarak sonu herhangi bir yere kaydedilmez. Onun yerine, ilem sonucunda deien flag
register bitlerinin deerine gre programda dallanma yaplr. CMP komutundan sonra sonuca
gre genellikle koullu dallanma komutlar ile programn ak deitirilir.
cmp ax, bx
Komut flag register zerinde ksaca u gibi etkilerde bulunur :
AX, BXe eit ise ilemin sonucu sfr olur ve zero flag 1 deerini alr.
AXin deeri BXinkinden kk ise karma ilemi sonunda carry flag 1 deerini
alr.
Sonu negatif ise sign biti 1, pozitif ise 0 deerini alr.
32
3.4 Mantksal Komutlar
Bu komutlar herhangi bir ilem srasnda mantksal karlatrmalar yapmak iin kullanlr.
Blm ierisindeki komutlar incelenmeden nce dokmann Bitler zerinde Mantksal
lemler ksmnn tekrar gzden geirilmesinde fayda var.
Bu komutlar icra grrken kullanlan register yada bellek blgesinin ierisindeki deerler
ayr ayr bitler halinde ileme sokulur.
3.4.1 AND Komutu
and hedef, kaynak
Komutun kullanmnda hedef ve kaynak alanlarna srasyla register-register, bellek
blgesi-register, register-bellek blgesi, register-sabit deer ve sabit deer-register iftlerinden
biri kullanlabilir.
lem srasnda hedef ve kaynak blgesindeki deerler mantksak VE ilemine sokulur ve
ilemin sonuncu hedef alana kaydedilir.
mov ah, a5 AH = A5h = 1010 0101 (binary)
mov al, c1 AL = C1h = 1100 0001 (binary)
and ah, al AND_________________
1000 0001 (binary) = 81h
Yukarda AHa A5h ve ALye C1h deerleri atanm ve daha sonra and ah, al komutu ile
iki deer mantksal ve ilemine sokulmutur. lem sonucunda 81h deeri elde edilmitir.
Elde edilen deer AH registeri ierine atlmtr.
3.4.2 TEST Komutu
TEST komutu tamamen AND komutu gibi alr. Tek fark elde edilen sonucun hedef alana
aktarlmamas onun yerine deien flag bitlerine gre programn aknn kontrol edilmesidir.
3.4.3 OR Komutu
or hedef, kaynak
OR komutu mantksal veya ilemini gerekletirmek iin kullanlr. hedef ve kaynak
alanlar yerine kullanlabilecek deerler AND komutu ile ayndr. lem gerekletikten sonra
elde edilen sonu hedef alan ierisine kaydedilir.
3.4.4 XOR Komutu
xor hedef, kaynak
hedef ve kaynak alanlar iin kullanlabilecek deerler AND komutu ile ayndr. lem
sonucunda elde edilen deer hedef alan ierisine kaydedilir.
XOR komutu herhangi bir registern deerini sfr yapmak iin ska kullanlr. xor ax, ax
komutu mov ax, 0 komutundan daha hzl alr ve bellekte daha az yer kaplar.
33
3.4.5 NOT Komutu
not hedef
NOT komutu dier mantksal komutlardan ayr olarak flag register zerine etki etmeyen tek
komuttur. Kullanm ekli ile de dier komutlardan farkllk gsterir. hedef alan ierisindeki
deerin bitleri ters evrilip yine ayn alana yazlr.
3.5 Kaydrma ve Dndrme Komutlar
Bu blmde daha nce anlatlan Shift ( Kaydrma ) ve Rotate ( Dndrme ) lemleri
balkl ksmdaki ilemlerin assembly komutlar ile gerekletirilmesi anlatlacaktr.
3.5.1 SHL/SAL Komutlar
SHL (Shift Left) ve SAL (Shift Arithmetic Left) komutlar etir.
shl hedef, saya
Her iki komut da hedef alan ierisindeki bit pozisyonunu saya defa sola kaydrr.
Kaydrma ilemi srasnda 0. bit pozisyonuna sfr yazlr ve 7. veya 15. bit pozisyonundaki
deer de carry flag ierisine yazlr.
3.5.2 SHR Komutu
SHL (Shift Right) komutunun kullanm aadaki gibidir.
shr hedef, saya
SHR komutu ile hedef blgesindeki bayt dizilimi saya defa saa kaydrlr. Saa
kaydrma ileminde bota kalan 7. yada 15. bit pozisyonuna 0 deeri atanr ve 0. Bit
pozisyonundaki deer de carry flaga yazlr. Sign biti sonucun her zaman sfr olan yksek
seviyeli bit deerini alr.
Aritmetiksel olarak herhangi iaretsiz bir sayy SHR say, a ilemine sokmak, sayy 2 ile
blmek ile ayn eydir.
3.5.3 SAR Komutu
sar hedef, saya
SAR (Shift Arithmetic Right) komutu SHR komutunda olduu gibi hedef alan ierisindeki
bit dizilimini saya kere saa kaydrr. SHR komutundan fark, sondaki 7. veya 15. bit
pozisyonuna sfr deil de yine 7. veya 15. bit pozisyonundaki deerin yazlmasdr. Flaglar
zerine etkisi, SHRden farkl olarak, sign flag ierisine 7. veya 15. bit pozisyonundaki deerin
yazlmasdr.
34
3.5.4 RCL Komutu
rcl hedef, saya
RCL (Rotate through Carry Left) komutu hedef alandaki bit diziliini sola dndrme
hareketine sokar. lem sonrasnda carry flag ierisindeki deer 0. bit pozisyonuna yazlr ve
arta kalan bit de carry flag ierisine aktarlr.
3.5.5 ROL Komutu
rol hedef, saya
ROL (Rotate Left) komutu da RCL komutu gibi sola dndrme ilemi iin kullanlr. Tek
fark en sonda bo kalan 0. bit pozisyonuna carry flagn deerinin deil de en yksek seviyeli
bitin deerinin yazlmasdr. Bu ilemde de yine yksek seviyeli bit deeri carry flag ierisine
kopyalanr.
3.5.6 RCR Komutu
rcr hedef, kaynak
RCR (Rotate through Carry Right) komutu da aynen RCL komutu gibi almaktadr.
Adndan da anlalaca gibi tek fark sadece dndrme ileminin sola deil saa doru
yaplmasdr. Yine dk seviyeli bit pozisyonundaki deer carry flag ierisine ve carry flag
ierisindeki deer de yksek seviyeli bit pozisyonuna kopyalanr.
3.5.7 ROR Komutu
ror hedef, kaynak
ROR (Rotate Right) komutunu RCR komutu ile ROL komutunu RCL komutu ile
ilikilendirdiimiz ekilde ilikilendirebiliriz. Yani ROR komutu da RCR komutu gibi
almaktadr. Tek fark ROR komutundan yksek seviyeli bit pozisyonuna atanan deer carry
flag ierisindeki deil alak seviyeli bit pozisyonu iindeki deerdir.
NOT: Yukarda shift ve rotate ilemlerini gerekletirilen komutlarda kullanlan saya
ifadesi normalde 1 olarak kullanlr. 80286 ve sonras ilemcilerde herhangi bir sabit deer
kullanm getirilmitir. Daha nceki ilemcilerde 1 dnda bir deer kullanmak iin aadaki
yol izlenmelidir.
mov cl, saya
shr ax, saya
Yukardaki gibi CL ierisine istenilen deer atanr ve daha sonra hedef alan ile ileme
sokulur.
35
3.6 Dallanma Komutlar
Dallanma komutlar, programn normalde yukardan aa doru giden akn herhangi bir
koula bal olarak yada koulsuz olarak baka bir yere ynlendirmek amac ile kullanlr.
Kullanlan bu dallanma komutlar yksek seviyeli dillerdeki if veya goto komutlar gibi
dnlebilir.
Assembly dilinde kullanlan dallanma komutlar atlama yaptklar yere gre FAR veya NEAR
zellii tar. NEAR zellii tayan komutlar 2-3 bayt yer tutarken FAR zellikli olanlar 5
bayt yer tutmaktadr. Komutlar arasndaki fark, FAR zellii tayanlarn farkl segment
ierisindeki noktalara dallanma iin kullanlmasdr. Gerekli olmamakla beraber dallanmann
tr FAR PTR yada NEAR PTR ile belirtilebilir.
3.6.1 JMP (Koulsuz Dallanma) Komutu
jmp hedef
JMP komutu belirtilen herhangi bir noktaya koulsuz olarak dallanma yamak iin kullanlr.
DEBUG kullanlarak yazlan programlarda gidilecek noktann offset adresi hedef ksmna
yazlr. Eer farkl bit segment ierisindeki bir adrese dallanma yaplyorsa hedef ksmnda
SEGMENT:OFFSET eklinde bir adresleme kullanlr.
Eer ayn segment ierisinde 128 veya +127 baytdan daha uzak noktalara dallanma
yaplyorsa bu dallanma da FAR zellii tar. Bellekte kaplad alan 3 bayt olacaktr.
Aslnda JMP komutu ile yaplan sadece IP deerine gidilecek_adres - bulunulan_adres
deerini eklemektir. JMP komutunun icras srasnda IPye eklenecek deer JMP komutundan
bir sonraki komutun adresinden itibaren hesaplanr.
Dallanama yaplrken dorudan gidilecek adres yazlmayp, bellek adresleme yolu ile de
ilem gerekletirilebilir.
mov bx, 0401
mov si, 0002
mov word ptr [bx+si+04], 1a8c
jmp far ptr [bx+si+04]
Yukardaki rnek JMP komutu ile gidilecek nokta BX+SI+04 = 0407h deeri deil ayn
segment ierisinde 0407h numaral offset ierisindeki deerin gsterdii yerdir. rneimizde
bu deer 1A8Ch deeridir.
Benzer ekilde herhangi bir genel amal16-bit register kullanlarak da dallanma ilemi
gerekletirilebilir.
mov ax, 1111
jmp ax
Yukarda JMP AX komutundan sonra programn ak 1111h numaral offset adresinden
devam edecektir.
36
Baka bir segment ierisine dallanma yapmak iin SEGMENT:OFFSET kalb kullanlr.
Yani 4C70:0100 adresine dallanma yapmak iin JMP 4C70:0100 komutunu kullanmak
gerekir. Komut bellekte 5 bayt yer kaplayacaktr.
Yukarda ele alnan JMP komutu dnda assembly dilinde kullanlan koullu dallanma
komutlar da vardr. Bu komutlar herhangi bir ilem sonucunda flag registerlarn deerine gre
programn akn etkilerler. Bu komutlar Cdeki if ve Pascaldaki if...then kalb ile
eletirilebilir.
Karlatrma ilemi herhangi bir aritmetiksel ilem olabilecei gibi bir karlatrma (CMP)
yada dndrme olabilir. Fakat koullu dallanma komutlar ounlukla CMP komutundan sonra
karlatrma amal kullanlr.
3.6.2 JZ/JE Komutlar
JZ/JE (Jump if Zero/Jump if Equal) komutlar herhangi bir ilem sonrasnda zero flagn
deerine gre programn akn dzenler. Komutun icras srasnda zero flag ierisindeki bit
deeri 1 ise program JZ komutu ile gsterilen yere atlar aksi taktirde ilemci JZ komut yokmu
gibi programn akna devam eder.
dec cx
cmp cx,0
jz 010a
jmp 0110
Yukardaki rnekte CX ierisindeki deer bir azaltlyor. Daha sonra elde edilen deer sfr
ile karlatrlyor ve eer sonu sfr ise 010Ah adresine atlanyor. Sonu sfrdan farkl ise
program normal akna devam ediyor ve bir sonraki komut olan JMP 0110 altrlyor. Bu
sefer koulsuz olarak 0110h adresine bir dallanma yaplyor.
rneimizdeki yazm ekli DEBUG ierisinde kullanlan yazm eklidir. Assembly
programlarn bir assembler program aracl ile birletiren programclar iin yazm ekli biraz
daha farkldr. Assembler kullanan programclar offset adresleri yerine programn eitli
yerlerine koyduklar etiketleri kullanrlar.
.model small
.code
org 0100h
basla:
mov dl,41h
mov ah,02h
int 21h
dongu: inc dl
int 21h
cmp dl,5Ah
jnz dongu
mov ah,4Ch
37
int 21h
end basla
Yukarda MASM ile yazlm bir assembly program grlmektedir. Bu aamada program
anlamaya almayn yalnzca program ierisinde kullanlan etikete dikkat edin. INC DL
komutunun olduu satr dongu etiketi ile iaretlenmitir. JNZ dongu komutu ile bir offset
adresi belirtilmeyip bir etiket yardm ile istenilen noktaya atlama yaplmtr. Yukarda DL
ierisindeki deer 41htan balayp 5Ah olana kadar arttrlmaktadr.
Pratikte, DEBUG program yazmak iin uygun bir ortam deildir. Yazacanz assembly
programn herhangi bir assembler yazlm ile birletirip kullanrsnz.
Yukardaki program COM dosyas olarak derlenirse 19 bayt alan kaplar ve ekrana alfabedeki
byk harfleri yazar.
3.6.3 JNZ/JNE Komutlar
JNZ/JNE (Jump if Not Zero/Jump if Not Equal) komutlar JZ ve JE komutlarnn ztt olarak
kullanlr. Herhangi bir ilem sonrasnda zero flag ierisindeki deer sfr deil ise program
komutun gsterdii yere dallanarak akna devam eder.
rnek olarak JZ iin verilen MASM program incelenebilir. jnz dongu komutu ile zero flag
ierisindeki deer kontrol ediliyor. Deerin sfrdan farkl olmas halinde dongu ile iaretli
yere gidiliyor ve dng tekrar iletiliyor. En son olarak DL ierisindeki deer 5Aha ulanca
programn ak bir sonraki komut olan mov ah, 4ch satrna geiyor.
Yukardaki program ile ayn ii yapan C programn aada verdim. Assembly ile yazla
COM dosyasnn boyu 19 bayt iken C ile yazlannki 8378 bayt!
#include <stdio.h>
int main()
{
int ch=65; /* hex 41 */
dongu:
if (ch!=90) /* hex 5A */
{
printf("%c",ch);
ch++;
goto dongu;
}
return 0;
}
38
C rneinde, ilk programdaki cmp ve jnz ile gerekletirilen ilemler if ve goto
deyimleri ile gerekletirilmitir.
3.6.4 JB/JC/JNAE Komutlar
JB/JC/JNAE (Jump if Below/Jump if Carry/Jump if Not Above or Equal) komutlar carry
flagn deerine gre dallanma gerekletirirler. Herhangi bir ilem sonrasnda carry flag
ierisinde 1 deeri varsa programn ak JB komutu ile gsterilen yere gider. Aksi taktirde JB
komutu dikkate alnmadan programn normal akna devam edilir.
3.6.5 JBE/JNA Komutlar
JBE/JNA (Jump if Below or Equal/Jump if Not Above) komutlarnn icras srasnda carry ve
zero flaglar kontrol edilir. Bir ilem sonrasnda iki flagdan birinin 1 olmas durumunda JBE
komutu ile gsterilen noktaya dallanma yaplr.
3.6.6 JNB/JNC/JAE Komutlar
JNB/JNC/JAE (Jump if Not Below/Jump if Not Carry/Jump if Above or Equal)
komutlarndan birisi ile karlald zaman CPU carry flagn deerini kontrol eder. Carry flag
ierisindeki deerin sfr olmas halinde JNB komutu ile gsterilen noktaya dallanma
gerekletirilir.
3.6.7 JG/JNLE Komutlar
JG/JNLE (Jump if Greater than/Jump if Not Less than or Equal) komutlarnn gereklemesi
iin gerekli koul sign ve overflow flaglarnn deerlerinin eit olmas veya zero flag ierisinde
sfr deerinin bulunmasdr. Gerekli koullarn salanmas halinde JG komutu ile gsterilen
noktaya dallanma yaplacak ve programn ak o noktadan devam edecektir.
3.6.8 JA/JNBE Komutlar
JA/JNBE (Jump if Above/Jump if Not Below or Equal) komutlarnn icras srasnda dikkate
alnan flaglar carry ve zero flaglardr. Eer herhangi bir ilem sonrasnda bu iki flag bitinin
de deeri sfr ise programn ak JA komutu ile gsterilen yerden devam eder. ki flag bitinden
birisinin sfr olmamas halinde program normal akna devam edecektir.
3.6.9 JL/JNGE Komutlar
JL/JNGE (Jump if Less than/Jump if Not Greater or Equal) komutlarnn gereklemesi iin
gerekli koul carry ve overflow flag bitlerinin birbirinden farkl deerler tamasdr. ki bitin
farkl deerler iermesi durumunda programn ak JL komutu ile gsterilen noktaya
ynlendirilir.
3.6.10 JLE/JNG Komutlar
JLE/JNG (Jump if Less than or Equal/Jump if Greater) komutlarnn icras srasnda zero,
sign ve overflow flaglarnn deerleri dikkate alnr. Komut ile gsterilen yere dallanmak iin
zero flag ierisinde 1 deerinin olmas yada sign ve overflow flaglarnn deerlerinin farkl
olmas gerekmektedir. Gerekli koul salanrsa programn ak JLE komutu ile gsterilen
noktaya kaydrlacaktr.
3.6.11 JS ve JNS Komutlar
JS (Jump if Sign) ve JNS (Jump if No Sign) komutlarnn icras srasnda sign flag kontrol
edilir. Sign flag ierisindeki deerin 1 olmas JS iin, sfr olmas JNS iin gerekli kouldur.
39
Gerekli koulun salanmas durumunda program JS veya JNS komutu ile gsterilen noktadan
akna devam edecektir.
3.6.12 JO ve JNO Komutlar
JO (Jump if Overflow) ve JNO (Jump if No Overflow) komutlarnn icras srasnda overflow
flag ierisindeki deere baklr. Overflow flag ierisinde 1 JO komutu iin ve sfr olmas JNO
komutu iin gerekli kouldur.
3.6.13 JCXZ Komutu
JCXZ (Jump if CX is Zero) komutu CX registernn deerini kontrol eder. Eer CX
ierisindeki deer sfr ise program JCXZ komutu ile gsterilen yerden akna devam eder.
Yukarda verilen koullu dallanma komutlar ile sadece +128/-128 baytlk bir atlama
gerekletirilebilir. Eer program ierisinde daha uzak bir mesafeye dallanma yapmak
gerekiyorsa aadaki gibi bir yol izlenmelidir.
JMP komutu ile istenilen noktaya dallanma yaplr
JMP komutundan sonraki noktaya bir etiket verilir
Kullanlacak komutun tersi JMP komutunun nne yazlarak JMP komutundan sonraki
etikete dallanma yaplr
rnein DEBUG ierisinde 0100 numaral offsetde iken JE 184 komutunu veremezsiniz.
Bu komutu altrmak iin yapmanz gerekenler srasyla
???? : 0100 jne 105
???? : 0102 jmp 184
???? : 0105
komutlarn vermektir. Dikkatli bir ekilde incelenirse yukardaki komut kmesinin JE 184
komutu ile ayn eyi yapt grlecektir.
3.7 Dng Komutlar
Bu kategorideki komutlar herhangi bir rutini belirli kereler tekrarlamak iin kullanlr.
Assembly dilinde kullanlan dng komutlar bir bakma C dilindeki for ve while dngleri
ile eletirilebilir.
3.7.1 LOOP Komutu
Bu komut herhangi bir durumu belirli kereler tekrarlamak iin kullanlr. Saya olarak CX
register ierisindeki deer alnr. Her dngde CX ierisindeki deer bir azaltlr ve CXin
deeri sfr oluncaya kadar ilem devam eder. Komutun genel kullanm kalb aadaki gibidir.
loop hedef
hedef ile belirtilen deer DEBUG iin bir offset adresi, herhangi bir assembler kullanlarak
birletirilecek bir program iin bir etiket olmaldr. LOOP komutu ile yaplabilecek maksimum
atlama +128/-128 bayttr. Komutun kullanm gerei atlanlacak nokta LOOP komutundan
nceki adreslerden birisi olduu iin maksimum gidilebileceimiz adres 128 bayt
mesafededir.
40
1E27:0100 XOR AX, AX
1E27:0102 MOV CX,0005
1E27:0105 INC AX
1E27:0106 LOOP 0105
Yukardaki programn sonunda AXin deeri 5 olacaktr. Programn banda CX ierisine
atlan 5 deeri LOOP ile gerekletirilecek dng saysn belirlemektedir.
1E27:0100 XOR AX, AX
1E27:0102 MOV CX,0005
1E27:0105 INC AX
1E27:0106 DEC CX
1E27:0107 JNZ 0105
Yukardaki program bir nceki rnekteki program ile ayn ilemi gerekletirmektedir. Tek
fark LOOP 0105 komutu yerine INC CX ve JNZ 0105 komutlarnn kullanlmasdr.
Gerekte de LOOP ile yaplan bu iki komutun yapt ilemden baka bir ey deildir.
3.7.2 LOOPZ/LOOPE Komutlar
LOOPZ/LOOPE komutlar da herhangi bir durumu belirli kereler tekrarlamak iin kullanlr.
Komutun kullanm LOOP komutu ile ayndr. Tek fark LOOPZ komutu icras srasnda CX
registernn deerinin yan sra zero flag da kontrol eder. CXin deeri sfrdan farkl olduu
srece ve zero flag ierisindeki deer 1 olduu srece komut ile gsterilen yere dallanma
yaplr.
Her iki durumdan birisinin gereklememesi halinde dngden klr.
3.7.3 LOOPNZ/LOOPNE Komutlar
LOOPNZ/LOOPNE komutlar da LOOP komutu gibi CX registern saya olarak kabul
ederek bir koulu belirli kereler tekrar etmek iin kullanlr. Dng ilemi CXin deeri sfrdan
farkl iken ve zero flag ierisindeki deer 1 deil iken devam eder.
Blm 4 : Kesme (Interrupt) Kullanm
Normal olarak ilemci, kod segment ierisindeki komutlar sras ile iletir. Baz durumlarda
bilgisayara ait evre aygtlar ile ilem yapmak zere, RAM veya BIOS zerindeki belirli
rutinleri kullanmak zere yada baz geersiz sonularn olumas durumunda ilemci tarafndan
kesme (interrupt) ad verilen rutinler altrlr.
Benim burada ksaca deineceim RAM yada BIOS zerinde tanml alt rutinlerin programlar
tarafndan arlmas ile oluan kesmelerdir. Bu alt rutinler bir ok ii programcnn yerine
yapmaktadr. Bu alt rutinleri yksek seviyeli dillerdeki hazr ktphane fonksiyonlar ile
eletirmek yanl olmaz.
Kullanlabilecek her kesmenin nceden tanml bir numaras vardr. Kesmenin kullanm bu
numarann INT komutuna parametre olarak aktarlmas ve gerekli registerlara deerlerin
atanmas ile gerekletirilir. rnek olarak DOS altnda ok sk kullanlan INT 21 verilebilir.
Bir DOS kesmesi olan INT 21in AH = 01 numaral fonksiyonunu kullanalm.
41
lem iin AH registernn deeri 01h olmal ve ardndan INT 21 komutu ile kesme
arlmaldr. INT 21 komutu ile kesme arld zaman AH ierisindeki deere baklr. AH
ierisinde bulunan deere gre altrlacak alt rutin bellee yklenir.
C:\WINDOWS\Desktop>debug
-a 100
1E27:0100 mov ah,01
1E27:0102 int 21
1E27:0104 cmp al,41
1E27:0106 jnz 100
1E27:0108 mov ah,4c
1E27:010A int 21
1E27:010C
-g
ssdfaA
C:\WINDOWS\Desktop>
Yukardaki program AH ierisine 01h deerini atadktan sonra INT 21 komutu ile gerekli
komutlar bellee yklyor. Program klavyeden girilen tular okur, okunan her tu deerinin
ASCII kodu AL ierisine yazlr (INT 21 AH=01h gerei). CMP komutu ile okunan tuun
deeri 41h (A) olana kadar programn altrmasn salyoruz. Daha sonra yeni bir INT 21 alt
rutini ile karlayoruz. AH = 4Ch alt rutini altrlmakta olan programdan kp kontrol
tekrar DOS iletim sistemine brakmaktadr.
Ayn ekilde, UNIX ve benzeri iletim sistemlerinde de sistem arlar (system calls) denen
alt rutinler INT 80 ile bellee yklenip icralar gerekletirilmektedir.
Bu dokmanda sekmelerin fonksiyonlar tek tek ele alnmayacaktr. Konu hakknda
edinilebilecek en ayrntl kaynak Ralf Browns Interrupt List adl dokmandr.
Dokmanlarn yannda RBILViewer adl yardmc program da size uzun kesme listelerini
dzenli bir ekilde grntleme olana salayacaktr.
Blm 5 : DEBUG Program
DEBUG, MS-DOS altnda kullanlan ve kullancya altrlabilir dosyalar bellek zerinde
deitirip kaydedebilme olana salayana bir yazlmdr. Bugn piyasada ayn ii yapan ok
daha fonksiyonel ve gelimi programlar mevcuttur fakat DEBUGn MS-DOS ile birlikte
gelmesi programn elde edilmesi konusundaki zorluu ortadan kaldrmaktadr.
Bu blmde DEBUG program ierisinde kullanlan baz komutlar rnekleri ile ele aldm.
DEBUG programn balatmak iin MS-DOS kipinde debug komutun vermeniz yeterlidir.
Komutu verdikten sonra aadaki gibi bir ekran grnts ile karlarsnz.
Microsoft(R) Windows 98
(C)Telif Hakk Microsoft Corp 1981-1999.
C:\WINDOWS\Desktop>debug
-
42
Yukardaki ekran debug programn ilk altrdnz zaman karnza gelecek ekrandr.
Program alt zaman sadece ekrann sol kenarnda bir izgi belirir. Bu aamada debug
sizden bir sonraki ilem iin komut beklemektedir. Aadaki tabloda en ok kullanlan
komutlar aklamalar ile birlikte verdim.
A Assemble Belirli bir adresten itibaren program yazm
G Go Bellekteki programn altrlmas
L Load Bellee ykleme yaplmas
N Name Yklenecek veya yazlacak programn ismi
Q Quit DEBUGtan kmak
R Register Register deeri atama
T Trace Adm adm iletim
U Unassemble Ykl programn datlmas
W - Write Bellekten diske yazma ilemi
? - Yardm Kullanlabilecek komutlarn listesi
Yukarda sadece kullanacamz komutlar aklamalar ile birlikte verdim. imdi isterseniz
MS-DOS kipinde debug altrp bir program yazalm ve program diske kaydedelim.
C:\WINDOWS\Desktop>debug
-A 100
1E27:0100 mov ah,02
1E27:0102 mov dh,07
1E27:0104 mov dl,0c
1E27:0106 int 10
1E27:0108 mov ah,4c
1E27:010A int 21
1E27:010C
-N set_curs.com
-R CX
CX 0000
:000C
-W
0000C bayt yazlyor
-
Yukardaki program ile imle DH ve DL ile belirtilen noktaya tanyor. ncelikle programn
debug ierisinde yazlmas iin A komutu kullanld. A komutu ile kullanlan 100
parametresi programn yazlmaya balanaca offset adresini gsteriyor. Yazacamz program
bir COM dosyas olduu iin balang offseti 0100 olarak belirledik. Bir sonraki satrda
assembly programmz yazmaya baladk. Programn yazm ksm bittikten sonra N komutu
ile bellekte bulunan bilgiyi diske yazacamz zaman kaydedilecek dosya ismini belirledik. R
komutu ile CX register ierisindeki deere programmzn bayt olarak uzunluunu atyoruz
(rneimizde 010C 0100 = 000C ). En son olarak da W komutu ile bellekteki komutlar
set_curs.com dosya ad ile diske kaydediliyor.
imdi de yazdmz program tekrar DEBUG yardm ile datalm.
43
C:\WINDOWS\Desktop>debug
-N set_curs.com
-L
-U
1E4A:0100 B402 MOV AH,02
1E4A:0102 B607 MOV DH,07
1E4A:0104 B20C MOV DL,0C
1E4A:0106 CD10 INT 10
1E4A:0108 B44C MOV AH,4C
1E4A:010A CD21 INT 21
1E4A:010C D6 DB D6
1E4A:010D C70619DFAD82 MOV WORD PTR [DF19],82AD
1E4A:0113 E8C901 CALL 02DF
1E4A:0116 0BC0 OR AX,AX
1E4A:0118 7478 JZ 0192
1E4A:011A 8BE8 MOV BP,AX
1E4A:011C BF02D2 MOV DI,D202
1E4A:011F 8B36C6DB MOV SI,[DBC6]
-Q
C:\WINDOWS\Desktop>
Yukarda yine komut satrndan debug komutu verilerek DEBUG program altrlyor.
Bu sefer N komutu diske yazlacak dosyann ismini deil, diskten bellee aktarlacak
dosyann ismini vermek iin kullanlyor. Daha sonra L komutu ile ismi verilen dosya bellee
ykleniyor. Bellee yklenen program U komutu ile datlyor. Kodlar dikkatli incelerseniz
programn ilk alt satrnn bizim bir nceki rnekte yazdmz assembly kodlarndan
olutuunu greceksiniz. Kodlarn solundaki saylar assembly komutlarnn bellekte
bulunduklar eklidir (makine dili). 010C ve sonrasndaki satrlardaki assembly komutlar o
anda bellekte rasgele bulunan kodlardr. Bizim programmz ile bir ilgileri yoktur. En son
olarak da Q komutu ile DEBUGtan klyor.
T komutu ile bellekteki herhangi bir program adm adm iletilebilir. Komutun kullanmna
basit bir rnek aada verilmitir.
Microsoft(R) Windows 98
(C)Telif Hakk Microsoft Corp 1981-1999.
C:\WINDOWS\Desktop>debug
-A 100
1E2C:0100 mov ax,1234
1E2C:0103 mov bx,4567
1E2C:0106 mov ax,bx
1E2C:0108
-T = 100
AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1E2C ES=1E2C SS=1E2C CS=1E2C IP=0103 NV UP EI PL NZ NA PO NC
1E2C:0103 BB6745 MOV BX,4567
-T
AX=1234 BX=4567 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1E2C ES=1E2C SS=1E2C CS=1E2C IP=0106 NV UP EI PL NZ NA PO NC
1E2C:0106 89D8 MOV AX,BX
44
-T
AX=4567 BX=4567 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1E2C ES=1E2C SS=1E2C CS=1E2C IP=0108 NV UP EI PL NZ NA PO NC
1E2C:0108 107420 ADC [SI+20],DH DS:0020=FF
-
Grdnz gibi DEBUG ile yazlan program adm adm iletilmektedir. T komutunu
yazdnz ksa kodlarn hata kontrol iin kullanabilirsiniz.
Blm 6 : Linux letim Sistemi Altnda Assembly Kullanm
Bu dokmanda linuxun kullanm ve sistemin ileyii hakknda bilgi verilmeyecektir. Bu
blmde kullancnn daha nce Linux yada benzeri bir UNIX trevi sistemi kullanm olduu
varsaylmaktadr.
Linux iletim sisteminin alabilecei en eski CPU modeli 80386 mimarisidir. Yani linux
8086, 80186 yada 80286 kullanan bir bilgisayar zerine kurulamaz. Intel firmasnn 80386 ile
getirdii en byk yenilik, eski modellerde (8086, 80186 yada 80286) kullanlan 16-bit
registerlar yerine 32-bit registerlarn kullanmna olanak salamasdr. Bu da programcya
daha ok adreslenebilir bellek alan salamaktadr. 80386dan nceki modellerde bir segment
64KB boyutunda olurken bu rakam 80386 ve sonrasnda 4GBdan daha fazladr. (Bu dokman
yazdm sralarda Intel firmas yeni 64-bit kapasiteli ilemciler zerinde alyordu!)
80386da, daha nce kullanlan registerlara ek yaplm ve baz yeni registerlar eklenmitir.
Her biri 16-bit olan AX, BX, CX, DX, SI, DI, BP ve SP registerlar yerine her biri 32-bit olan,
srasyla EAX, EBX, ECX, EDX, ESI, EDI, EBP ve ESP registerlar kullanlmaktadr. Daha
nceki ilemcilerde kullanlan 16-bit segment registerlar olan CS, DS, ES ve SSe ek olarak
iki 16-bitlik segment register olan FS ve GS eklenmitir. 80386da nceki modeller gibi 16-
bitlik segment registerlar kullanmaktadr. Tm bunlara ek olarak flag register da 32-bit
kapasiteye sahip olmutur. Geniletilmi yeni flag registern 16. biti debug resume(RF) ve
17. biti virtual mode (VM) bitleri olarak adlandrlrlar. lemci sanal mod (virtual mode)
altnda alrken 8086 mimarisi ile ilem yapar. Bunalara ek olarak, 80486da alignment
check flag biti 18. bit pozisyonuna eklenmitir.
32-bit programlar yazlrken 16-bitlik ve 8-bitlik registerlar kullanlabilmektedir.
80386nn kulland register emas aadaki gibidir.
45
Linux altnda yazacamz programlarn hepsi 80386nin salad 32-bit kapasiteli
registerlar kullanabilmektedir. Linux altnda assembly dili kullanm programcya DOS
altndaki kadar byk avantajlar salamamaktadr. altrlan programlar korumal mod
(protected mode) altnda alt iin programcnn BIOS tarafndan salanan kaynaklara
eriimi kstlanmtr. (Aslnda bu korumal modda alan tm sistemler iin geerlidir)
Linux altnda kullanlacak assembly rutinleri ounlukla C gibi diller ierisinde satr ii
(inline) olarak kullanlmaktadr. Yazlan programlarn DOS altnda yksek seviyeli bir dil ile
ve assmbly ile yazlm iki program arasndaki kadar byk bir boyut fark gstermemesi ve
korumal moddan dolay kullanmdaki kstlamalar dilin Linux (yada herhangi bir UNIX trevi
sistem) altndaki poplaritesini azaltmtr. Fakat yine de baz noktalarda baka alternatif
bulunmamakta ve assembly dilinin kullanm zorunlu olmaktadr. (Linux Kernel Ver1.0
kaynandaki boot dosyalar, http://www.kernel.org)
Linux altnda kaydedilen assembly dosyalar .s yada .S uzantsn alr. Program kullanlan
assembler programna gre AT&T yada Intel szdizimi kullanlarak yazlr. Eer assembler
olarak linux ve DOS altnda kullanlan NASM (Netwide Assembler) kullanlacaksa yazlan
program Intel szdizimi kullanlarak yazlr. Dokmanda buraya kadar anlatlan assembly dili
kurallar Intel szdizimi iindir. Buna karn linux altnda ska kullanlan debugger
programlarndan birisi olan GDB ile yazlacak kodlarda, C ile kullanlacak satr ii kodlarda ve
linux ekirdeindeki kodlarda hep AT&T szdizimi kullanlmaktadr. Aslnda GCC derleme
srasnda as adnda bir assembler program kullanr. as, AT&T szdizimini kulland iin
GCC ile derlenen C dosyalarndaki kodlar da mecburen AT&T szdizimi ile yazlmaldr.
Bu dokmanda temel olarak Intel ve AT&T szdizimleri arasdaki farklar zerinde
durulacaktr ve GNU Assembler kullanmna baz rnekler verilecektir.
6.1 Intel ve AT&T Szdizimleri
Yukarda da belirttiim gibi linux altnda assembly programlar yazlrken kullanlan
szdizimi AT&T standartlarndadr. DOS altnda kullanlan assembler programlar Intel
szdizimi ile yazlm kodlar birletirirken, linux (ve UNIX trevi sistemlerde) kullanlanlar,
bir iki istisna dnda AT&T szdizimini art komaktadr.
46
Intel AT&T
mov eax, 01h
mov bx,1234h
movl $0x01, %eax
movw $0x1234, %bx
Yukarda da grld gibi AT&T szdizimi Intelinkine gre biraz daha karmaktr. imdi
isterseniz sra ile farklar inceleyelim.
6.1.1 Kaynak-Hedef Yn
Intel szdiziminde genel form komut hedef, kaynak olmasna karn AT&Tde bu dizilim
komut kaynak, hedef eklindedir. Aslnda, gze normal gelen de deerin soldan saa
tanmasdr.
Intel AT&T
komut hedef, kaynak
mov ebp ,esp
komut kaynak, hedef
movl %esp, %ebp
6.1.2 nekler
AT&T szdiziminde registerlar % ve sabit deerler de $ iareti ile neklerini alr. Sabit
deer olarak kullanlan say onaltlk sistemde yazlyor ise 0xsay gibi bir ifade kullanlr.
Intel AT&T
mov ah, 12h movb $0x12, %ah
Yukardaki rnekte AH ierisine 12h (onluk 18) deeri atanmtr. AT&T szdiziminde sabit
deerin banda $ iareti olduuna ve 12h deerini temsil etmek iin 0x12 yazm biimini
kullandmza dikkat edin. movb $0x12, %ah ile movb $12, %ah arasnda ok fark vardr.
kinci komutun GDB ierisindeki karl movb $0xC, %ah eklinde olacaktr.
6.1.3 Sonekler
Szdizimleri arasndaki bir dier fark da AT&T szdiziminde komutlarn sonuna konulan l,
w ve b sonekleridir. Bu sonekler zerinde ilem yaplan bilginin boyu hakknda bilgi
vermek iin kullanlr. Intel szdiziminde kullanlan dword ptr, word ptr ve byte ptr
eklerine karlk gelmektedirler.
32-bit veri ilemleri iin l (long), 16-bit veri ilemleri iin w (word) ve 8-bit veri
ilemeleri iin b (byte) sonekleri kullanlr.
Intel AT&T
mov byte ptr bh, 45h
mov eax, dword ptr [ebx]
movb $0x45, %bh
movl (%ebx), %eax
47
6.1.4 Bellek lemleri
80386nn yeni registerlarn yan sra programclara salad en byk yenilik bellek
adresleme metotlarndadr. Bu blm okumadan nce 8086 serisinde bellek adresleme
konusunda bilgi sahibi olmanz gerekmektedir.
8086 serisinde dolayl adresleme yaplrken sadece BX register kullanlrken, 80386 ve
sonras ilemcilerde herhangi bir genel amal (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP)
register kullanlabilmektedir. Yani aadaki yazm 80386 ncesi bir ilemcide almazken
80386 ve sonrasnda sorunsuz almaktadr.
mov al, [edx]
Dikkat edilmesi gereken bir nokta da 80386 ilemcide programnz 16-bit gerek modda
(real mode) altryorsanz yine adresleyebileceiniz belek blgesi 64KB boyundadr ve
eriim srasnda 32-bit registerlar kullanmanz gerekmektedir.
80386 herhangi bir register base yada index adresleme iin kullanmanza olanak salar.
Tek kstlama ESPyi bir index deer olarak kullanamayacanzdr.
Bunlarn yan sra 80386da index deeri 1, 2, 4 veya 8 gibi sabitlerden birisi ile arplp
daha etkin bir bellek eriimi salanabilmektedir. Genel Intel ve AT&T szdizimi ekilleri
aada verilmitir.
INTEL komut hedef, segment_register:[base + index * n + yer_deitirme]
AT&T komut %segment_register:yer_deitirme(base, index, n ), hedef
( n = 1, 2, 4 veya 8 )
Aadaki rnekler, yukardaki formalrn kafanzda oluturabilecei soru iaretlerini silecektir
sanrm.
Intel AT&T
mov eax, [ecx*8h]
mov edx, [ebx+ecx*08h-05h]
movl 0x08(%ecx), %eax
movl 0x05(%ebx,%ecx,0x08)
Bu noktada AT&T szdizimi Intelinki ile kyaslandnda, gerekten hi de programc dostu
deil!
80386 ile yazlan kodlarda bellek adresleme yaplrken kullanlan registerlardan ilkinin
base ve ikincisinin index olduu varsaylr. Programc bu noktada dikkatli olmaldr.
nk ilemci bilgiyi alaca segmenti kullanlan base registera gre belirler. Sadece base
olarak ESP yada EBP kullanld zaman geerli segment Stack Segmenttir. Dier durumlarda
varsaylan olarak Data Segment kullanlr.
6.1.5 INT 0x80 ve Linux Sistem arlar (Syscalls)
Linux altnda assembly programlar yazlrken ok kullanlan rutinlerden bazlar da sistem
arlardr. Herhangi bir sitem arsnn kullanlabilmesi iin, sistem arsna ait numara
EAX ierisine atlr ve eer sistem ars en fazla be agrman alyorsa gerekli argmanlar
sras ile EBX, ECX, EDX, ESI ve EDI registerlarna atlr. Alt ve daha fazla argman alan
48
sistem arlarnda ise yine sistem ar numaras EAX ierisine atlr. Daha sonra gerekli
agrmanlar sondan baa doru stack ierisine atlr ve ESP EBX ierisine kopyalanr. Sistem
arlar /usr/include/asm/unistd.h ierisinde listelenmitir. Ayrca sistem arlar hakknda
bilgiyi de man 2 sistem_arsnn_ad komutu ile alabilirsiniz.
rnekler :
ilk.s
fnoyan@tux:~$ cd asm
fnoyan@tux:~/asm$ vi ilk.s
ilk.s dosyas ierisine aadaki kodlar yazn.
.text
.globl _start
_start:
movl $12,%eax
movl $0x12, %eax
xorl %eax, %eax
inc %eax
int $0x80
fnoyan@tux:~/asm$ as ilk.s o ilk.obj
fnoyan@tux:~/asm$ ld ilk.obj o ilk
fnoyan@tux:~/asm$ ./ilk
fnoyan@tux:~/asm$
fnoyan@tux:~/asm$ gdb -q
(gdb) file ilk
Reading symbols from ilk...(no debugging symbols found)...done.
(gdb) disas _start
Dump of assembler code for function _start:
0x8048074 <_start>: mov $0xc,%eax
0x8048079 <_start+5>: mov $0x12,%eax
0x804807e <_start+10>: xor %eax,%eax
0x8048080 <_start+12>: inc %eax
0x8048081 <_start+13>: int $0x80
End of assembler dump.
(gdb)
Yukarda ilk.s dosyasnn adm adm birletirilmesi ve GDB yardm ile ierisindeki assembly
kodlarn incelenmesi gsterilmitir. rneimizde, GDB ile kullanlan file komutu debug
49
ierisindeki n komutu ile ve disas komutu da debug ierisindeki u komutu ile ayn ii
yapmaktadr.
Bu rnekte yukarda verdiim movl $12,%eax ve movl $0x12, %eax komutlar arasndaki
fark rahat bir ekilde grebilirsiniz.
disas _start komutu ile GDB programmz ierisindeki _start noktasndan itibaren datma
ilemi yapar.
iki.s
Bu rneimizde bir sistem ars olan chmodun kullanm rneklendirilmitir. Sistem ar
numarasn (chmod iin 15) /usr/include/asm/unistd.h dosyasndan rendikten sonra gerekli
agrmanlar linux yardm dosyalarn okuyarak renebilirsiniz.
fnoyan@tux:~$ man 2 chmod
Gerekli argmanlar renildikten sonra aadaki kodu iki.s ad kaydedin.
.data
path: .ascii "./dosya"
.text
.globl _start
_start:
movl $15, %eax
movl $path, %ebx
xorl %ecx, %ecx
int $0x80
xorl %eax, %eax
incl %eax
int $0x80
Yukardaki program, bulunduu dizindeki dosya isimli dosyann eriim haklarn
sfrlamaktadr. Yani programmz chmod 000 ./dosya komutu ile ayn ii yapmaktadr.
fnoyan@tux:~/asm$ touch dosya; chmod 777 dosya
fnoyan@tux:~/asm$ ls l dosya
fnoyan@tux:~/asm$ as iki.s o iki.obj
fnoyan@tux:~/asm$ ld iki.obj o iki
fnoyan@tux:~/asm$ ./iki
fnoyan@tux:~/asm$ ls l dosya
....
....
fnoyan@tux:~/asm$ gdb -q
(gdb) file iki
Reading symbols from iki...(no debugging symbols found)...done.
50
(gdb) disas _start
Dump of assembler code for function _start:
0x8048074 <_start>: mov $0xf,%eax
0x8048079 <_start+5>: mov $0x8049088,%ebx
0x804807e <_start+10>: xor %ecx,%ecx
0x8048080 <_start+12>: int $0x80
0x8048082 <_start+14>: xor %eax,%eax
0x8048084 <_start+16>: inc %eax
0x8048085 <_start+17>: int $0x80
End of assembler dump.
(gdb)
dosya isimli bir dosya oluturduk ve eriim haklarn rwxrwxrwx (777) olarak dzenledik.
Daha sonra yazdmz program ile dosya isimli dosyann eriim haklarn ----------(000) olarak
deitirdik.
man 2 chmoda gre fonksiyon iki argman alyor. Birincisi dosyaya giden yol (path) ve
ikincisi yeni eriim yetkileri (bizim rneimizde sfr). sterseniz adm adm program inceleyelim.
.data
path: .ascii "./dosya"
Yukardaki parada program ierisinde ascii trnde sabit tanmlamas yaplyor. .data Data
Segment ierisinde olduumuzu belirtir.
.text
.globl _start
_start:
Code Segmente geiliyor.
movl $15, %eax
movl $path, %ebx
xorl %ecx, %ecx
int $0x80
te burada chmod sistem ars arlyor. EAX iersine sistem ar numaras atldktan
sonra gerekli argmanlar registerlara ykleniyor. Burada movl $path, %ebx komutu ile yaplan
sabitimizin adresini EBX ierisine yklemektir (programn GDB ktsnda bu grlmektedir.).
Daha sonra ECX ierisine sfr atanyor ve en son olarak int $0x80 altrlyor.
51
xorl %eax, %eax
incl %eax
int $0x80
Programmzn sonunda da, program bitirmek iin _exit() sistem ars (sistem ar numaras
1) kullanlyor. Bu DOS altndaki AH=4Ch INT 21h ars ile ayn ii yapmaktadr.
uc.s
Son rneimizde de yukarda oluturduumuz dosya isimli dosyann adn yeni_dosya
olarak deitiriyoruz. Bu ie iin yine bir sistem arsn kullandk: rename (sistem ar
numaras 38).
Kodumuz aadaki gibi.
.data
old_path: .ascii "./dosya\0"
new_path: .ascii "./dosya_yeni\0"
.text
.globl _start
_start:
movl $38, %eax
movl $old_path, %ebx
xorl $new_path, %ecx
int $0x80
xorl %eax, %eax
incl %eax
int $0x80
Yukarda da yine bir nceki rnekte olduu gibi sistem ars kullanld. Bu sefer de sistem
ar numarasna ek olarak iki argman gerekti ve ilki EBX ikincisi de ECX ierisine yazld.
movl $old_path, %ebx komutuyla belirtilen old_path sabiti derlenme srasnda gerekli offset
adresi ile deitirilmektedir. Aadaki GDB kts bunu daha kolay anlamanz salayacaktr.
fnoyan@tux:~/asm$ gdb -q
(gdb) file uc
Reading symbols from uc...(no debugging symbols found)...done.
(gdb) disas _start
Dump of assembler code for function _start:
0x8048074 <_start>: mov $0x26,%eax
0x8048079 <_start+5>: mov $0x804908c,%ebx
0x804807e <_start+10>: xor $0x8049094,%ecx
0x8048084 <_start+16>: int $0x80
0x8048086 <_start+18>: xor %eax,%eax
52
0x8048088 <_start+20>: inc %eax
0x8048089 <_start+21>: int $0x80
End of assembler dump.
GDB ile grntlenen kodda komutlarn soneklerinin olmadna dikkat ediniz.
nternet Adresleri :
Dokmann bu son ksmnda assembly ile daha geni apta uramak isteyenler iin baz
internet sitelerinin adresleri bulunmaktadr.
http://linuxassembly.org Linux ve dier UNIX tabanl sistemler altnda
assembly dili ve kullanm hakknda kaynak
bulabileceiniz bir site.
http://www.janw.easynet.be/eng.html Linux altnda assembly dilinin kullanmn anlatan
bir baka yaz.
http://www.geocities.com/SiliconValley
/Ridge/2544/
Linux altnda GCC ile satr ii assembly kullanm
hakknda bilgi bulabileceiniz bir adres.
ftp://www6.software.ibm.com/software/
developer/library/l-ia.pdf
GCC ile satr ii assembly hakknda baka bir
dokman.
http://members.lycos.co.uk/kasiasyg/ Adresleri yukarda verilen baz dokmanlarn Trke
evirilerinin bulunduu bir site.
http://www.programmersheaven.com Sadece assembly deil daha birok programlama dili
hakknda rnek kod ve kaynak bulabileceiniz geni
ierikli bir site.
http://www.web-sites.co.uk/nasm/ Linux ve MS-Windows iletim sistemleri altnda
kullanlan bir assembler olan NASMn sitesi.
http://win32asm.cjb.net Windows iletim sistemi altnda 32-bit assembly
programlamay renebileceiniz en iyi sitelerden biri.
Yukardakilerin dnda adreslerini bilmediim ama sizin bir arama motorunda gerekli bilgileri
yazarak kolayca eriebileceiniz baz faydal kaynaklar.
The Art Of Assembly Language
PC Assembly Language Yazar : Paul.A Carter
Ralf Browns Interrupt List Yazar : Ralf Brown
53

You might also like