ASSEMBLER
PROGRAMLAMA DİLİ VE DEBUG
Assembler programlama dili, çoğu zaman özel alanlarda
geliştirilen programlarda kullanılan alt düzel bir
Programlama dili olarak tanımlanır. Bu dilin komutları,
bilgisayarın doğrudan işlettiği makine dili komutlarının birebir karşı lığıdır.
Bu nedenle bu dil için makine dili de denilebilir.
Her ne kadar uzman programcıların özel alanlarda
kullandığı bir dil olarak tanımlansa da, programcılar istedikleri takdirde her
türlü uygulamayı bu dil ile geliştirebilirler yada kullandıkları üst düzey dil
altından çağırabilecekler i procedurler yazabilirler.
Çünkü hemen hemen her dilde assembler için destek bulunmaktadır.
Dilin en büyük avantajı CPU çevrebirimlerinin ve ana
belleğin çok iyi bir şekilde kontrolünü sağlamasıdır. Ayrıca işletim sistem
fonksiyonlarını da çok kolaylıkla kullanmak mümkündür. Assembler program dili derleyicisi kullanılan ko mutların birebir makine dili karşılıklarını üretir. Bu
nedenle bu dil ile oluşturulan programlar olabilecek en kısa programlar
olurlar.
Bir assembler programı
çalışabilir bir programın tüm kesimlerinin tam olarak tanıtılması ile
oluşturulabilir. Bu nedenle bir assembler programda
minimum üç ana kesim bulunmalıdır.
1 - STACK Segment
2 - DATA Segment
3 - CODE Segment
Basit bir assembler
programı;
STACK SEGMENT PARA ‘STACK’
DB 64 DUP (‘STACK’)
STACK ENDS
DATA SEGMENT PARA ‘DATA’
MESAJ DB ‘BU BİR ASSEMBLER PROGRAMIDIR
$’
DATA ENDS
CODE SEGMENT PARA ‘CODE’
ANA PROC FAR
ASSUME CS;CODE, DS;DATA, ES;DATA,
SS;STACK
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DX,MESAJ
MOV AH,09
INT 21H
RET
ANA ENDP
CODE ENDS
END
1. BİLGİNİN TEMSİLİ
Elektronik bilgi işlem makinalarında bilgiler elektriksel uyarımlarla temsil
edilirler. Bu uyarımların ifadesi 1 ve 0’lardan oluşan rakamlarla temsil
edilirler. Bu uyarımları BIT adı verilir. Açıktır ki bir BIT ile 0 ve 1 gibi iki
b ilginin temsili sözkonusudur. Ancak günlük hayatta
kullandığımız bilgiler 2 adet değildir. Bu nedenle BIT’ler guruplanarak
kullanılırlar. En küçük BIT gurubu 8 bitten oluşan guruptur ki bu guruba BYTE
adı verilir. Bir byte ile +127 ile -127 arasındaki
rak amlar ile harflerin
temsili mümkün olur. Bir byte ile temsil edilen
harfler için kullanılan en yaygın stantdart
ASCII(American Standard Code
for Infırmation Interchange)
standartdır.
2- VERİ
TİPLERİ
Bir programlama dilinin temel özelliklerinden birisi
dilin içinde kullanılacak olan veri tipleridir. Burada assembler dilinde kullanılan en basit veri tiplerinden
bahsedilecektir.
Assembler programlama dilinde kullanılacak olan bilgilerin
uzunlugu bilgisayarın mikroişlemcisine baglıdır. 8088 mikroişlemci için en fazla 16 bit uzunlugunda bir veri temsil edilebilir. 80286, 80386 ve
80486 mikroişlemcileri daha g elişmiş oldukları için
kullandıkları bilgi uzunlugu daha fazla
olabilir.
2.1 BYTE
Byte 8 bitten oluşan bir bilgi birimidir. Assembler’da byte ile hem nümerik
hemde alfanümerik bilgileri
temsil etmek mümkündür.
Gerek BYTE gerekse diger
veri tiplerinde sayılar işaretli ve işaretsiz olarak iki ana guruba ayrılırlar.
İşaretsiz sayılar tüm veri alanını bir bütün olarak degerlendirildiği bir durumu ifade eder. Sayıların işaretli
veya işaretsiz olması makine açısından izafi bir durumdur.
1 0 0 0 0 0
0 1 İşaretsiz 129 sayısını temsil
eder.
1 0 0 0 0 0
0 1 İşaretli -1 sayısını temsil
eder.
Negatif sayılarda en duyarlı bit 1
olur.
Byte
iki ana kısımdan oluşur. Her kısıma NIBBLE adı
verilir. Her NIBBLE bir hexadecimal sayıyı temsil
eder.
1 0 0 0 0 0
0 1
----------- -------------
2.NIBBLE 1.NIBBLE
2.2 WORD
2 Adet Byte ile oluşturulmuş bir yapıdır. 8088 ve
diğer mikroişlemciler 16 bit uzunluğundaki bu yapıyı desteklerler. Word yapısını
bir bütün olarak işleyebileceğiniz gibi yüksek byte
(HB) veya Low byte (LB)
olarak da işleyebilirsini z.
2.3 DOUBLEWORD
İki word uzunluğunda yani 32 bit uzunluğunda bir
yapıdır. Gerek adreslemede gerekse büyük sayıların saklanmasında
kullanılır.
2.4 QUADWORD
64 Bit uzunluğunda bir yapıdır. 4 word’un
birleştirilmesi ile oluşturulur.
8088 Mikroişlemcisi olan bir makinada direkt mikroişlemcinin desteklediği BYTE ve WORD
kavramları kullanılabilir. 80286, 80386 ve üzeri mikroişlemcilerde BYTE ve WORD
kavramlarının dışında DOUBLEWORD ve QUADWORD kavramları da kulla nılabilir. 8088 mikroişlemcilerde WORD’den daha uzun sabit ve değişkenler de kullanılabilir.
Ancak bu kullanım direkt mikroişlemci destegi dışında
yazılım desteği ile olur.
3- MİKROİŞLEMCİ TASARIMI
Bir mikroişlemci,kendisine bağlı çevre birimlerle haberleşebilmek, yürütmekte
olduğu programları kontrol edebilmek için REGİSTER adı verilen, kendi iç
yapısında fiziksel olarak bulunan RAM elemanlarını kullanır. REGİSTERLER bir
mikroişlemcinin en temel bileşenlerinden biridir. İntel 80xxx serisi mikroişlemcilerde uzunlukları değişmekle
beraber aşağıdaki registerler
bulunur.
Genel Amaclı Registerler
AX Ah-Al Accumulator
BX Bh-Bl Base
CX Ch-Cl Counter
DX Dh-Dl Data
Segment Registerleri
CS Code Segment
DS Data Segment
SS Stack Segment
ES Extra Segment
Offset Registerleri
IP Instraction Pointer
SP Stack Pointer
BP Base Pointer
SI Stack Information
DI Data Information
Flag Registerleri
Flag
3.1 Genel Amaçlı Registerler
AX,BX,CX,DX registerleri genel amaçlı registerlerdir. Mikroişlemci programları çalıştırırken
verileri ana bellek ile iç bellek arasında sürekli olarak taşır. Genel amaçlı
registerler bu taşıma sırasında aracılık ederler. Aynı
zaman da matematiksel işlemlerde giriş ve çıkış noktaları olarak kullanılırlar.
X
Bu registerlerin tamamı 16 bit uzunluğunda olup, 2
byte’tan oluşurlar. Byte’lar
bir bütün olarak kullanılabileceği gibi ayrı ayrı da
kullanılabilirler.
3.1.1 AX
YAZMACI
Programlarda en çok kullanılan yazmaçlardan biridir. Accumulator’ün kısaltılması sonunda oluşan AX yazmacı bütün
giriş ve çıkış işlemlerinde ve bazı aritmetik işlemlerde kullanılır.
AX
--------------------------------------------------------
AH AL
3.1.2 BX
YAZMACI
BX Registeri Base register olarak da bilinir. RAM ve IO işlemlerinde
adreslemede kullanılır. Register adresleme
işlemlerinde daha çok offset degerlerini tutar. Ayrıca hesaplama işlemlerinde de
kullanılır.
BX
--------------------------------------------------------
BH BL
3.1.3 CX YAZMACI
CX Registeri Counter registeridir. Döngü işlemlerinde ve kaydırma işlemlerinde
sayaç olarak kullanılır.
CX
--------------------------------------------------------
CH CL
3.1.4 DX YAZMACI
Register bazı giriş çıkış işlemlerinde ve matematiksel
işlemlerde kullanılır.Daha çok çarpma ve bölme işlemlerinde büyük sayıları
saklamak için AX registerinin bir parçasıymış gibi
kullanılır.
DX
--------------------------------------------------------
DH DL
3.2 Segment Registerleri
3.3 Pointer ve Index Registerleri
3.4 PSW Registeri
4. BELLEK , SEGMENT,
OFFSET
5. DEBUG
PROGRAMI
Debug programı exe veya com
tipli, diger bir deyişle makine dili formatlı program
dosyalarının çalıştırılması, bu programların bellek yerleşimlerinin, cpu üzerindeki etkilerinin ve verilerinin incelenmesi,
değiştirilmesi vs. amacıyla ku llanılan bir programdır.
Debug
programı ile bir makine dili programı bellege
yükleyebilir, bu programı step step
çalıştırabileceğiniz gibi programın belli bir kısmını çalıştırabilirsiniz veya
programın makine dili kodları üzerinde değişiklik yapabilir, programa yeni
kodlar ekleyebilir veya çıkarabilirsiniz. Yada herhangi bir programı assembly kullanarak veya makine dili kullanarak yeniden
oluşturabilirsiniz.
5.1 Debug
Komutları.
Debug
programı dos işletim sisteminin bir parçasıdır. Bu
nedenle dos versionları
arasında komutlarda veya komut özelliklerinde değişiklikler olabilmektedir.
Burada programın tüm komutlarını anlatmak yerine program yazmayı veya incelemeyi
sağlayacak olan komutlar üzerinde durulacaktır.
A Assemble Assembly programlarının yazılmasını saglar.
G Go Bellekte yüklü olan
bir programın çalıştırılmasını sağlar.
L Load Diskten belleğe bir
proğramın yüklenmesini sağlar.
N Name Bellekteki program için isim seçmeyi
sağlar.
Q Quit Programdan çıkarak
işletim sistemine dönmeyi sağlar.
R Register Register degerlerini görme ve
değiştirme.
T Trace Bellekteki bir veya
daha fazla komutun çalıştırılmasını sağlar.
U Unassembly Assembly kodlarının makine dili karşılıklarını almanızı
sağlar.
W Write Bellekteki proğramın diske yazılmasını sağlar.
Program sistem komut satırından debug yazılarak çalıştırılabilir. Program çalıştırılırken
eger bir program bellege
yüklenecekse bu program ismi komut satırından verilebilir. Program çalıştığında
ekranın sol tarafında ( - ) işareti belirecektir. Bu prompt debug programının komut
almaya hazır olduğunu gösterir.
5.1.1 A Assembly Komutu
A Komutu assembly program yazmak için kullanılır. Bu
komutun kullanılış şekli;
-- A [segment:offset]
şeklindedir.
Komutun parametresi olan adres, yazılacak
programın bellegin neresinden itibaren yerleşeceğini
gösterir. Parametre seçimliktir. Eğer verilmeyecek olur ise mevcut CS ve IP
üzerindeki değerler komutun parametresi olarak varsayılır. Komuttan sonra hiç
bir parametre vermeyeceğiniz gibi sadece offset adresi
de verebilirsiniz. Eğer komuttan sonra sadece tek bir sayı verilmişse verilen
değer offset olarak algılanır ve IP registerine bu deger verilerek
programın default segment ve
belirlenen offset üzerinde n yazılması sağlanır.
Komutun çalıştırılması ile, default veya belirlenen segment ve
offset adresi yeni bir satır başına yazılarak bu
adresin yanında komut girişi için beklenir. Her komut girilip enter tuşuna basıldığında debug
ilk önce girilen komutu yorumlar ve girile n komut doğru ise segment ve offset adresleri
yazılan komut uzunluğu kadar artırılarak yeni komut girişi için beklemeye
başlar. Eğer girilen komut hatalı ise hata yeri gösterilerek komutun tekrar
girilmesi için aynı segmet ve offset adreslerinde beklenir. Eğer herhangi bir satırda
komut girilmeyerek enter tuşuna basılırsa debug komut satırına geri döner.
Örnek;
C>Debug
- A
2054:0100 Push Ds
2054:0101 Mov Ax,B800
2054:0104 Mov Ds,Ax
2054:0106 Mov
Si,0000
2054:0109 Mov Word
[Si],7941
2054:010C Pop Ds
2054:010D Int
20
2054:010F
- G
Program yazılırken en son girilen komutun offset adresi default offset olarak alınır. A komutundan çıktıktan sonra tekrar
aynı komut kullanılırsa default segmentin son kalınan offseti
ekrana getirilir. Eğer programa ek yapılacaksa bu yöntem kullanı labilir. Ancak herhangi
bir komut değiştirilecekse komuta girilirken değiştirilecek satırın segment ve offset adresi verilerek
girilmelidir.
A komutu ile girilen komutlar belleğe peşpeşe yerleştirilirler. Bu nedenle yazılmış bir proğramın değiştirilmesi oldukça zordur. Eğer
değiştireceğiniz komut uzunluğu daha önce yazdığınız komut uzunluğu ile aynı ise
problemsiz bir değişim sözkonusu olabilir. Ancak
yazacağınız komut eskisinden uzun ise M komutu ile ramde yer açmak gerekir.
5.1.2. G Go
Komutu
Go komutu hafızadaki bir programın icra ettirilmesi
amacı ile kullanılır. Komutun formatı;
- G Adres
şeklindedir.
Komuttan sonra verilen Adres parametresi
seçimliktir. Adres verilmez ise program CS;IP ikilisindeki değerler default olarak alınarak çalıştırılır. Verilen adres her
zaman programın başlatılacağı adres olarak alınır. Bu değer sadece offset olarak ve rilebileceği gibi
segmet ve offest olarak da
verilebilir.
Hafızadaki herhangi bir program RET yada INT 20
komutlarından biri ile bitmelidir. G komutu bu iki assembler komutundan birini icra ettirdiğinde PROGRAM
TERMINATED NORMALLY deyimi ile sona erer. Bahsedilen komutlar program icrasını
sona erdirerek k omut satırına dönmeyi sağlar.
Herhangi bir program bu iki komuttan biri ile sona ermiyor ise makinanız denetimsiz komutlar yüzünden kilitlenecek yada
istem dışı davranacaktır.
Herhangi bir proğramı
birden fazla sayıda çalıştıracaksanız ikinci ve sonraki çalıştırmalarda CS:IP
ikilisinin değerlerinden emin olmalısınız. CS:IP ikilisine istediğiniz herhangi
bir değeri R komutu ile atayabilirsiniz.
5.1.3 L Load
Komutu
L Komutu disk üzerindeki herhangi bir programın
belleğe yüklenmesi için kullanılır. Komutun herhangi bir parametresi yoktur.
Komut N komutu ile ismi belirlenmiş bulunan programı belleğe yükler.
5.1.4 N Name
Komutu
N Komutu, L veya W komutu için dosya ismi seçmekte
kullanılır. Komutun kullanım şekli;
- N Dosya Adı
şeklindedir.
Name komutu Load ve Write komutlarından önce kullanılarak diskten çağrılacak
yada diske yazılacak dosyanın adını belirlemekte
kullanılır.
5.1.4 Q Quit
Komutu
Komut debug programını
sonlandırır.
5.1.5 R Register Komutu
Komut CPU registerlerinin
değerlerini görmek yada değiştirmek için kullanılır. R komutunun kullanım biçimi
aşağıda verilmiştir.
- R Register
Adı
Komut registerlerin
kullanımı ile ilgili olmak üzere 3 ayrı görevi yerine
getirir.
R : Komut tek başına kullanılırsa CPU registerlerinin o anki tüm degerleri gösterilir. Registerlerin yanısıra komut Flag registerinin degerlerini de temsili olarak gösterecektir. Komutun
kullanımı sonunda CS:IP ile işaret edilen komut da ekranda göste rilecektir. R komutunun
kullanımı sonunda aşağıdakine benzer bir görüntü alıncaktır.
- R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000
SI=0000 DI=0000
DS=2054 ES=2054 SS=2054 CS=2054 IP =0100 NV UP EI PL
NZ NA PO NC
2054:0100 IE PUSH DS
NV UP EI PL NZ NA PO NC değerleri dışındaki tüm reğişterler daha önceki bölümlerde anlatılmıştı. Yukarıdaki
değerler Flag registerinin
temsili gösterimidir. Bu registerin alabileceği
değerler aşağıda gösterilmiştir.
|
FLAGLAR Overflow Direction Interrupt Sign Zero Auxiliary Carry Parity Carry |
BIT SET (1) OV DN EI NG AC PE CY |
BIT RESET (0) NV UP DI NC |
2.
R komutundan
sonra parametre olarak F harfi kullanılırsa program flagların değiştirilmesi için mevcut flagları ekrana getirir ve istediğiniz flagları değiştirmeniz için bekler. Bu durumda istediğiniz
herhangi bir flagi set yada reset edebilirsiniz.
- R F
NV UP EI PL NZ NA PO NC - ZRUP
-
Yukarıdaki örnekte Zero
flagı SET, direction flagı RESET edilmektedir.
3.
R komutu ile
sadece flagların değil tüm registerlerin degerleri
değiştirilebilir. Bunun için R komutundan sonra değiştirilmesi istenen registerin isminin yazılması gerekir. Bu işlem
gerçekleştiğinde registerin mevcut degeri ekrana yazılır ve ( : ) iş areti konularak registerin yeni
degeri sorulur. Bu işaretin yanına deger 4 digit hexadecimal olarak verilmelidir. Eger bir deger verilmeyip enter tuşuna basılırsa registerin
içeriği değiştirilmeyecektir.
5.1.6 T Trace Komutu
Trace
komutu hafızada bulunan bir programın satırlarının tek tek veya belli bir kısmının çalıştırılması için kullanılır.
Komutun kullanımı aşağıda verilmiştir.
- T=Adres Değer
Komutun parametreleri seçimliktir. Ilk parametre Adres parametresidir ki bu parametre
kullanılacaksa komuttan sonra = işaretinin kullanımı zorunludur. Adres
parametresi icra ettirilecek ilk komutun adresi olarak alınır.
Değer parametresi kaç adet komutun peşpeşe icra ettirileceğini gösterir. Eğer kullanılmamış ise
bu değer 1 olarak alınır. Eğer herhangi bir parametre kullanılmaz ise komut
CS:IP ile adreslenen yerden başlayarak 1 komut icra ettirilir ve komutun icr asından sonra registerlerin
değeri ve işlenecek olan komut ekranda görüntülenir.
5.1.7 U Unassembly Komutu
U Komutu bellekteki programın makine dili ve assembly karşılıklarını ekranda listelemek için kullanılır.
Komutun kullanım şekli aşağıda verilmiştir.
- U Adres1 Adres2
Parametre olarak verilen Adres1 listelenmek istenen
programın başlangıç adresini gösterir. Bu adres segment ve offset olarak
verilebilir. Bu adres verilirken herhangi bir komutu bölmemesine özen göstermek
gerekir. Aksi halde ekrana getirilecek list e anlamsız
bir liste olacaktır.
Ikinci
verilen parametre listelemenin sonunu belirler. Burada verilecek adres offset niteliğinde olmalıdır. Segment Adres1’de belirtilen segment adresi olarak alınacaktır.
Örnek 1
U 101 106
2054:0101 B800B0 MOV AX,B000
2054:0104 8ED8 MOV DS,AX
2054:0106 BE0000 MOV SI,0000
Örnek 2
U 102 106
2054:0102 00B08ED8 ADD
[BX+SI+D88E],DH
2054:0106 BE0000 MOV SI,0000
5.1.8 W Write
Komutu
Bellekteki herhangi bir proğramın bir blok şeklinde diske proğram olarak yazılmasını sağlar. Komutun kullanım
şekli;
W Adres
şeklindedir.
komuttan sonra verilen adres diske kaydedilecek
proğramın başlangıç adresidir. Eğer bu parametre
verilmezse 0100 offseti default olarak kabul edilir. Diske yazılacak programın
uzunluğu BX:CX register çiftinden alınır.
Komut kullanılmadan önce N komutu ile diske yazılacak
programın ismi belirlenmelidir. Aksi halde diske yazma işlemi default deger üzerinden
yapılacaktır.
Örnek;
N Deneme.com
R BX
: 0000
R CX
: 0010
W
Writing 0010 Bytes
-
6. ASSEMBLER PROGRAM YAPISI ve İLGİLİ KOMUTLAR
Bir program belleği parçalara bölerek (segmentleyerek)
kullanır. Assembler programlarda da yapı itibariyle
bellegin segmentlere
ayrılması ve ayrılan her bölümün ayrı ayrı
tanımlanarak kullanılması esastır. Bu nedenle bir assembler programında genel itibariyle bölüm tanımları
programın yapısını oluşturur. Genellikle bir proğramda
geçici verilerin saklandığı stack, kalıcı verileri
saklamak için data ve program kodlarının saklandığı code segment bölümleri yer alır.
Bir assembler programının örnek yapı sı aşağıda
verilmiştir.
STK SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
STK ENDS
DAT SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
DAT ENDS
COD SEGMENT PARA ‘COD’
ANA PROC NEAR
ASSUME SS:STK, DS:DAT, CS:COD
....
....
ANA ENDP
COD ENDS
END
6.1 Segment Komutu
Segment komutu programın kullandığı segment kesimlerini tanımlamak için kullanılır. Program
içinde tanımlanan herhangi bir segment segment registerleri tarafından
takip edilir. Tanımlanan herhangi bir segmentin hangi
register tarafından takip edil ecegi ASSUME deyimi ile tanımlanır. Komutun kullanım
şekli;
isim SEGMENT tip ‘sınıf’
şeklindedir.
Komut bir isim ile başlar. Tanımlanan isim degişken olabilme kurallarına uygun herhangi bir harf
dizisidir. Tanımlanan isim program içinde yapılacak atamalarda vb. işlemlerde
kullanılabilir.
Tip segmentin
adreslenebilme tipini belirler. Bu deyim ile kullanılabilecek tip
çeşitleri;
PAGE 256 Byte ve katlarıyla
adreslenebilen segment
PARA 16 Byte ve katlarıyla
adreslenebilen segment
WORD Word ve katlarıyla
adreslenebilen segment
BYTE Byte ve katlarıyla
adreslenebilen segment
Segment anahtar cümlesi ile başlayan bir segment ENDS cümlesi ile son bulmak
zorundadır.
Örnek
STK SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
STK ENDS
STK SEGMENT PAGE ‘STK’
Tanimlar
Tanimlar
STK ENDS
6.2 Assume
Komutu
Mikroişlemciler program içinde bellek kesimlerini takip edebilmek için en az 3
adet segment registeri
kullanır. Bu registerler CS, DS, SS registerleridir. CS registeri
program kodlarını takip etmek için, DS registeri
program içinde sabit olarak kul lanılan verileri
saklamak için, SS registeri ise program içinde
kullanılan geçici verileri saklamak için kullanılır.
Program içinde belirlenen segmet kesimlerinden hangisinin hangi register ile takip edilecegi assembler derleyicisine Assume
deyimi ile bildirilir. Komutun kullanım şekli,
Assume
register : segment , register : segment , ........
şeklindedir.
Örnek:
STK SEGMENT PARA ‘STK’
Tanımlar
Tanımlar
STK ENDS
DATA SEGMENT PARA ‘DAT’
Tanımlar
Tanımlar
DATA ENDS
CODE SEGMENT PARA ‘CODE’
BASLA PROC FAR
ASSUME DS:DATA, SS:STK, CS:CODE
6.3 Proc
Komutu
Proc komutu Code segment içindeki bir işlem blogunun tanımlanmasını sağlar. Tanımlanan bloklar bir procedure davranabilirler ve diger
bloklar tarafından CALL komutu ile çağrılabilirler. Her assembler programı içinde en az 1 işlem blogunun olması zo runludur. İlk çalışacak olan blok segment başlanğıcındaki bloktur.
Bu bloktan diger bloklar çağrılabilir. Eger assembler program üst düzey
dillerden çağrılacak bir program ise ilk çalışacak blok çağrılan blok
olacağından segment başında olma zorunluluğu y oktur.
Komutun kullanılış şekli;
isim PROC tip
şeklindedir.
İsim, degişken
olabilme kurallarına uymak koşulu ile istenen herhangi bir harf dizisi olabilir.
PROC deyiminden sonra gelen tip FAR veya NEAR olabilir. Bu deyimler ilerideki
bölümlerde detaylı olarak anlatılacaktır. ilk çalışacak bölümün FAR, dige r bölümlerin NEAR olabileceğinin bilinmesi bu bölüm
için yeterlidir.
Proc deyimi ile
başlayan herhangi bir program blogu ENDP deyimi ile
sonlandırılmalıdır.
Örnek:
STK SEGMENT PARA ‘STK’
Tanımlar
STK ENDS
DATA SEGMENT PARA ‘DAT’
Tanımlar
DATA ENDS
CODE SEGMENT PARA ‘CODE’
BASLA PROC FAR
ASSUME DS:DATA, SS:STK, CS:CODE
Push
DS
Push
SS
Mov
Ax, 15h
.
.
CALL ATLA1
BASLA ENDP
ATLA1 PROC FAR
.
RET
ATLA1 ENDP
ENDS
END
6.4 Call/Ret
Komutu
Call komutu herhangi bir işlem blogu içinden bir başka işlem blogunu çagırmak için kullanılır.
Komut aynı segment içindeki(Near) işlem bloklarını çağırabileceği gibi farklı segment içindeki(Far) işlem bloklarını da çağırabilir.
Komutun kullanılış ş ekli;
CALL Çağrılan Blok Adı
Call komutunun
işlenmesi sırasında mikroişlemci çağrılan bloga
gitmeden önce code segment
içinde bulunduğu adresi stack segment içine saklar ve çağrılan yere dallanır. Çağrılan
blok içinde işlemler sona erdikten sonra stack segmente saklanan adrese tekrar geri dönülür. Çağrılan blok
içindeki işlemlerin bittiği RET komutu ile belirlenir.
Ret komutu genel olarak parametresiz kullanılır ve
stack segment içindeki
bilginin CS:IP ikilisine aktarılmasını sağlar.
7. DEGİŞKEN VE SABİT TANIMLAMA
Assembler program içinde herhangi bir segment kesiminde degişken
tanımlaması yapılabilir. Değişken ve sabit tanımlamaları;
·
DB
·
DW
·
DD
·
DQ
·
DT
·
DUP
Komutları ile yapılır.
7.1 DB Deyimi
Byte
tipi bir degişkenin veya sabitin tanımlanmasını
sağlar. Tanımlama byte tipinde bir alan olabileceği
gibi dizi şeklinde bir alan da olabilir. Tanımlanan alan(ların) 8 bit olması nedeni ile bu alana 0 ile FF arasında
herhangi bir deger atanabili
r. Deyimin kullanılış şekli;
degişken DB ilk deger
Tüm değişken veya sabit tanımlama deyimleri ile
tanımlanan alanlara ilk deger atama işlemleri
tanımlama anında gerçekleştirilir. Eğer tanımlanan alana deger atanmayacak ise ilk deger
olarak ? atanmalıdır. Aşağıdaki atamalar geçerli
atamalardır.
SAYI DB 30 ;ilk değeri 30 olan SAYI
sabit/değişkeni
SAY DB 0AH ;ilk değeri 10 olan SAY
sabit/değişkeni
ABC DB ‘ADI SOYADI’ ;ilk değeri ADI SOYADI olan
karakter dizisi
DIZI DB 0,1,2,3,4,5,6,7 ;değerleri 0,1,2,3,4,5,6,7
olan byte dizisi
ilk değer ataması sırasında bir dizi
oluşturulacak ve dizinin içine belirli bir değer/değerler atanacaksa DUP deyimi
kullanılır.
ABC DB 10 DUP (?) ;içerikleri olmayan 10 byte’lık bir dizi
ABC DB 50 DUP (0AH) ;İçerikleri 10 olan 50 byte’lık bir dizi
ABC DB 25 DUP (0,1) ;içerikleri 0,1,0,1.... olan 25
byte’lık bir dizi
7.2 DW
Deyimi
iki byte’lık bir sabit/değişken tanımlamasının
yapılmasını sağlar. Deyimin kullanılış şekli;
degişken DW ilk
değer
şeklindedir.
MESAJ DW 1210H
SAYI1 DW ?
SAYI2 DW 10 DUP(0)
SAYI3 DW 0,0AABH,CCCAH
7.3 DD Deyimi
Dört byte’lık
bir sabit/değişken tanımlamasının yapılmasını sağlar. Deyimin kullanılış
şekli;
degişken DD ilk
değer
şeklindedir.
MESAJ DD 12100000H
SAYI1 DD ?
SAYI2 DD 10 DUP(0)
SAYI3 DD 0,0AABC12H,0H
7.4 DQ Deyimi
64 bitlik, Sekiz byte’lık bir sabit/değişken
tanımlamasının yapılmasını sağlar. Deyimin kullanılış
şekli;
degişken DQ ilk değer
şeklindedir.
MESAJ DQ 12100000H
SAYI1 DQ ?
SAYI2 DQ 10 DUP(0)
SAYI3 DQ 0,0AABC12H,0H
7.5 DT Deyimi
Seksen bit 10 byte’lık bir sabit/değişken
tanımlamasının yapılmasını sağlar. Deyimin kullanılış
şekli;
degişken DT ilk değer
şeklindedir.
MESAJ DT 12100000H
SAYI1 DT ?
SAYI2 DT 10 DUP(0)