Assembly Programlama Dili
Assembler programlama dili, çogu zaman özel alanlarda gelistirilen programlarda kullanilan alt düzel bir Programlama dili olarak tanimlanir. Bu dilin komutlari, bilgisayarin dogrudan islettigi makine dili komutlarinin birebir karsi ligidir. Bu nedenle bu dil için makine dili de denilebilir.
Her ne kadar uzman programcilarin özel alanlarda kullandigi bir dil olarak tanimlansa da, programcilar istedikleri takdirde her türlü uygulamayi bu dil ile gelistirebilirler yada kullandiklari üst düzey dil altindan çagirabilecekleri procedurler yazabilirler. Çünkü hemen hemen her dilde assembler için destek bulunmaktadir.
Dilin en büyük avantaji CPU çevrebirimlerinin ve ana bellegin çok iyi bir sekilde kontrolünü saglamasidir. Ayrica isletim sistem fonksiyonlarini da çok kolaylikla kullanmak mümkündür. Assembler program dili derleyicisi kullanilan ko mutlarin birebir makine dili karsiliklarini üretir. Bu nedenle bu dil ile olusturulan programlar olabilecek en kisa programlar olurlar.
Bir assembler programi çalisabilir bir programin tüm kesimlerinin tam olarak tanitilmasi ile olusturulabilir. Bu nedenle bir assembler programda minimum üç ana kesim bulunmalidir.
1 - STACK Segment
2 - DATA Segment
3 - CODE Segment
Basit bir assembler programi;
STACK SEGMENT PARA ‘STACK’
DB 64 DUP (‘STACK’)
STACK ENDS
DATA SEGMENT PARA ‘DATA’
MESAJ DB ‘BU BiR 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. BiLGiNiN TEMSiLi
Elektronik bilgi islem makinalarinda bilgiler elektriksel uyarimlarla temsil edilirler. Bu uyarimlarin ifadesi 1 ve 0’lardan olusan rakamlarla temsil edilirler. Bu uyarimlari BIT adi verilir. Açiktir ki bir BIT ile 0 ve 1 gibi iki b ilginin temsili sözkonusudur. Ancak günlük hayatta kullandigimiz bilgiler 2 adet degildir. Bu nedenle BIT’ler guruplanarak kullanilirlar. En küçük BIT gurubu 8 bitten olusan guruptur ki bu guruba BYTE adi verilir. Bir byte ile +127 ile -127 arasindaki rak amlar ile harflerin temsili mümkün olur. Bir byte ile temsil edilen harfler için kullanilan en yaygin stantdart ASCII(American Standard Code for Infirmation Interchange) standartdir.
2- VERi TiPLERi
Bir programlama dilinin temel özelliklerinden birisi dilin içinde kullanilacak olan veri tipleridir. Burada assembler dilinde kullanilan en basit veri tiplerinden bahsedilecektir.
Assembler programlama dilinde kullanilacak olan bilgilerin uzunlugu bilgisayarin mikroislemcisine baglidir. 8088 mikroislemci için en fazla 16 bit uzunlugunda bir veri temsil edilebilir. 80286, 80386 ve 80486 mikroislemcileri daha g elismis olduklari için kullandiklari bilgi uzunlugu daha fazla olabilir.
2.1 BYTE
Byte 8 bitten olusan 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 sayilar isaretli ve isaretsiz olarak iki ana guruba ayrilirlar. isaretsiz sayilar tüm veri alanini bir bütün olarak degerlendirildigi bir durumu ifade eder. Sayilarin isaretli veya isaretsiz olmasi makine açisindan izafi bir durumdur.
1 0 0 0 0 0 0 1 isaretsiz 129 sayisini temsil eder.
1 0 0 0 0 0 0 1 isaretli -1 sayisini temsil eder.
Negatif sayilarda en duyarli bit 1 olur.
Byte iki ana kisimdan olusur. Her kisima NIBBLE adi verilir. Her NIBBLE bir hexadecimal sayiyi temsil eder.
1 0 0 0 0 0 0 1
----------- -------------
2.NIBBLE 1.NIBBLE
2.2 WORD
2 Adet Byte ile olusturulmus bir yapidir. 8088 ve diger mikroislemciler 16 bit uzunlugundaki bu yapiyi desteklerler. Word yapisini bir bütün olarak isleyebileceginiz gibi yüksek byte (HB) veya Low byte (LB) olarak da isleyebilirsini z.
2.3 DOUBLEWORD
iki word uzunlugunda yani 32 bit uzunlugunda bir yapidir. Gerek adreslemede gerekse büyük sayilarin saklanmasinda kullanilir.
2.4 QUADWORD
64 Bit uzunlugunda bir yapidir. 4 word’un birlestirilmesi ile olusturulur.
8088 Mikroislemcisi olan bir makinada direkt mikroislemcinin destekledigi BYTE ve WORD kavramlari kullanilabilir. 80286, 80386 ve üzeri mikroislemcilerde BYTE ve WORD kavramlarinin disinda DOUBLEWORD ve QUADWORD kavramlari da kulla nilabilir. 8088 mikroislemcilerde WORD’den daha uzun sabit ve degiskenler de kullanilabilir. Ancak bu kullanim direkt mikroislemci destegi disinda yazilim destegi ile olur.
3- MiKROisLEMCi TASARIMI
Bir mikroislemci,kendisine bagli çevre birimlerle haberlesebilmek, yürütmekte oldugu programlari kontrol edebilmek için REGiSTER adi verilen, kendi iç yapisinda fiziksel olarak bulunan RAM elemanlarini kullanir. REGiSTERLER bir mikroislemcinin en temel bilesenlerinden biridir. intel 80xxx serisi mikroislemcilerde uzunluklari degismekle beraber asagidaki registerler bulunur.
Genel Amacli 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çli Registerler
AX,BX,CX,DX registerleri genel amaçli registerlerdir. Mikroislemci programlari çalistirirken verileri ana bellek ile iç bellek arasinda sürekli olarak tasir. Genel amaçli registerler bu tasima sirasinda aracilik ederler. Ayni zaman da matematiksel islemlerde giris ve çikis noktalari olarak kullanilirlar. X
Bu registerlerin tamami 16 bit uzunlugunda olup, 2 byte’tan olusurlar. Byte’lar bir bütün olarak kullanilabilecegi gibi ayri ayri da kullanilabilirler.
3.1.1 AX YAZMACI
Programlarda en çok kullanilan yazmaçlardan biridir. Accumulator’ün kisaltilmasi sonunda olusan AX yazmaci bütün giris ve çikis islemlerinde ve bazi aritmetik islemlerde kullanilir.
AX
--------------------------------------------------------
AH AL
3.1.2 BX YAZMACI
BX Registeri Base register olarak da bilinir. RAM ve IO islemlerinde adreslemede kullanilir. Register adresleme islemlerinde daha çok offset degerlerini tutar. Ayrica hesaplama islemlerinde de kullanilir.
BX
--------------------------------------------------------
BH BL
3.1.3 CX YAZMACI
CX Registeri Counter registeridir. Döngü islemlerinde ve kaydirma islemlerinde sayaç olarak kullanilir.
CX
--------------------------------------------------------
CH CL
3.1.4 DX YAZMACI
Register bazi giris çikis islemlerinde ve matematiksel islemlerde kullanilir.Daha çok çarpma ve bölme islemlerinde büyük sayilari saklamak için AX registerinin bir parçasiymis gibi kullanilir.
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 programi exe veya com tipli, diger bir deyisle makine dili formatli program dosyalarinin çalistirilmasi, bu programlarin bellek yerlesimlerinin, cpu üzerindeki etkilerinin ve verilerinin incelenmesi, degistirilmesi vs. amaciyla ku llanilan bir programdir.
Debug programi ile bir makine dili programi bellege yükleyebilir, bu programi step step çalistirabileceginiz gibi programin belli bir kismini çalistirabilirsiniz veya programin makine dili kodlari üzerinde degisiklik yapabilir, programa yeni kodlar ekleyebilir veya çikarabilirsiniz. Yada herhangi bir programi assembly kullanarak veya makine dili kullanarak yeniden olusturabilirsiniz.
5.1 Debug Komutlari.
Debug programi dos isletim sisteminin bir parçasidir. Bu nedenle dos versionlari arasinda komutlarda veya komut özelliklerinde degisiklikler olabilmektedir. Burada programin tüm komutlarini anlatmak yerine program yazmayi veya incelemeyi saglayacak olan komutlar üzerinde durulacaktir.
A Assemble Assembly programlarinin yazilmasini saglar.
G Go Bellekte yüklü olan bir programin çalistirilmasini saglar.
L Load Diskten bellege bir programin yüklenmesini saglar.
N Name Bellekteki program için isim seçmeyi saglar.
Q Quit Programdan çikarak isletim sistemine dönmeyi saglar.
R Register Register degerlerini görme ve degistirme.
T Trace Bellekteki bir veya daha fazla komutun çalistirilmasini saglar.
U Unassembly Assembly kodlarinin makine dili karsiliklarini almanizi saglar.
W Write Bellekteki programin diske yazilmasini saglar.
Program sistem komut satirindan debug yazilarak çalistirilabilir. Program çalistirilirken eger bir program bellege yüklenecekse bu program ismi komut satirindan verilebilir. Program çalistiginda ekranin sol tarafinda ( - ) isareti belirecektir. Bu prompt debug programinin komut almaya hazir oldugunu gösterir.
5.1.1 A Assembly Komutu
A Komutu assembly program yazmak için kullanilir. Bu komutun kullanilis sekli;
-- A [segmentffset]
seklindedir.
Komutun parametresi olan adres, yazilacak programin bellegin neresinden itibaren yerlesecegini gösterir. Parametre seçimliktir. Eger verilmeyecek olur ise mevcut CS ve IP üzerindeki degerler komutun parametresi olarak varsayilir. Komuttan sonra hiç bir parametre vermeyeceginiz gibi sadece offset adresi de verebilirsiniz. Eger komuttan sonra sadece tek bir sayi verilmisse verilen deger offset olarak algilanir ve IP registerine bu deger verilerek programin default segment ve belirlenen offset üzerinde n yazilmasi saglanir.
Komutun çalistirilmasi ile, default veya belirlenen segment ve offset adresi yeni bir satir basina yazilarak bu adresin yaninda komut girisi için beklenir. Her komut girilip enter tusuna basildiginda debug ilk önce girilen komutu yorumlar ve girile n komut dogru ise segment ve offset adresleri yazilan komut uzunlugu kadar artirilarak yeni komut girisi için beklemeye baslar. Eger girilen komut hatali ise hata yeri gösterilerek komutun tekrar girilmesi için ayni segmet ve offset adreslerinde beklenir. Eger herhangi bir satirda komut girilmeyerek enter tusuna basilirsa debug komut satirina 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 yazilirken en son girilen komutun offset adresi default offset olarak alinir. A komutundan çiktiktan sonra tekrar ayni komut kullanilirsa default segmentin son kalinan offseti ekrana getirilir. Eger programa ek yapilacaksa bu yöntem kullani labilir. Ancak herhangi bir komut degistirilecekse komuta girilirken degistirilecek satirin segment ve offset adresi verilerek girilmelidir.
A komutu ile girilen komutlar bellege pespese yerlestirilirler. Bu nedenle yazilmis bir programin degistirilmesi oldukça zordur. Eger degistireceginiz komut uzunlugu daha önce yazdiginiz komut uzunlugu ile ayni ise problemsiz bir degisim sözkonusu olabilir. Ancak yazacaginiz komut eskisinden uzun ise M komutu ile ramde yer açmak gerekir.
5.1.2. G Go Komutu
Go komutu hafizadaki bir programin icra ettirilmesi amaci ile kullanilir. Komutun formati;
- G Adres
seklindedir.
Komuttan sonra verilen Adres parametresi seçimliktir. Adres verilmez ise program CS;IP ikilisindeki degerler default olarak alinarak çalistirilir. Verilen adres her zaman programin baslatilacagi adres olarak alinir. Bu deger sadece offset olarak ve rilebilecegi gibi segmet ve offest olarak da verilebilir.
Hafizadaki herhangi bir program RET yada INT 20 komutlarindan biri ile bitmelidir. G komutu bu iki assembler komutundan birini icra ettirdiginde PROGRAM TERMINATED NORMALLY deyimi ile sona erer. Bahsedilen komutlar program icrasini sona erdirerek k omut satirina dönmeyi saglar. Herhangi bir program bu iki komuttan biri ile sona ermiyor ise makinaniz denetimsiz komutlar yüzünden kilitlenecek yada istem disi davranacaktir.
Herhangi bir programi birden fazla sayida çalistiracaksaniz ikinci ve sonraki çalistirmalarda CS:IP ikilisinin degerlerinden emin olmalisiniz. CS:IP ikilisine istediginiz herhangi bir degeri R komutu ile atayabilirsiniz.
5.1.3 L Load Komutu
L Komutu disk üzerindeki herhangi bir programin bellege yüklenmesi için kullanilir. Komutun herhangi bir parametresi yoktur. Komut N komutu ile ismi belirlenmis bulunan programi bellege yükler.
5.1.4 N Name Komutu
N Komutu, L veya W komutu için dosya ismi seçmekte kullanilir. Komutun kullanim sekli;
- N Dosya Adi
seklindedir.
Name komutu Load ve Write komutlarindan önce kullanilarak diskten çagrilacak yada diske yazilacak dosyanin adini belirlemekte kullanilir.
5.1.4 Q Quit Komutu
Komut debug programini sonlandirir.
5.1.5 R Register Komutu
Komut CPU registerlerinin degerlerini görmek yada degistirmek için kullanilir. R komutunun kullanim biçimi asagida verilmistir.
- R Register Adi
Komut registerlerin kullanimi ile ilgili olmak üzere 3 ayri görevi yerine getirir.
R : Komut tek basina kullanilirsa CPU registerlerinin o anki tüm degerleri gösterilir. Registerlerin yanisira komut Flag registerinin degerlerini de temsili olarak gösterecektir. Komutun kullanimi sonunda CS:IP ile isaret edilen komut da ekranda göste rilecektir. R komutunun kullanimi sonunda asagidakine benzer bir görüntü alincaktir.
- 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 degerleri disindaki tüm registerler daha önceki bölümlerde anlatilmisti. Yukaridaki degerler Flag registerinin temsili gösterimidir. Bu registerin alabilecegi degerler asagida gösterilmistir.
FLAGLAR
Overflow
Direction
Interrupt
Sign
Zero
Auxiliary Carry
Parity
Carry
BIT SET (1)
OV
DN
EI
NG
ZR
AC
PE
CY
BIT RESET (0)
NV
UP
DI
PL
NZ
NA
PO
NC
2. R komutundan sonra parametre olarak F harfi kullanilirsa program flaglarin degistirilmesi için mevcut flaglari ekrana getirir ve istediginiz flaglari degistirmeniz için bekler. Bu durumda istediginiz herhangi bir flagi set yada reset edebilirsiniz.
- R F
NV UP EI PL NZ NA PO NC - ZRUP
-
Yukaridaki örnekte Zero flagi SET, direction flagi RESET edilmektedir.
3. R komutu ile sadece flaglarin degil tüm registerlerin degerleri degistirilebilir. Bunun için R komutundan sonra degistirilmesi istenen registerin isminin yazilmasi gerekir. Bu islem gerçeklestiginde registerin mevcut degeri ekrana yazilir ve ( : ) is areti konularak registerin yeni degeri sorulur. Bu isaretin yanina deger 4 digit hexadecimal olarak verilmelidir. Eger bir deger verilmeyip enter tusuna basilirsa registerin içerigi degistirilmeyecektir.
5.1.6 T Trace Komutu
Trace komutu hafizada bulunan bir programin satirlarinin tek tek veya belli bir kisminin çalistirilmasi için kullanilir. Komutun kullanimi asagida verilmistir.
- T=Adres Deger
Komutun parametreleri seçimliktir. Ilk parametre Adres parametresidir ki bu parametre kullanilacaksa komuttan sonra = isaretinin kullanimi zorunludur. Adres parametresi icra ettirilecek ilk komutun adresi olarak alinir.
Deger parametresi kaç adet komutun pespese icra ettirilecegini gösterir. Eger kullanilmamis ise bu deger 1 olarak alinir. Eger herhangi bir parametre kullanilmaz ise komut CS:IP ile adreslenen yerden baslayarak 1 komut icra ettirilir ve komutun icr asindan sonra registerlerin degeri ve islenecek olan komut ekranda görüntülenir.
5.1.7 U Unassembly Komutu
U Komutu bellekteki programin makine dili ve assembly karsiliklarini ekranda listelemek için kullanilir. Komutun kullanim sekli asagida verilmistir.
- U Adres1 Adres2
Parametre olarak verilen Adres1 listelenmek istenen programin baslangiç 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 anlamsiz bir liste olacaktir.
Ikinci verilen parametre listelemenin sonunu belirler. Burada verilecek adres offset niteliginde olmalidir. Segment Adres1’de belirtilen segment adresi olarak alinacaktir.
Ö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 programin bir blok seklinde diske program olarak yazilmasini saglar. Komutun kullanim sekli;
W Adres
seklindedir.
komuttan sonra verilen adres diske kaydedilecek programin baslangiç adresidir. Eger bu parametre verilmezse 0100 offseti default olarak kabul edilir. Diske yazilacak programin uzunlugu BX:CX register çiftinden alinir.
Komut kullanilmadan önce N komutu ile diske yazilacak programin ismi belirlenmelidir. Aksi halde diske yazma islemi default deger üzerinden yapilacaktir.
Örnek;
N Deneme.com
R BX
: 0000
R CX
: 0010
W
Writing 0010 Bytes
-
6. ASSEBLER PROGRAM YAPISI ve ILGILI KOMUTLAR
Bir program bellegi parçalara bölerek (segmentleyerek) kullanir. Assembler programlarda da yapi itibariyle bellegin segmentlere ayrilmasi ve ayrilan her bölümün ayri ayri tanimlanarak kullanilmasi esastir. Bu nedenle bir assembler programinda genel itibariyle bölüm tanimlari programin yapisini olusturur. Genellikle bir programda geçici verilerin saklandigi stack, kalici verileri saklamak için data ve program kodlarinin saklandigi code segment bölümleri yer alir. Bir assembler programinin örnek yapi si asagida verilmistir.
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, DSAT, CS:COD
....
....
ANA ENDP
COD ENDS
END
6.1 Segment Komutu
Segment komutu programin kullandigi segment kesimlerini tanimlamak için kullanilir. Program içinde tanimlanan herhangi bir segment segment registerleri tarafindan takip edilir. Tanimlanan herhangi bir segmentin hangi register tarafindan takip edil ecegi ASSUME deyimi ile tanimlanir. Komutun kullanim sekli;
isim SEGMENT tip ‘sinif’
seklindedir.
Komut bir isim ile baslar. Tanimlanan isim degisken olabilme kurallarina uygun herhangi bir harf dizisidir. Tanimlanan isim program içinde yapilacak atamalarda vb. islemlerde kullanilabilir.
Tip segmentin adreslenebilme tipini belirler. Bu deyim ile kullanilabilecek tip çesitleri;
PAGE 256 Byte ve katlariyla adreslenebilen segment
PARA 16 Byte ve katlariyla adreslenebilen segment
WORD Word ve katlariyla adreslenebilen segment
BYTE Byte ve katlariyla adreslenebilen segment
Segment anahtar cümlesi ile baslayan bir segment ENDS cümlesi ile son bulmak zorundadir.
Örnek
STK SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
STK ENDS
STK SEGMENT PAGE ‘STK’
Tanimlar
Tanimlar
STK ENDS
6.2 Assume Komutu
Mikroislemciler program içinde bellek kesimlerini takip edebilmek için en az 3 adet segment registeri kullanir. Bu registerler CS, DS, SS registerleridir. CS registeri program kodlarini takip etmek için, DS registeri program içinde sabit olarak kul lanilan verileri saklamak için, SS registeri ise program içinde kullanilan geçici verileri saklamak için kullanilir.
Program içinde belirlenen segmet kesimlerinden hangisinin hangi register ile takip edilecegi assembler derleyicisine Assume deyimi ile bildirilir. Komutun kullanim sekli,
Assume register : segment , register : segment , ........ seklindedir.
Örnek:
STK SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
STK ENDS
DATA SEGMENT PARA ‘DAT’
Tanimlar
Tanimlar
DATA ENDS
CODE SEGMENT PARA ‘CODE’
BASLA PROC FAR
ASSUME DSATA, SS:STK, CS:CODE
6.3 Proc Komutu
Proc komutu Code segment içindeki bir islem blogunun tanimlanmasini saglar. Tanimlanan bloklar bir procedure davranabilirler ve diger bloklar tarafindan CALL komutu ile çagrilabilirler. Her assembler programi içinde en az 1 islem blogunun olmasi zo runludur. ilk çalisacak olan blok segment baslangicindaki bloktur. Bu bloktan diger bloklar çagrilabilir. Eger assembler program üst düzey dillerden çagrilacak bir program ise ilk çalisacak blok çagrilan blok olacagindan segment basinda olma zorunlulugu y oktur. Komutun kullanilis sekli;
isim PROC tip
seklindedir.
isim, degisken olabilme kurallarina uymak kosulu ile istenen herhangi bir harf dizisi olabilir. PROC deyiminden sonra gelen tip FAR veya NEAR olabilir. Bu deyimler ilerideki bölümlerde detayli olarak anlatilacaktir. ilk çalisacak bölümün FAR, dige r bölümlerin NEAR olabileceginin bilinmesi bu bölüm için yeterlidir.
Proc deyimi ile baslayan herhangi bir program blogu ENDP deyimi ile sonlandirilmalidir.
Örnek:
STK SEGMENT PARA ‘STK’
Tanimlar
STK ENDS
DATA SEGMENT PARA ‘DAT’
Tanimlar
DATA ENDS
CODE SEGMENT PARA ‘CODE’
BASLA PROC FAR
ASSUME DSATA, 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 islem blogu içinden bir baska islem blogunu çagirmak için kullanilir. Komut ayni segment içindeki(Near) islem bloklarini çagirabilecegi gibi farkli segment içindeki(Far) islem bloklarini da çagirabilir. Komutun kullanilis s ekli;
CALL Çagrilan Blok Adi
Call komutunun islenmesi sirasinda mikroislemci çagrilan bloga gitmeden önce code segment içinde bulundugu adresi stack segment içine saklar ve çagrilan yere dallanir. Çagrilan blok içinde islemler sona erdikten sonra stack segmente saklanan adrese tekrar geri dönülür. Çagrilan blok içindeki islemlerin bittigi RET komutu ile belirlenir.
Ret komutu genel olarak parametresiz kullanilir ve stack segment içindeki bilginin CS:IP ikilisine aktarilmasini saglar.
7. DEGisKEN VE SABiT TANIMLAMA
Assembler program içinde herhangi bir segment kesiminde degisken tanimlamasi yapilabilir. Degisken ve sabit tanimlamalari;
* DB
* DW
* DD
* DQ
* DT
* DUP
Komutlari ile yapilir.
7.1 DB Deyimi
Byte tipi bir degiskenin veya sabitin tanimlanmasini saglar. Tanimlama byte tipinde bir alan olabilecegi gibi dizi seklinde bir alan da olabilir. Tanimlanan alan(larin) 8 bit olmasi nedeni ile bu alana 0 ile FF arasinda herhangi bir deger atanabili r. Deyimin kullanilis sekli;
degisken DB ilk deger
Tüm degisken veya sabit tanimlama deyimleri ile tanimlanan alanlara ilk deger atama islemleri tanimlama aninda gerçeklestirilir. Eger tanimlanan alana deger atanmayacak ise ilk deger olarak ? atanmalidir. Asagidaki atamalar geçerli atamalardir.
SAYI DB 30 ;ilk degeri 30 olan SAYI sabit/degiskeni
SAY DB 0AH ;ilk degeri 10 olan SAY sabit/degiskeni
ABC DB ‘ADI SOYADI’ ;ilk degeri ADI SOYADI olan karakter dizisi
DIZI DB 0,1,2,3,4,5,6,7 ;degerleri 0,1,2,3,4,5,6,7 olan byte dizisi
ilk deger atamasi sirasinda bir dizi olusturulacak ve dizinin içine belirli bir deger/degerler atanacaksa DUP deyimi kullanilir.
ABC DB 10 DUP (?) ;içerikleri olmayan 10 byte’lik bir dizi
ABC DB 50 DUP (0AH) ;içerikleri 10 olan 50 byte’lik bir dizi
ABC DB 25 DUP (0,1) ;içerikleri 0,1,0,1.... olan 25 byte’lik bir dizi
7.2 DW Deyimi
iki byte’lik bir sabit/degisken tanimlamasinin yapilmasini saglar. Deyimin kullanilis sekli;
degisken DW ilk deger
seklindedir.
MESAJ DW 1210H
SAYI1 DW ?
SAYI2 DW 10 DUP(0)
SAYI3 DW 0,0AABH,CCCAH
7.3 DD Deyimi
Dört byte’lik bir sabit/degisken tanimlamasinin yapilmasini saglar. Deyimin kullanilis sekli;
degisken DD ilk deger
seklindedir.
MESAJ DD 12100000H
SAYI1 DD ?
SAYI2 DD 10 DUP(0)
SAYI3 DD 0,0AABC12H,0H
7.4 DQ Deyimi
64 bitlik, Sekiz byte’lik bir sabit/degisken tanimlamasinin yapilmasini saglar. Deyimin kullanilis sekli;
degisken DQ ilk deger
seklindedir.
MESAJ DQ 12100000H
SAYI1 DQ ?
SAYI2 DQ 10 DUP(0)
SAYI3 DQ 0,0AABC12H,0H
7.5 DT Deyimi
Seksen bit 10 byte’lik bir sabit/degisken tanimlamasinin yapilmasini saglar. Deyimin kullanilis sekli;
degisken DT ilk deger
seklindedir.
MESAJ DT 12100000H
SAYI1 DT ?
SAYI2 DT 10 DUP(0)
Assembler programlama dili, çogu zaman özel alanlarda gelistirilen programlarda kullanilan alt düzel bir Programlama dili olarak tanimlanir. Bu dilin komutlari, bilgisayarin dogrudan islettigi makine dili komutlarinin birebir karsi ligidir. Bu nedenle bu dil için makine dili de denilebilir.
Her ne kadar uzman programcilarin özel alanlarda kullandigi bir dil olarak tanimlansa da, programcilar istedikleri takdirde her türlü uygulamayi bu dil ile gelistirebilirler yada kullandiklari üst düzey dil altindan çagirabilecekleri procedurler yazabilirler. Çünkü hemen hemen her dilde assembler için destek bulunmaktadir.
Dilin en büyük avantaji CPU çevrebirimlerinin ve ana bellegin çok iyi bir sekilde kontrolünü saglamasidir. Ayrica isletim sistem fonksiyonlarini da çok kolaylikla kullanmak mümkündür. Assembler program dili derleyicisi kullanilan ko mutlarin birebir makine dili karsiliklarini üretir. Bu nedenle bu dil ile olusturulan programlar olabilecek en kisa programlar olurlar.
Bir assembler programi çalisabilir bir programin tüm kesimlerinin tam olarak tanitilmasi ile olusturulabilir. Bu nedenle bir assembler programda minimum üç ana kesim bulunmalidir.
1 - STACK Segment
2 - DATA Segment
3 - CODE Segment
Basit bir assembler programi;
STACK SEGMENT PARA ‘STACK’
DB 64 DUP (‘STACK’)
STACK ENDS
DATA SEGMENT PARA ‘DATA’
MESAJ DB ‘BU BiR 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. BiLGiNiN TEMSiLi
Elektronik bilgi islem makinalarinda bilgiler elektriksel uyarimlarla temsil edilirler. Bu uyarimlarin ifadesi 1 ve 0’lardan olusan rakamlarla temsil edilirler. Bu uyarimlari BIT adi verilir. Açiktir ki bir BIT ile 0 ve 1 gibi iki b ilginin temsili sözkonusudur. Ancak günlük hayatta kullandigimiz bilgiler 2 adet degildir. Bu nedenle BIT’ler guruplanarak kullanilirlar. En küçük BIT gurubu 8 bitten olusan guruptur ki bu guruba BYTE adi verilir. Bir byte ile +127 ile -127 arasindaki rak amlar ile harflerin temsili mümkün olur. Bir byte ile temsil edilen harfler için kullanilan en yaygin stantdart ASCII(American Standard Code for Infirmation Interchange) standartdir.
2- VERi TiPLERi
Bir programlama dilinin temel özelliklerinden birisi dilin içinde kullanilacak olan veri tipleridir. Burada assembler dilinde kullanilan en basit veri tiplerinden bahsedilecektir.
Assembler programlama dilinde kullanilacak olan bilgilerin uzunlugu bilgisayarin mikroislemcisine baglidir. 8088 mikroislemci için en fazla 16 bit uzunlugunda bir veri temsil edilebilir. 80286, 80386 ve 80486 mikroislemcileri daha g elismis olduklari için kullandiklari bilgi uzunlugu daha fazla olabilir.
2.1 BYTE
Byte 8 bitten olusan 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 sayilar isaretli ve isaretsiz olarak iki ana guruba ayrilirlar. isaretsiz sayilar tüm veri alanini bir bütün olarak degerlendirildigi bir durumu ifade eder. Sayilarin isaretli veya isaretsiz olmasi makine açisindan izafi bir durumdur.
1 0 0 0 0 0 0 1 isaretsiz 129 sayisini temsil eder.
1 0 0 0 0 0 0 1 isaretli -1 sayisini temsil eder.
Negatif sayilarda en duyarli bit 1 olur.
Byte iki ana kisimdan olusur. Her kisima NIBBLE adi verilir. Her NIBBLE bir hexadecimal sayiyi temsil eder.
1 0 0 0 0 0 0 1
----------- -------------
2.NIBBLE 1.NIBBLE
2.2 WORD
2 Adet Byte ile olusturulmus bir yapidir. 8088 ve diger mikroislemciler 16 bit uzunlugundaki bu yapiyi desteklerler. Word yapisini bir bütün olarak isleyebileceginiz gibi yüksek byte (HB) veya Low byte (LB) olarak da isleyebilirsini z.
2.3 DOUBLEWORD
iki word uzunlugunda yani 32 bit uzunlugunda bir yapidir. Gerek adreslemede gerekse büyük sayilarin saklanmasinda kullanilir.
2.4 QUADWORD
64 Bit uzunlugunda bir yapidir. 4 word’un birlestirilmesi ile olusturulur.
8088 Mikroislemcisi olan bir makinada direkt mikroislemcinin destekledigi BYTE ve WORD kavramlari kullanilabilir. 80286, 80386 ve üzeri mikroislemcilerde BYTE ve WORD kavramlarinin disinda DOUBLEWORD ve QUADWORD kavramlari da kulla nilabilir. 8088 mikroislemcilerde WORD’den daha uzun sabit ve degiskenler de kullanilabilir. Ancak bu kullanim direkt mikroislemci destegi disinda yazilim destegi ile olur.
3- MiKROisLEMCi TASARIMI
Bir mikroislemci,kendisine bagli çevre birimlerle haberlesebilmek, yürütmekte oldugu programlari kontrol edebilmek için REGiSTER adi verilen, kendi iç yapisinda fiziksel olarak bulunan RAM elemanlarini kullanir. REGiSTERLER bir mikroislemcinin en temel bilesenlerinden biridir. intel 80xxx serisi mikroislemcilerde uzunluklari degismekle beraber asagidaki registerler bulunur.
Genel Amacli 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çli Registerler
AX,BX,CX,DX registerleri genel amaçli registerlerdir. Mikroislemci programlari çalistirirken verileri ana bellek ile iç bellek arasinda sürekli olarak tasir. Genel amaçli registerler bu tasima sirasinda aracilik ederler. Ayni zaman da matematiksel islemlerde giris ve çikis noktalari olarak kullanilirlar. X
Bu registerlerin tamami 16 bit uzunlugunda olup, 2 byte’tan olusurlar. Byte’lar bir bütün olarak kullanilabilecegi gibi ayri ayri da kullanilabilirler.
3.1.1 AX YAZMACI
Programlarda en çok kullanilan yazmaçlardan biridir. Accumulator’ün kisaltilmasi sonunda olusan AX yazmaci bütün giris ve çikis islemlerinde ve bazi aritmetik islemlerde kullanilir.
AX
--------------------------------------------------------
AH AL
3.1.2 BX YAZMACI
BX Registeri Base register olarak da bilinir. RAM ve IO islemlerinde adreslemede kullanilir. Register adresleme islemlerinde daha çok offset degerlerini tutar. Ayrica hesaplama islemlerinde de kullanilir.
BX
--------------------------------------------------------
BH BL
3.1.3 CX YAZMACI
CX Registeri Counter registeridir. Döngü islemlerinde ve kaydirma islemlerinde sayaç olarak kullanilir.
CX
--------------------------------------------------------
CH CL
3.1.4 DX YAZMACI
Register bazi giris çikis islemlerinde ve matematiksel islemlerde kullanilir.Daha çok çarpma ve bölme islemlerinde büyük sayilari saklamak için AX registerinin bir parçasiymis gibi kullanilir.
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 programi exe veya com tipli, diger bir deyisle makine dili formatli program dosyalarinin çalistirilmasi, bu programlarin bellek yerlesimlerinin, cpu üzerindeki etkilerinin ve verilerinin incelenmesi, degistirilmesi vs. amaciyla ku llanilan bir programdir.
Debug programi ile bir makine dili programi bellege yükleyebilir, bu programi step step çalistirabileceginiz gibi programin belli bir kismini çalistirabilirsiniz veya programin makine dili kodlari üzerinde degisiklik yapabilir, programa yeni kodlar ekleyebilir veya çikarabilirsiniz. Yada herhangi bir programi assembly kullanarak veya makine dili kullanarak yeniden olusturabilirsiniz.
5.1 Debug Komutlari.
Debug programi dos isletim sisteminin bir parçasidir. Bu nedenle dos versionlari arasinda komutlarda veya komut özelliklerinde degisiklikler olabilmektedir. Burada programin tüm komutlarini anlatmak yerine program yazmayi veya incelemeyi saglayacak olan komutlar üzerinde durulacaktir.
A Assemble Assembly programlarinin yazilmasini saglar.
G Go Bellekte yüklü olan bir programin çalistirilmasini saglar.
L Load Diskten bellege bir programin yüklenmesini saglar.
N Name Bellekteki program için isim seçmeyi saglar.
Q Quit Programdan çikarak isletim sistemine dönmeyi saglar.
R Register Register degerlerini görme ve degistirme.
T Trace Bellekteki bir veya daha fazla komutun çalistirilmasini saglar.
U Unassembly Assembly kodlarinin makine dili karsiliklarini almanizi saglar.
W Write Bellekteki programin diske yazilmasini saglar.
Program sistem komut satirindan debug yazilarak çalistirilabilir. Program çalistirilirken eger bir program bellege yüklenecekse bu program ismi komut satirindan verilebilir. Program çalistiginda ekranin sol tarafinda ( - ) isareti belirecektir. Bu prompt debug programinin komut almaya hazir oldugunu gösterir.
5.1.1 A Assembly Komutu
A Komutu assembly program yazmak için kullanilir. Bu komutun kullanilis sekli;
-- A [segmentffset]
seklindedir.
Komutun parametresi olan adres, yazilacak programin bellegin neresinden itibaren yerlesecegini gösterir. Parametre seçimliktir. Eger verilmeyecek olur ise mevcut CS ve IP üzerindeki degerler komutun parametresi olarak varsayilir. Komuttan sonra hiç bir parametre vermeyeceginiz gibi sadece offset adresi de verebilirsiniz. Eger komuttan sonra sadece tek bir sayi verilmisse verilen deger offset olarak algilanir ve IP registerine bu deger verilerek programin default segment ve belirlenen offset üzerinde n yazilmasi saglanir.
Komutun çalistirilmasi ile, default veya belirlenen segment ve offset adresi yeni bir satir basina yazilarak bu adresin yaninda komut girisi için beklenir. Her komut girilip enter tusuna basildiginda debug ilk önce girilen komutu yorumlar ve girile n komut dogru ise segment ve offset adresleri yazilan komut uzunlugu kadar artirilarak yeni komut girisi için beklemeye baslar. Eger girilen komut hatali ise hata yeri gösterilerek komutun tekrar girilmesi için ayni segmet ve offset adreslerinde beklenir. Eger herhangi bir satirda komut girilmeyerek enter tusuna basilirsa debug komut satirina 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 yazilirken en son girilen komutun offset adresi default offset olarak alinir. A komutundan çiktiktan sonra tekrar ayni komut kullanilirsa default segmentin son kalinan offseti ekrana getirilir. Eger programa ek yapilacaksa bu yöntem kullani labilir. Ancak herhangi bir komut degistirilecekse komuta girilirken degistirilecek satirin segment ve offset adresi verilerek girilmelidir.
A komutu ile girilen komutlar bellege pespese yerlestirilirler. Bu nedenle yazilmis bir programin degistirilmesi oldukça zordur. Eger degistireceginiz komut uzunlugu daha önce yazdiginiz komut uzunlugu ile ayni ise problemsiz bir degisim sözkonusu olabilir. Ancak yazacaginiz komut eskisinden uzun ise M komutu ile ramde yer açmak gerekir.
5.1.2. G Go Komutu
Go komutu hafizadaki bir programin icra ettirilmesi amaci ile kullanilir. Komutun formati;
- G Adres
seklindedir.
Komuttan sonra verilen Adres parametresi seçimliktir. Adres verilmez ise program CS;IP ikilisindeki degerler default olarak alinarak çalistirilir. Verilen adres her zaman programin baslatilacagi adres olarak alinir. Bu deger sadece offset olarak ve rilebilecegi gibi segmet ve offest olarak da verilebilir.
Hafizadaki herhangi bir program RET yada INT 20 komutlarindan biri ile bitmelidir. G komutu bu iki assembler komutundan birini icra ettirdiginde PROGRAM TERMINATED NORMALLY deyimi ile sona erer. Bahsedilen komutlar program icrasini sona erdirerek k omut satirina dönmeyi saglar. Herhangi bir program bu iki komuttan biri ile sona ermiyor ise makinaniz denetimsiz komutlar yüzünden kilitlenecek yada istem disi davranacaktir.
Herhangi bir programi birden fazla sayida çalistiracaksaniz ikinci ve sonraki çalistirmalarda CS:IP ikilisinin degerlerinden emin olmalisiniz. CS:IP ikilisine istediginiz herhangi bir degeri R komutu ile atayabilirsiniz.
5.1.3 L Load Komutu
L Komutu disk üzerindeki herhangi bir programin bellege yüklenmesi için kullanilir. Komutun herhangi bir parametresi yoktur. Komut N komutu ile ismi belirlenmis bulunan programi bellege yükler.
5.1.4 N Name Komutu
N Komutu, L veya W komutu için dosya ismi seçmekte kullanilir. Komutun kullanim sekli;
- N Dosya Adi
seklindedir.
Name komutu Load ve Write komutlarindan önce kullanilarak diskten çagrilacak yada diske yazilacak dosyanin adini belirlemekte kullanilir.
5.1.4 Q Quit Komutu
Komut debug programini sonlandirir.
5.1.5 R Register Komutu
Komut CPU registerlerinin degerlerini görmek yada degistirmek için kullanilir. R komutunun kullanim biçimi asagida verilmistir.
- R Register Adi
Komut registerlerin kullanimi ile ilgili olmak üzere 3 ayri görevi yerine getirir.
R : Komut tek basina kullanilirsa CPU registerlerinin o anki tüm degerleri gösterilir. Registerlerin yanisira komut Flag registerinin degerlerini de temsili olarak gösterecektir. Komutun kullanimi sonunda CS:IP ile isaret edilen komut da ekranda göste rilecektir. R komutunun kullanimi sonunda asagidakine benzer bir görüntü alincaktir.
- 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 degerleri disindaki tüm registerler daha önceki bölümlerde anlatilmisti. Yukaridaki degerler Flag registerinin temsili gösterimidir. Bu registerin alabilecegi degerler asagida gösterilmistir.
FLAGLAR
Overflow
Direction
Interrupt
Sign
Zero
Auxiliary Carry
Parity
Carry
BIT SET (1)
OV
DN
EI
NG
ZR
AC
PE
CY
BIT RESET (0)
NV
UP
DI
PL
NZ
NA
PO
NC
2. R komutundan sonra parametre olarak F harfi kullanilirsa program flaglarin degistirilmesi için mevcut flaglari ekrana getirir ve istediginiz flaglari degistirmeniz için bekler. Bu durumda istediginiz herhangi bir flagi set yada reset edebilirsiniz.
- R F
NV UP EI PL NZ NA PO NC - ZRUP
-
Yukaridaki örnekte Zero flagi SET, direction flagi RESET edilmektedir.
3. R komutu ile sadece flaglarin degil tüm registerlerin degerleri degistirilebilir. Bunun için R komutundan sonra degistirilmesi istenen registerin isminin yazilmasi gerekir. Bu islem gerçeklestiginde registerin mevcut degeri ekrana yazilir ve ( : ) is areti konularak registerin yeni degeri sorulur. Bu isaretin yanina deger 4 digit hexadecimal olarak verilmelidir. Eger bir deger verilmeyip enter tusuna basilirsa registerin içerigi degistirilmeyecektir.
5.1.6 T Trace Komutu
Trace komutu hafizada bulunan bir programin satirlarinin tek tek veya belli bir kisminin çalistirilmasi için kullanilir. Komutun kullanimi asagida verilmistir.
- T=Adres Deger
Komutun parametreleri seçimliktir. Ilk parametre Adres parametresidir ki bu parametre kullanilacaksa komuttan sonra = isaretinin kullanimi zorunludur. Adres parametresi icra ettirilecek ilk komutun adresi olarak alinir.
Deger parametresi kaç adet komutun pespese icra ettirilecegini gösterir. Eger kullanilmamis ise bu deger 1 olarak alinir. Eger herhangi bir parametre kullanilmaz ise komut CS:IP ile adreslenen yerden baslayarak 1 komut icra ettirilir ve komutun icr asindan sonra registerlerin degeri ve islenecek olan komut ekranda görüntülenir.
5.1.7 U Unassembly Komutu
U Komutu bellekteki programin makine dili ve assembly karsiliklarini ekranda listelemek için kullanilir. Komutun kullanim sekli asagida verilmistir.
- U Adres1 Adres2
Parametre olarak verilen Adres1 listelenmek istenen programin baslangiç 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 anlamsiz bir liste olacaktir.
Ikinci verilen parametre listelemenin sonunu belirler. Burada verilecek adres offset niteliginde olmalidir. Segment Adres1’de belirtilen segment adresi olarak alinacaktir.
Ö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 programin bir blok seklinde diske program olarak yazilmasini saglar. Komutun kullanim sekli;
W Adres
seklindedir.
komuttan sonra verilen adres diske kaydedilecek programin baslangiç adresidir. Eger bu parametre verilmezse 0100 offseti default olarak kabul edilir. Diske yazilacak programin uzunlugu BX:CX register çiftinden alinir.
Komut kullanilmadan önce N komutu ile diske yazilacak programin ismi belirlenmelidir. Aksi halde diske yazma islemi default deger üzerinden yapilacaktir.
Örnek;
N Deneme.com
R BX
: 0000
R CX
: 0010
W
Writing 0010 Bytes
-
6. ASSEBLER PROGRAM YAPISI ve ILGILI KOMUTLAR
Bir program bellegi parçalara bölerek (segmentleyerek) kullanir. Assembler programlarda da yapi itibariyle bellegin segmentlere ayrilmasi ve ayrilan her bölümün ayri ayri tanimlanarak kullanilmasi esastir. Bu nedenle bir assembler programinda genel itibariyle bölüm tanimlari programin yapisini olusturur. Genellikle bir programda geçici verilerin saklandigi stack, kalici verileri saklamak için data ve program kodlarinin saklandigi code segment bölümleri yer alir. Bir assembler programinin örnek yapi si asagida verilmistir.
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, DSAT, CS:COD
....
....
ANA ENDP
COD ENDS
END
6.1 Segment Komutu
Segment komutu programin kullandigi segment kesimlerini tanimlamak için kullanilir. Program içinde tanimlanan herhangi bir segment segment registerleri tarafindan takip edilir. Tanimlanan herhangi bir segmentin hangi register tarafindan takip edil ecegi ASSUME deyimi ile tanimlanir. Komutun kullanim sekli;
isim SEGMENT tip ‘sinif’
seklindedir.
Komut bir isim ile baslar. Tanimlanan isim degisken olabilme kurallarina uygun herhangi bir harf dizisidir. Tanimlanan isim program içinde yapilacak atamalarda vb. islemlerde kullanilabilir.
Tip segmentin adreslenebilme tipini belirler. Bu deyim ile kullanilabilecek tip çesitleri;
PAGE 256 Byte ve katlariyla adreslenebilen segment
PARA 16 Byte ve katlariyla adreslenebilen segment
WORD Word ve katlariyla adreslenebilen segment
BYTE Byte ve katlariyla adreslenebilen segment
Segment anahtar cümlesi ile baslayan bir segment ENDS cümlesi ile son bulmak zorundadir.
Örnek
STK SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
STK ENDS
STK SEGMENT PAGE ‘STK’
Tanimlar
Tanimlar
STK ENDS
6.2 Assume Komutu
Mikroislemciler program içinde bellek kesimlerini takip edebilmek için en az 3 adet segment registeri kullanir. Bu registerler CS, DS, SS registerleridir. CS registeri program kodlarini takip etmek için, DS registeri program içinde sabit olarak kul lanilan verileri saklamak için, SS registeri ise program içinde kullanilan geçici verileri saklamak için kullanilir.
Program içinde belirlenen segmet kesimlerinden hangisinin hangi register ile takip edilecegi assembler derleyicisine Assume deyimi ile bildirilir. Komutun kullanim sekli,
Assume register : segment , register : segment , ........ seklindedir.
Örnek:
STK SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
STK ENDS
DATA SEGMENT PARA ‘DAT’
Tanimlar
Tanimlar
DATA ENDS
CODE SEGMENT PARA ‘CODE’
BASLA PROC FAR
ASSUME DSATA, SS:STK, CS:CODE
6.3 Proc Komutu
Proc komutu Code segment içindeki bir islem blogunun tanimlanmasini saglar. Tanimlanan bloklar bir procedure davranabilirler ve diger bloklar tarafindan CALL komutu ile çagrilabilirler. Her assembler programi içinde en az 1 islem blogunun olmasi zo runludur. ilk çalisacak olan blok segment baslangicindaki bloktur. Bu bloktan diger bloklar çagrilabilir. Eger assembler program üst düzey dillerden çagrilacak bir program ise ilk çalisacak blok çagrilan blok olacagindan segment basinda olma zorunlulugu y oktur. Komutun kullanilis sekli;
isim PROC tip
seklindedir.
isim, degisken olabilme kurallarina uymak kosulu ile istenen herhangi bir harf dizisi olabilir. PROC deyiminden sonra gelen tip FAR veya NEAR olabilir. Bu deyimler ilerideki bölümlerde detayli olarak anlatilacaktir. ilk çalisacak bölümün FAR, dige r bölümlerin NEAR olabileceginin bilinmesi bu bölüm için yeterlidir.
Proc deyimi ile baslayan herhangi bir program blogu ENDP deyimi ile sonlandirilmalidir.
Örnek:
STK SEGMENT PARA ‘STK’
Tanimlar
STK ENDS
DATA SEGMENT PARA ‘DAT’
Tanimlar
DATA ENDS
CODE SEGMENT PARA ‘CODE’
BASLA PROC FAR
ASSUME DSATA, 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 islem blogu içinden bir baska islem blogunu çagirmak için kullanilir. Komut ayni segment içindeki(Near) islem bloklarini çagirabilecegi gibi farkli segment içindeki(Far) islem bloklarini da çagirabilir. Komutun kullanilis s ekli;
CALL Çagrilan Blok Adi
Call komutunun islenmesi sirasinda mikroislemci çagrilan bloga gitmeden önce code segment içinde bulundugu adresi stack segment içine saklar ve çagrilan yere dallanir. Çagrilan blok içinde islemler sona erdikten sonra stack segmente saklanan adrese tekrar geri dönülür. Çagrilan blok içindeki islemlerin bittigi RET komutu ile belirlenir.
Ret komutu genel olarak parametresiz kullanilir ve stack segment içindeki bilginin CS:IP ikilisine aktarilmasini saglar.
7. DEGisKEN VE SABiT TANIMLAMA
Assembler program içinde herhangi bir segment kesiminde degisken tanimlamasi yapilabilir. Degisken ve sabit tanimlamalari;
* DB
* DW
* DD
* DQ
* DT
* DUP
Komutlari ile yapilir.
7.1 DB Deyimi
Byte tipi bir degiskenin veya sabitin tanimlanmasini saglar. Tanimlama byte tipinde bir alan olabilecegi gibi dizi seklinde bir alan da olabilir. Tanimlanan alan(larin) 8 bit olmasi nedeni ile bu alana 0 ile FF arasinda herhangi bir deger atanabili r. Deyimin kullanilis sekli;
degisken DB ilk deger
Tüm degisken veya sabit tanimlama deyimleri ile tanimlanan alanlara ilk deger atama islemleri tanimlama aninda gerçeklestirilir. Eger tanimlanan alana deger atanmayacak ise ilk deger olarak ? atanmalidir. Asagidaki atamalar geçerli atamalardir.
SAYI DB 30 ;ilk degeri 30 olan SAYI sabit/degiskeni
SAY DB 0AH ;ilk degeri 10 olan SAY sabit/degiskeni
ABC DB ‘ADI SOYADI’ ;ilk degeri ADI SOYADI olan karakter dizisi
DIZI DB 0,1,2,3,4,5,6,7 ;degerleri 0,1,2,3,4,5,6,7 olan byte dizisi
ilk deger atamasi sirasinda bir dizi olusturulacak ve dizinin içine belirli bir deger/degerler atanacaksa DUP deyimi kullanilir.
ABC DB 10 DUP (?) ;içerikleri olmayan 10 byte’lik bir dizi
ABC DB 50 DUP (0AH) ;içerikleri 10 olan 50 byte’lik bir dizi
ABC DB 25 DUP (0,1) ;içerikleri 0,1,0,1.... olan 25 byte’lik bir dizi
7.2 DW Deyimi
iki byte’lik bir sabit/degisken tanimlamasinin yapilmasini saglar. Deyimin kullanilis sekli;
degisken DW ilk deger
seklindedir.
MESAJ DW 1210H
SAYI1 DW ?
SAYI2 DW 10 DUP(0)
SAYI3 DW 0,0AABH,CCCAH
7.3 DD Deyimi
Dört byte’lik bir sabit/degisken tanimlamasinin yapilmasini saglar. Deyimin kullanilis sekli;
degisken DD ilk deger
seklindedir.
MESAJ DD 12100000H
SAYI1 DD ?
SAYI2 DD 10 DUP(0)
SAYI3 DD 0,0AABC12H,0H
7.4 DQ Deyimi
64 bitlik, Sekiz byte’lik bir sabit/degisken tanimlamasinin yapilmasini saglar. Deyimin kullanilis sekli;
degisken DQ ilk deger
seklindedir.
MESAJ DQ 12100000H
SAYI1 DQ ?
SAYI2 DQ 10 DUP(0)
SAYI3 DQ 0,0AABC12H,0H
7.5 DT Deyimi
Seksen bit 10 byte’lik bir sabit/degisken tanimlamasinin yapilmasini saglar. Deyimin kullanilis sekli;
degisken DT ilk deger
seklindedir.
MESAJ DT 12100000H
SAYI1 DT ?
SAYI2 DT 10 DUP(0)
Alıntıdır.
Son düzenleme: