Professional Documents
Culture Documents
Assembly PDF
Assembly PDF
Assembly PDF
Programlama Dili
Temmuz 2003
http://www2.gantep.edu.tr/~fni18444
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
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
8
8
8
8
8
8
8
9
9
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
10
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
39
40
40
40
41
44
45
46
46
46
47
47
48
nternet Adresleri
52
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
#include <stdio.h>
MOV AH,02
MOV DL,41
INT 21
INT 20
Assembler Bilgileri
MS-DOS DEBUG
Boyut : 8 bayt
begin
write(A)
end.
main()
{
printf(A);
}
Derleyici Bilgileri
MS-DOS iin Turbo C 2.01
Boyut : 8330 bayt
Derleyici Bilgileri
MS-DOS iin FreePascal
0.9
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
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.
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 _______________________________
OR ____________________________
NOT______________________________
XOR________________________________
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
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
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
10
11
12
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 17bitlik 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
DS=1E40 ES=1E40
1E40:0103 BBF92A
-t
AX=F96A BX=2AF9
DS=1E40 ES=1E40
1E40:0106 01D8
-t
AX=2463 BX=2AF9
DS=1E40 ES=1E40
1E40:0108 A394D3
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.
13
AX=0000 BX=0000
DS=1E40 ES=1E40
1E40:0105 F0
1E40:0106 01D8
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.
14
15
1E40:0110
1E40:0113
1E40:0116
1E40:0118
1E40:011A
1E40:011C
1E40:011E
1E40:011F
-
E87000
A396D3
8A04
3C20
740C
3400
2F
1E
CALL
MOV
MOV
CMP
JZ
XOR
DAS
PUSH
0183
[D396],AX
AL,[SI]
AL,20
0128
AL,00
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.
16
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.).
17
Based
MOV BP, 45C8
MOV AX, [BP]
BP = 45C8h
MOV AX, [45C8]
18
Indexed
MOV DI, 76A7
MOV AX, [DI]
DI = 76A7h
MOV AX, [76A7]
Indexed
MOV SI, D78C
MOV AX, [SI]
SI = D78Ch
MOV AX, [D78C]
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]
19
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]
20
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 registerbellek blgeleri arasnda transfer etmek iin kullanlr.
21
Hata !
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.
22
AX=1234h
BX=5678h
AX=5678h BX=1234h
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.
BX = BX+3
mov ax, bx
LEA komutunun genel kullanm amac herhangi bir registera bir bellek adresi saklamaktr.
Komut kullanm srasnda flag registerlar zerinde herhangi bir etki yapmamaktadr.
23
AX = 1234h
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.
24
mov ax,1234
push ax
mov ah,01
pop ax
AX = 1234h
AX > STACK , SP = SP-2
AH = 01 ,AXin deeri deiti!
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
2. bit
4. bit
6. bit
7. bit
8. bit
9. bit
10. bit
11. bit
Carry biti
Parity biti
Auxilary biti
Zero biti
Sign biti
Trap biti
Interrupt biti
Direction biti
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
25
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
out 70, al
in al,71
AL = 2Eh
70h. Porta 2E deeri gnderiliyor
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.
26
AX = 1234h
[4444] = 1000h
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
27
eklindedir. Aslnda CPU, SUB komutu ile hedef ile -kaynak deerlerini toplamaktadr.
Gerekte yaplan ilem yine bir toplama ilemidir.
mov ax, 8da7
mov bx, 4a43
sub ax, bx
AX = 8DA7h
BX = 4A43h
AX = AX BX
= 8DA7h 4A43h
= 4364h
AX = 0045h
BX = 11ACh
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
mov word ptr [4000], 1212
mul word ptr [4000]
28
AX = 0005h
[4000] = 12 , [4001] = 12
AX = AX*[4001][4000]
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
mov cx, 4586
mul cx
AX = 4321h
CX = 4586h
AX * CX = 4321h * 4586h
= 123B0846h (32-bit)
= DX = 123Bh , AX = 0846h
29
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
inc ax
degisken = 15 ;
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]
30
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
dec ax
degisken = 15 ;
degisken-- ;
31
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.
32
33
34
35
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
36
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;
}
37
38
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.
39
40
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.
Microsoft(R) Windows 98
(C)Telif Hakk Microsoft Corp 1981-1999.
C:\WINDOWS\Desktop>debug
-
41
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
G Go
L Load
N Name
Q Quit
R Register
T Trace
U Unassemble
W - Write
? - Yardm
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.
42
C:\WINDOWS\Desktop>debug
-N set_curs.com
-L
-U
1E4A:0100 B402
MOV
1E4A:0102 B607
MOV
1E4A:0104 B20C
MOV
1E4A:0106 CD10
INT
1E4A:0108 B44C
MOV
1E4A:010A CD21
INT
1E4A:010C D6
DB
1E4A:010D C70619DFAD82 MOV
1E4A:0113 E8C901
CALL
1E4A:0116 0BC0
OR
1E4A:0118 7478
JZ
1E4A:011A 8BE8
MOV
1E4A:011C BF02D2
MOV
1E4A:011F 8B36C6DB
MOV
-Q
AH,02
DH,07
DL,0C
10
AH,4C
21
D6
WORD PTR [DF19],82AD
02DF
AX,AX
0192
BP,AX
DI,D202
SI,[DBC6]
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
DS=1E2C ES=1E2C
1E2C:0103 BB6745
-T
AX=1234 BX=4567
DS=1E2C ES=1E2C
1E2C:0106 89D8
43
-T
AX=4567 BX=4567
DS=1E2C ES=1E2C
1E2C:0108 107420
-
Grdnz gibi DEBUG ile yazlan program adm adm iletilmektedir. T komutunu
yazdnz ksa kodlarn hata kontrol iin kullanabilirsiniz.
44
45
Intel
mov eax, 01h
mov bx,1234h
AT&T
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
komut hedef, kaynak
mov ebp ,esp
AT&T
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
mov ah, 12h
AT&T
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
mov byte ptr bh, 45h
mov eax, dword ptr [ebx]
AT&T
movb $0x45, %bh
movl (%ebx), %eax
46
AT&T
movl 0x08(%ecx), %eax
movl 0x05(%ebx,%ecx,0x08)
47
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
Yukarda ilk.s dosyasnn adm adm birletirilmesi ve GDB yardm ile ierisindeki assembly
kodlarn incelenmesi gsterilmitir. rneimizde, GDB ile kullanlan file komutu debug
48
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
49
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.
50
.ascii "./dosya\0"
.ascii "./dosya_yeni\0"
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
51
0x8048088 <_start+20>:
0x8048089 <_start+21>:
End of assembler dump.
inc
int
%eax
$0x80
nternet Adresleri :
Dokmann bu son ksmnda assembly ile daha geni apta uramak isteyenler iin baz
internet sitelerinin adresleri bulunmaktadr.
http://linuxassembly.org
http://www.janw.easynet.be/eng.html
http://www.geocities.com/SiliconValley
/Ridge/2544/
ftp://www6.software.ibm.com/software/
developer/library/l-ia.pdf
http://members.lycos.co.uk/kasiasyg/
http://www.programmersheaven.com
http://www.web-sites.co.uk/nasm/
http://win32asm.cjb.net
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
52
53