| 
 | 
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     | Katılımcı : 4 |  | Okunma | : 10571 |  |   |   |  |   |  
 |    |   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.  |  
   |