Assembly'a genel bir bakış - Assembly Webmaster bilgi bankası, knowledge base Webmaster Araçları

AnaSayfa > Assembly > Assembly'a genel bir bakış
Kategori: Assembly
Gönderen: Admin
Tarih: 2008-10-19
Puan: 6   Puan:6 | Katılımcı:4 | Katılımcı : 4
Okunma: 9950
  
 
1 puan 2 puan 3 puan 4 puan 5 puan 6 puan 7 puan 8 puan 9 puan 10 puan

Burada yazicaklarimin ne zaman güncellenecegi tam olarak belli degil. Bakarsiniz 1 hafta sonra burada komple bir döküman bulursunuz, bir bakarsiniz 1 ay sonra bile hala ayni sayfa duruyor.Yani durum is-güç durumuna bagli..

ASSEMBLY : YAZI - 1Neyse, önce Assembly dili hakkinda birseyler.. Çogu programci makina dilinin bilgisayarlardaki en düsük programlama dili oldugunu ve makina dilinin sadece sayilardan olustugunu bilir.
NOT1: Bazi lamerlar da ikisinin ayni sey oldugunu savunur.
NOT2: Bazi lamerlar da Assembly ve Assemblerin ayni sey oldugunu savunur.
Makina dili sadece sayilardan olusur demistim.Bu sayilar aslinda 1 ve 0 lardan olusan bit degerleridir.Yani olay binary sistemdedir.Ancak kodlanmasinin kolaylastirilmasi için hexadecimal sayi sisteminde de kodlama yapilabilir.Assembly ise makina dilindeki bu oldukça zor olan kodlama islemini kolaylastirmak için çikarilmis bir dildir. Assembly dilindeki tüm komutlar MOV, IN, XOR, OR ,AND vs vs kelime ve(ya) kisaltmalardan olusur. Assembly dilinin özelligi basit çevirmelerle makina diline dönüstürülebiliyor olmasidir.Mesela
XOR Ax,Ax komutunun makina dili karsiligi 31 C0 'dir.Ya da Ax yazmacina deger atamak için Assembly'da MOV Ax, xxyy gibi bir komut kullanirken makina dilinde bunun karsiligi B8 yy xx olacaktir.Olayi anlatabildimmi ?
Assembly programlamak için bilgisayar hakkinda bazi olaylara hakim olmak ve çok çalismak gerekir.Çünkü assembly'da olay sadece programlama mantigi ve komutlari bilmenin ötesinde Interrupt (Kesilme) servislerini de bilmekten geçer.
Neyse artik assembly olayina basliyalim.Burada önce 16 bitlik komutlara dayali olarak biseyler yazicam, sonra 32 bitlik komutlari felan da anlaticam
Assembly'da Yazmaçlar
RegisterAçiklamaAxAritmetik amaçli kullanilir, Ah (hi) ve Al (low) olmak üzere 2 adet 8 bitlik yazmaçtan olusur.BxIndeksleme islemlerinde kullanilir, Bh ve Bl olarak 2 adet 8 bitlik yazmaçtan olusur.CxSayaç yazmaci.Ch ve Cl olarak 2 adet 8 bitlik yazmaçtan olusur.DxData yazmaci.Dh ve Dl olarak 2 adet 8 bitlik yazmaçtan olusur. Genelde veri adreslerinin gösterilmesinde kullanilir.SiKaynak indeksini göstermek için kullanilir.DiHedef indeksini göstermek için kullanilir.CsKod segmenti.DsVeri segmenti.EsEkstra segmentSsStack (yigit) segmentiSpStack (yigit) göstergeciBpTaban göstergeciIpKomut göstergeci.Bu yazmaç teorik olarak vardir.Asla bir assembly programinda kullanilamaz.Çalistirilan komutun Cs (Kod segmenti) içindeki ofsetini gösterirSegment,ofset,Bit,Byte,Word, DoubleWord, QuadWord , paragraf deyimleriyle ilgili biseyler söylemeyecegim.Biliyorsunuzdur diye onlari geçiyorum.(Bunlari bilmiyorsaniz hiç düsünmeden ALT+F4 olayina girin ve bir kitapçidan "BiLGiSAYAR ÖGGRENiYORUM" türü bir kitap alin).
Assembly'da Deger Atama
Assembly'da bir degiskene deger atamak için MOV (Böylece ilk asm komutunu ögreniyoruz :) kullanilir.Mesela Ax yazmacina 5 degerini atamak için MOV AX,0005 komutu kullanilir.Yani
Basic'de AX=5 , Pascal'da AX:=5 seklinde yazdigimiz satir Assembly'da MOV AX,0005 olacak.
Aritmetik Islemler
TOPLAMA
BASICPASCALASSEMBLYAX=5 BX=10 BX=BX+AXAX:=5; BX:=10; BX:=BX+AX;MOV AX,0005 MOV BX,0010 ADD BX,AXÇIKARMA
BASICPASCALASSEMBLYAX=5 BX=10 BX=BX-AXAX:=5; BX:=10; BX:=BX-AX;MOV AX,0005 MOV BX,0010 SUB BX,AXÇARPMA
BASICPASCALASSEMBLYAX=5 AX=AX*12AX:=5; AX:=AX*12;MOV AX,0005 MOV CL,12 MUL CLBÖLME
BASICPASCALASSEMBLYAX=5 AX=AX/12AX:=5; AX:=AX DIV 12;MOV AX,0005 MOV CL,12 DIV CLAssembly'da çarpma ve bölme islemleri Basic, Pascal veya C'ye göre biraz farkli olarak yapilir.Eger çarpma/bölme islemi 16 bitlik olarak yapilacaksa çarpilan veya bölünen sayi AX yazmacina konur.CL gibi 8 bitlik bir yazmaca çarpan/bölen konur.Çarpma yapmak için MUL, bölme için DIV komutu kullanilir.Eger islenecek sayi 32 bitlik ise DX:AX çifti kullanilir.Bu takdirde de 8 bitlik degil 16 bitlik bir yazmaç kullanilmasi gerekir.Çarpma yapiyorsak sonuç DX:AX çiftinde bulunur, bölme yapiyorsak bölüm DX yazmacinda kalan da AX yazmacinda bulunur.
;128F45FA sayisini C43A sayisina bölelim;
MOV DX,128Fh
MOV AX,45FAh
MOV CX,0C43Ah ;Eger bölüneni 40 sayisina bölmek isteseydik MOV CX,0040h yazacaktik
DIV CX
BASIC ve PASCAL'DAKI BAZI KOMUTLARIN ASSEMBLY KARSILIKLARI
BASICPASCALASSEMBLYGOTOGOTOJMPOUTPORTOUTINPPORTINSWAP-XCHGIFIFCMP-SHLSHL-SHRSHR-INCINC-DECDECREM veya '{} veya (* *);Ekrana bir STRING yazdirmak
Basic'te PRINT "TurkishScene E-ZiNe, http://www.televole.com/projman" yazdirmak için Assembly'da asagidaki programi yazmaliyiz.
.Model Tiny
.Code
Org 100h
;Yukarida kalan kisim basit assembly programlari yazarken std olarak kullanacagiz
YaziYaz Proc Near
Lea Dx,Mesaj ;Mesaj etiketinin ofset adresini Dx yazmacina yükledik
Mov Ah,9 ;Interrupt 21h'in 9h altfonksiyonu; Ekrana yaz fonksiyonu
Int 21h ;Interrupt 21h'i çagirdik
Mov Ah,4ch ;Yine 21h interruptinin 4c fonksiyonu; DOS'a dönüs fonksiyonu
Int 21h
Mesaj Db "TurkishScene E-ZiNe, http://www.televole.com/projman",10,13,"$"
YaziYaz Endp
End YaziYaz
Assembly'da pek çok is asil olarak interruptlarin kullanimi ile çözülür.Bu programda 2 adet Int 21h servisini de görmüs olduk :)
Bir Interrupt çagrisinda Ah yazmaci daima fonksiyon numarasini gösterir.Buna göre;
Ah=9 Ekrana string yaz
Ds:Dx Ekrana yazilacak stringin segmentini ve ofsetini gösterir.Bu adresteki stringin sonunda mutlaka $ sembolu bulunmalidir.
Ah=4c Programi bitirerek DOS'a dön
Al Programdan çikis kodunu gösterir.(Pascaldaki HALT(x) komutundaki x degeri)
ASSEMBLY #2NOT : Bu sayfada 80x86 tipi islemciler için assembly ve makina dili anlatilmaktadir. Bu yaziyida assembly dilini ve assembly komutlarini anlatiyorum. Bu yazida bunun disinda baska birsey bulamazsiniz. Daha ileri düzeydeki bilgi için 'Programlama Üzerine' bölümündeki diger yazilarima da göz atmanizi öneririm.
Assembly ve Makina Dili
Bilgisayarlarin isleyislerine baktigimizda aslinda herseyin 2'li sayi sisteminin esas alindigi bir sistem içinde gerçeklestigini görürüz. Bu sistemde, 2 adet isaret vardir. Birinci isaret 0, ikinici sinyal ise 1 olarak tanimlanir. 0 adi verilen sinyal CPU'ya giden 0Volt degerindeki elektrik sinyalidir. Yani 0 durumunda CPU'ya herhangi bir sinyal gitmez. 1 durumunda ise CPU'nun çalisma voltajina bagli olarak +5V veya +3.3V gibi elektrik sinyalleri iletilir.
Bu sistem aslinda boolean cebiri ile alakalidir. Boolean cebirini söyle bir hatirlarsak:
ANDORXORNOT1 And 1 = 1 1 And 0 = 0 0 And 1 = 0 0 And 0 = 01 Or 1 = 1 1 Or 0 = 1 0 Or 1 = 1 0 Or 0 = 01 Xor 1 = 0 1 Xor 0 = 1 0 Xor 1 = 1 0 Xor 0 = 0NOT 1 = 0 NOT 0 = 1 Makina dili hepimizin bildigi gibi 16'lik sayi sisteminde (hexadecimal) düzenlenmis bir komut takimini içermektedir. Makina dili, 16'lik sayi sisteminde kodlanmis sayilardan olusur. Bu sayilarin her birinin bir anlami vardir. Bu sistemdeki her bir sayi yukarida bahsettigim 8 ayri isaretin bir araya gelmesinden olusur. Binary (ikili) sayi sistemindeki bu sayiyi 16'li (hexadecimal) sayi sistemine göre kodladigimizda da bir makina dili komut elde etmis oluruz. Komutlarin neye göre elde edildigi konunundaki bilgileri ilerde anlatacagim.
Assembly dili, tek bir fark disinda makina diliyle aynidir. Assembly ile makina dili arasindaki fark kodlanma biçiminden gelmektedir. Makina dilinde komutlar 16'lik sayi sisteminde yazilirken, assembly dilinde bu sayilarin yerine anlamli kelimeler kullanilmaktadir.
Bu arada pek çok kisinin düstügü bir hatadan bahsedeyim. Pek çok kisi assembly ve assembler kelimelerini yanlis olarak, ikisinin de ayni anlama geldigini düsünerek kullaniyor. Oysa assembly pascal, c , fortran gibi bir programlama dilidir. Assembler ise assembly dilinde yazilan programlarin derleyicisine verilen addir. Saniyorum ki insanlar bu hataya Turbo Pascal, Turbo C gibi bazi programlama araçlarinin içerisine dahil edilen assemby entegre aracindan dolayi düsüyor. Zira bu bu araç 'built-in assembler' veya 'inline assembler' gibi adlarla aniliyor. Built-in assembler sözü programlama dili içerisinde assembly komutlarini derleyebilecek bir derleyici oldugunu ifade eder.
Assembly dilinde yüksek programlama dillerinde oldugu gibi degisken kullanmak mümkün degildir. Bunun yerine assembly dilinde register - yazmaçlar vardir. Yazmaçlar 8,16,32.. bit degerinde sayi tutabilen degiskenlerdir.
8 bitlik yazmaçlar: Ah, Al, Bh, Bl, Ch, Cl, Dh ve Dl
16 Bitlik yazmaçlar: Ax, Bx, Cx, Dx, Si, Di, Bp, Sp, Cs, Ds, Es, Ss
32 Bitlik yazmaçlar: Eax, Ebx, Ecx, Edx, Esi, Edi, Ebp, Esp, Gs, Ts, Fs, Dr0, Dr1, Cr0, Cr1
Yazmaçlar arasinda bazi iliskiler vardir. Ancak bunlardan bahsetmeden önce yazmaçlarin genel kullanim amaçlarindan bahsetmek istiyorum.
Ax: Aritmetik islemlerde kullanilan genel yazmaç
Bx: Taban göstermek için kullanilan genel yazmaç
Cx: Sayi sayma amaciyla kullanilan genel yazmaç
Dx: Veri adreslerini göstermek için kullanilan genel yazmaç
Si: Kaynak indeksi göstermek için kullanlan yazmaç
Di: Hedef indeksi göstermek için kullanilan yazmaç
Bp: Taban göstergeç yazmaci
Sp: Stack (yigin) göstergeci
Cs: Kod segmenti
Ds: Data (veri) segmenti
Es: Ekstra segment
Ss: Stack (yigin) segmenti
Yukarida verdigim 16 bitlik yazmaçlardan Ax, Bx, Cx ve Dx yazmaçlarin iki parçalari vardir. Örnegin Ax yazmaci 8 bitlik Ah ve Al yazmaçlarindan olusur. (Ax=AhAl, Bx=BhBl ...)
32 bitlik yazmaçlarda ise durum biraz daha degisiktir. Örnegin Eax yazmaci da iki bölümden olusur. Ancak Eax yazmacini iki ayri 16 bitlik yazmaç ile olusturamayiz. Ax yazmaci Eax'in düsük kismidir. Bu olayi su sekilde anlatayim
Eax=12345678h degeri tasiyorsa Ax=5678h'dir. Ancak Eax yazmacinin 1234h kismini herhangi bir yazmaç ile elde edemeyiz.
Assembly ile program yazarken bazi önemli noktalari gözönünde tutmak gerekir. COM uzantiya sahip olan programlarin 64Kb'dan daha büyük dosya boyuna sahip olmayacaklari varsayilir ve bu husus gözönünde tutularak yazilirlar. Eger programiniz 64Kb'dan büyük olacaksa mecburen EXE program olacak sekilde programi yazmalisiniz. Bu konudaki bir diger husus ise programin çalisacagi platform. Eger Windows ortaminda çalisacak bir program yazacaksaniz, programinizin EXE olacak sekilde tasarlanmasi gerekir.
COM uzantili programlar yukarida da bahsettigim gibi 64Kb'tan daha büyük olamazlar. Bu kisitlamanin sebebi, COM uzantili bir programin bir segment içerisine yerlestirilmesidir. Ayrica COM uzantili programlar daima CS:0100h adresinden itibaren çalistirilmaya baslanirlar. EXE uzantili programlar için bu tür sorunlar yoktur. Program uzunlugu konusunda herhangi bir kisitlama yoktur (Aslinda kisitlama vardir ama bu kadar uzun program yazmaya gereksinim duyulmaz). Ayrica programin çalistirilma adresi istendigi gibi belirlenebilir.
Bu yazi çerçevesinde öncelikle COM uzantili programlar yazmayi görecegiz. Burada bulacaginiz kaynak kodlari Borland (yeni adiyla Inprise) firmasinin ürünü olan Turbo Assembler ile derlenebilecek sekilde olacaktir.
Adresleme:
Assembly dilinde adresleme islemi genel olarak iki komut ile yapilmaktadir. Birincisi MOV komutu ikincisi ise LEA komutudur. MOV komutu her türlü adresleme isleminde kullanilabilen bir komuttur. LEA komutu ise sadece efektif adreslemelerde kullanilir. Bu iki komutun kullanimi su sekildedir.
MOV Ah,09
MOV Ax,1234h
gibi bir komut sonucunda birinci deger ikincisine esitlenir. Ilk komutun sonucu Ah=09 ikinci komutun sonucu Ax=1234h olur. Ancak MOV 1234h,Ax veya MOV Ah,1234h gibi bir komut kullanilamaz.
MOV Ax,Bx
Mov Ax,Es
Mov Ah,Dl
Mov Ds,Ax
Burada gördügünüz islemlerde de ikinci yazmaçta tutulan sayi birinci yazmaca aktarilir. Mesela Ax=8888h olsun. MOV Bx,Ax komutundan sonra Bx=8888h olacaktir.
Mov Ah,Bx
Mov Es,Dl
Mov Ds,Ah
Bu tür komutlar da kullanilamaz. Ayrica MOV CS,AX gibi CS'yi degistirmeye yönelik komutlar günümüzde kullanilmayan komutlardir.
MOV Al, Byte Ptr Ds:[5C12h]
Mov Cl, Byte Ptr Es:[Si+50h]
MOV Ax,Word Ptr Ds:[1000h]
MOV Cx,Word Ptr Ds:[Bx+50h]
Mov Ax,Word Ptr Cs:[Bx+Si]
Mov Ax, Word Ptr Ds:[Bx+Si+10h]
Mov Eax, dword Ptr [Esi+5]
Yukarida gördügünüz komutlar ise mesela MOV Ax,Word Ptr Ds:[1000h] komutu Ds segmentinin 1000h ofsetinde bulunan word degerini Ax yazmacina aktarmaktadir. [] içerisinde gösterilen degerler bu degerin bir adresi ifade ettigini gösterir ve birinci yazmaca bu adresten okunan deger aktarilir.
MOV Al, Word Ptr Ds:[Si+50] gibi bir komut geçersiz bir komuttur.
MOV Word Ptr Ds:[Si+60h],Ax
MOV Byte Ptr Es:[Bx],Cl
MOV Dword Ptr Es:[Bp+10h],Eax
Bu komutlar da yukari anlattigim olayin tam tersi.
MOV Dx, Offset Etiket
MOV Bx, Offset Veri
Bu tür bir adresleme, programin içinde tanimlanan bir etiketin ofsetini belirtilen yazmaca yüklemek için kullanilir. Ayni is LEA (Load Effective Address) komutu ile de yapilabilir. ise LEA yazmaç, etiket biçiminde kullanilir.
LEA Dx, Mesaj = MOV Dx, Offset Mesaj
INTERRUPTLARIN ÇAGRILMASI:
Interrupt çagirimi için INT xx komutu kullanilir. Burada xx çagrilacak interruptin numarasidir.Örnegin Int 20h programlarin sonlandirilmasi amaciyla kullanilmaktadir. Int 21h ise DOS'un sundugu çesitli islemleri içeren bir interrupttir.
Ilk assembly programimizi yazabilmek için bir DOS interrupt servisi olan Int 21h Servis 09'u bilememiz gerekiyor.
Int 21h Servis 09h : Bu servis ekrana bir metin yazdirmak için kullanilir. Yazdirilacak metin $ isareti ile sonlandirilmalidir.
Ah=09h
Ds:Dx=Ekrana yazdirilacak metnin segmenti ve ofseti
SABIT VERILERIN PROGRAM KODUNA EKLENMESI
Sabit verileri program koduna eklemek için bir etiket ve ardindan gelen Db, Dw, Dd gibi ifadeler ile sabit veri girilir. DB verinin byte türü oldugunda, DW verinin word türü oldugunda DD ise verinin double word oldugu durumda kullanilir.
Mesaj DB "ILK PROGRAMIM$"
Sayac Dw 0000h
Imza DD 1122334455667788h
Veri Db 10h,45h,22h,77h
Bilgi Dw 1234h,5432h
Ilk assembly programi
Ilk assembly programimiz tahmin edebileceginiz gibi bir "Merhaba Assembly!" programi olacak. Iste programin kodu!
.Model Tiny
.Code
Org 100h
IlkProgram Proc Near
Mov Ah,09h
; COM uzantili programlarda CS=DS=ES olmaktadir.
; Bu yüzden DS'yi tanimlamamiza gerek yoktur.
Lea Dx,Mesaj
Int 21h
Int 20h
Mesaj Db "Merhaba Assembly!",10,13,"$"
IlkProgram Endp
End IlkProgram
Assembly ve Sikça Kullanilan Komutlar
Simdi de size en sik kullanilan assembly komutlarindan bahsedecegim. Daha önce INT, MOV komutlarindan bahsetmistim. Assembly komutlari sadece burada anlatacagim kadar degil. Daha sonra bütün assembly komutlarini detayli olarak anlatacagim.
Stack (Yigin) Islemleri
Ilk yazida bahsettigim gibi assembly dilinde register - yazmaçlar kullanilir. Genellikle yazmaçlar programcinin degisken ihtiyacini karsilayamazlar. Bu yüzden yazmaçlardaki verilerin geçici olarak saklanmasina olanak saglayan stack islemleri kullanilir. Stack Alani SS:SP çifti ile belirtilir. Bu adresten baslayarak stack alanina gömülen her veri ile SP degeri gömülen verinin uzunlugu kadar azaltilir. Veriler stackten geri alinirken de SP degeri ayni sekilde arttirilir.
Stack islemleri genel olarak PUSH ve POP komutlariyla yapilir. PUSH komutu stacke veri gömer, POP komutu ise stackten veri alir. PUSH ve POP komutlari ile beraber kullanilan islenen deger(ler)in ayni olmak gibi bir zorunlulugu yoktur. Mesela PUSH AX komutu ile gömülen AX yazmacindaki word degeri POP DX komutu ile stackten alinabilir.
PUSH AX
PUSH CS
PUSH [DI]
PUSH [100h]
POP AX
POP DS
POP [DI]
seklinde kullanilabilir. Kodlama kolayligi olmasi açisindan ayni anda iki deger (Mesela PUSH AX BX gibi) bir kullanim ile stacke gömülebilir. Bu kolaylik POP BX AX komutunda da geçerlidir.
Stack islemlerinde dikkat etmek gerekn önemli bir nokta vardir. Eger bu noktaya dikkat edilmez ise istediginiz yazmaca istediginiz degeri yükleyemezsiniz. Stack alaninda FILO (First in Last Out - Ilk giren son çikar) kurali geçerlidir. Stacke ilk gömülen deger en son geri alinabilir.
PUSH AX
PUSH BX
PUSH CX komutlariyla stacke gömülen AX BX ve CX yazmaçlarini ayni sekilde geri alabilmek için
POP CX
POP BX
POP AX komutlari kullanilmalidir.
DIKKAT: POP CS komutu tipki MOV CS,.... komutunda oldugu gibi günümüz islemcilerinde olmayan eski bir 8088 komutudur. Bu sebeple bu komutun kullanilmasi programin isleyisini bozacaktir.
PUSHA : Tüm yazmaçlardaki degerleri stacke gömer.
POPA : Stackten tüm yazmaçlara veri yükler.
PUSHF: ,Bütün 16 bitlik isaret degerlerini stacke gömer.
POPF: 16 bitlik isaret yazmaçlarini stackten geri yükler
XCHG Komutu
Kaynak ve hedefin yerlerinin degistirlmesinde kullanilir.
XCHG AX,BX
XCHG AL,CH
XCHG CL, DATA
LDS ve LES komutlari
Her iki komutta 32 bitlik adres yüklemek için kullanilir. Verilen adresteki veriyi belirtilen yazmaca, arkasindan gelen 16 bitlik veriyi de LDS komutu kullanilmis ise DS yazmacina LES komutu kullanilmis ise ES yazmacina yükler.
LES BX, DWORD PTR DS:ADRES
LDS DX,DWORD PTR CS:TABLO
LAHF ve SAHF komutlari
LAHF komutu AH yazmacindaki degeri isaret yazmacina aktarir. SAHF komutu ise isaret yazmacini AH yazmacina yükler.
ADD komutu
Iki sayiyi toplamak için kullanilan bir komuttur.
ADD AX,10
ADD CX,DX
ADD WORD PTR ES:[SAYAC],1
ADD AL, BYTE PTR DS:[155h]
ADC Komutu
ADD komutuna benzer bir sekilde çalisir. Ancak toplama islemine bir carry flag (tasma isareti)ni de dahil eder.
Carry Flag =1 ise ; ADC AX,10 komutu ADD AX,11 ile esdegerdir.
Carry Flag =0 ise ; ADC AX,10 komutu ADD AX,10 ile esdegerdir.
INC komutu
Belirtilen islenen degerini 1 arttirir.
INC AX
INC CL
INC BYTE PTR CS:[SAYAC]
SUB ve SBB Komutlari
Bu iki komutta çikarma islemi yapmak için kullanilir. Ancak SBB komutu çikarma islemine carry flagi de dahil eder.
Carry Flag =1 ise; SBB AX,5 komutu SUB AX,6 ile esdeger olarak
Carry Flag =0 ise; SBB AX,5 komutu SUB AX,5 ile esdeger olarak çalisir.
Çikarma islemlerinde ilk SUB AX,100h komutu AX yazmacinin degerini 100h azaltirken SUB 100h,AX seklinde bir komut kullanilamaz. Bütün assembly islemlerinde yapilan islemin sonucu birinci olarak ifade edilen adrese/yazmaca aktarilir. Bu yüzden yazilan assembly komutlarinda ilk olarak sayi yazilamaz.
5000h gibi bir sayidan AX yazmacindaki bir sayiyi çikarmak için önce NEG AX komutu ile AX yazmacindaki sayinin binary sisteme göre tersini almali daha sonra da AX yazmacina 5000h sayisini ( ADD AX,5000h ) eklemeliyiz.
DEC Komutu
Belirtilen islenen degerini 1 azaltir.
DEC BX
DEC CL
DEC BYTE PTR [SAYI]
CMP Komutu
Assembly dilinde karar verme islemlerinde kullanilan bir komuttur. Komut su sekilde çalismaktadir. Örnegin CMP AX,BX komutu AX sayisindan BX sayisini çikarir. Sonucun 0'dan büyük, küçük veya esit olmasina göre isaret yazmaçlarini degistirir. CMP komutunun çalistirilmasi sonrasinda yazmaçlarda herhangi bir deger degisikligi olmaz.
CMP AH,02
CMP AX,4000h
CMP CX,DX
CMP WORD PTR DS:DATA, AX
MUL ve IMUL komutlari
MUL komutu isaretsiz sayilarin, IMUL komutu ise isaretli sayilarin çarpilmasinda kullanilir.
DIV ve IDIV Komutlari
DIV komutu isaretsiz sayilarin bölünmesinde, IDIV komutu ise isaretli sayilarin bölünmesinde kullanilir. Her iki komutta da tek islenen bulunur. Ikinci islenen birinci islenenin 1 byte veya 2 byte olmasina göre degisir. Islenen iki bayt ise DX:AX çifti kullanilir. Islem sonucunda AX yazmacinda bölüm hanesindeki sayi, DX yazmacina ise kalan hanesindeki sayi konulur. Islenenin 1 byte oldugu durumda ise sadece AX yazmaci islenene bölünür. Islem sonucu bölüm AL yazmacinda kalan ise AH yazmacinda bulunur.
DIV AX
DIV CL
IDIV BYTE PTR CS:BOLEN
AND, OR ve XOR komutlari
Bu üç komutta mantiksal islemler için kullanilmaktadir.AND komutu mantiksal ve, OR komutu mantiksal veya, XOR komutu ise mantiksal dislamali veya islemleri için kullanilir.
AND AX,BX
AND AX,11001011b
OR CX,5
XOR AX,WORD PTR DS:[VERI]
OR WORD PTR DS:[BX],11100001b
SAL, SAR SHL ve SHR Komutlari
SAL, aritmetik sola kaydirma, SAR aritmetik saga kaydirma, SHL mantiksal sola kaydirma, SHR mantiksal saga kaydirma islemi yapan komutlardir.
SAL CX,1
SAR DL,AL
SHL CX,3
SHR BL,2
JMP ve J? (Kosullu transfer) Komutlari
Program akisini degistirmek için kullanilan bir komuttur. Bu komutun sonucu olarak IP yazmacinin degeri degisir.
DONGU:
...
...
JMP DONGU
JA>CF=0 ve ZF=0JAE, JNB, JNC=>CF=0JB, JC, JNAE<CF=1JBE, JNA<=CF=1 ve ZF=1JCCF=1JCXZCX=0JE, JZ=ZF=1JG, JNBE, JNLE>ZF=0 ve SF=OFJGE, JNL=>SF=OFJL, JNGESF<>OFJLE, JNGZF=1 ve SF<>OFJNE, JNZZF=0JNOOF=0JNSSF=0JOOF=1JP, JPEPF=1JPOPF=0JZ Label01
JC Hata
CALL, RET ve RETF Komutlari
CALL komutu JMP komutuna benzer bir sekilde çalisir. Bu komut önce kullanilan CALL komutunun NEAR veya FAR olmasina göre CALL NEAR komutunda bir sonraki komutun ofsetini, CALL FAR komutunda da bir sonraki komutun ofsetini ve segmentini stacke gömer. Bu islemden sonra programin akisi belirtilen adrese yöneltilir.
RET komutu stackten IP adresi yerine konacak wordu alir ve program akisini bu adrese yönlendirir. RETF komutu da stackten CS:IP yazmaçlarini alarak bu program akisini bu adrese yönlendirir.
Bu islemleri daha basit olarak söyle de ifade edebiliriz: CALL NEAR komutu ile gidilen bir adresten RET komutu ile, CALL FAR komutu ile gidilen bir adresten RETF komutu ile geriye dönülür.
CALL NEAR 0110
CALL FAR 1480:019F
CALL NEAR ADRES
CALL FAR DWORD PTR CS:ADRES
LOOP, LOOPE ve LOOPNE Komutlari
LOOP komutu assembly dilindeki döngü islemlerinde kullanilir. Bu komutun isleyisi için CX yazmaci sayaç olarak kullanilir. Döngünün her adiminda CX yazmacinin degeri 1 azaltilir. CX=0 oldugu anda döngü sona erer. Loop komutundan sonra belirtilen adres döngünün gerçeklestirilecegi adrestir. LOOPE veya LOOPNE komutlarinda ek olarak ZF (zero flag) de kontrol edilir. LOOPE komutunda bir önceki islem sonucu ZF=1 ise, LOOPNE komutu da bir önce gerçeklesen islemin sonucu ZF=0 olmasi durumunda transferi gerçeklestirir.
MOV CX,10
DONGU:
MOV AH,02
MOV DL,7
INT 21h
LOOP DONGU
Bu programin pascal dilindeki karsiligi ise sudur: For Cx:=10 Downto 1 do Write(#7);
CLD: Bu komut DF (direction flag) yön isaretini sifirlamak için kullanilir. (DF=0)
STD: Bu komut DF (direction flag) yön isaretini set etmek için kullanilir. (DF=1)
CLC: Bu komut CF (carry flag) tasima isaretini sifirlamak için kullanilir. (CF=0)
STC: Bu komut CF (carry flag) tasima isaretini set etmek için kullanilir. (CF=1)
CMC: Bu komut CF (carry flag) tasima isaretini ters çevirir.
REP öneki
Kendisinden sonra gelen komutun CX yazmacindaki deger kadar tekrar edilecegini bildirir.
MOVSB ve MOVSW Komutlari
MOVS? komutlari DS:SI adresindeki veriyi ES:DI adresine tasimak için kullanilir. MOVSB komutu byte olarak tasima yaparken MOVSW komutu word olarak tasima yapar.
CMPSB ve CMPSW Komutlari
CMPS? komutlari DS:SI adresindeki veri ile ES:DI adresindeki veriyi karsilastirmak için kullanilir. CMPSB komutu byte olarak CMPSW komutu word olarak karsilastirma yapar. Karsilastirma sonucu Jx komutlari ile kontrol edilir.
LODSB ve LODSW Komutlari
LODSB komutlari DS:SI adresindeki bayti AL yazmacina, LOSDW komutu DS:SI adresindeki wordü AX yazmacina yükler.
STOSB ve STOSW Komutlari
STOSB komutu AL yazmacindaki bayti, STOSW komutu ise AX yazmacindaki wordü ES:DI adresine yükler.
Karakter Dizilerinin Transfer Edilmesi ve Karsilastirilmasi
Karakter dizilerinin transferinde kullanilan yol asagidaki gibidir.
MOV DS,Kaynak Verinin Segmenti
MOV SI, Kaynak Verinin Ofseti
MOV ES,Hedef Verinin Segmenti
MOV DI, Hedef Verinin Ofseti
MOV CX, Koplayalanacak byte/word sayisi
CLD
REP MOVSB veya MOVSW
Karsilastirma islemlerinde ise asagidakine benzer bir kod kullanilabilir.
MOV DS,Kaynak Verinin Segmenti
MOV SI, Kaynak Verinin Ofseti
MOV ES,Hedef Verinin Segmenti
MOV DI, Hedef Verinin Ofseti
MOV CX, Koplayalanacak byte/word sayisi
CLD
REP CMPSB veya CMPSW
Jx Kosulun saglanmasi halinde gidilecek adres
Program yazmakta kullanilmasi gereken diger bazi komutlar
EQU Deyimi: Bu deyim bir sabite bir deger atamak için kullanilir. EQU deyimi ile yapilan atamalar programin kodlanmasinda kolaylik saglarlar. Örnegin her defasinda WORD PTR DS:[SI+BX+10h] yazmak yerine SIBX EQU WORD PTR DS:[SI+BX+10h] yazariz. Bu islemden sonra MOV AX, WORD PTR DS:[SI+BX+10h] kullanmamiz gereken yere MOV AX,SIBX yazarak isimizi kisaltabiliriz. Benzer kullanima sahip olan = isareti de kullanilabilir. Ancak EQU ve = arasinda bir fark bulunmaktadir. EQU ile yapilan bütün tanimlamalar daha sonra program içerisinde degistirilebilir. Oysa = isareti ile yapilan tanimlamalari daha sonradan degistirme imkani yoktur.
SEGMENT Deyimi: Bir segmentin basinin ve sonunun ifadesinde kullanilir.
isim SEGMENT [Sira Tipi] [Birlesme Tipi] ['sinif']
....
....
isim ENDS
ASSUME Deyimi: Segemnt yazmaçlarinin isimlerinin belirlenmesinde kullanilir.
ASSUME Segemnt Yazmaci : isim [ , ....]
PROC Deyimi: Bir prosedür tanimlar. Prosedürün CS içerisinde olup olmamasina göre, CS segemnti içindeyse NEAR, disindaysa FAR ifadeleri de eklenir.
Prosedür adi PROC NEAR veya FAR
....
....
Prosedür adi ENDP
ORG Deyimi: Programin bellege yüklenecegi adresi belirtmek için kullanilir.
ORG Adres
END Komutu: Assembly programinin sona erdigini ve programin belirtilen adresten itibaren çalismaya baslayacagini ifade eder.
END Adres
Turbo Assembler ile derlenecek programlar için bir sablon
.MODEL TINY
.CODE
ORG 0100H
BASLA:
;Bu araliga assembly programinizi yazabilirsiniz.
END
END BASLA



Yorumlar
Henüz Kimse Yorum Yapmamış, ilk yorumu siz ekleyin!
Yorum Ekleme Aparatı
Yorum Eklemek için lütfen sol menuden giris yapınız..
Toplam 0 yorum listelendi.