. . .
Aktüel Yaşam  
Geri Git   Aktüel Yaşam > BiLGiSAYAR > Programlamacılık konusunda çalışmalar ve sohbetler

Programlamacılık konusunda çalışmalar ve sohbetler Tüm programlama dilleri, anlatımlar, dersler, örnekler, kodlar


Yanıtla
 
Bu Linki Paylaş (2) Araçlar Konuyu Puanla: Konu Reytingi: 3 oy, 4.33 averaj. Mod Seç
Eski 10-06-2007, 01:15 AM
Chucky kullanıcısının avatarı
En Yakısıklı en €sprili€n Çapkın Üy€
 
Giriş Tarihi: Oct 2006
Yaş: 22
Mesajlar: 1,051
Beğenilmeyenler: 0
6 mesaj 6 kez beğenilmemiş
Teşekkürler: 88
400 Mesaja 908 kez teşekkür
İtibar Gücü: 100
Chucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsun
Assembly Dersleri


ASSEMBLY PROGRAMLAMA DİLİ (BÖLÜM-1)


GİRİŞ :

Evet arkadaşlar Bismillah diyerek başlıyoruz Assembly dilini çok iyi bilen biri olarak DEĞİL , ÖĞRENEN biri olarak anlattım ve mümkün olduğu kadar açıklayıcı ve basite indirgemiş şekilde anlatmaya çalıştım, çünkü bu makaleyi programlamayla iyi bir şekilde uğraşan arkadaşlar la beraber programlamayla amatör şekilde uğraşan arkadaşlarımız da okuyacaktır.Bu nedenle oldukça basit bir şekilde anlatım yaptığıma inanıyorum.Aynı zamanda hiç programlama bilgisi olmayan arkadaşlarda bu yazıyı okuyacaklardır ,fakat “Bu da ne böyle ,bu nasıl dildir”diyeceklerine de eminim J Ama tekrar yapılarak ve azimle onlarında öğreneceğinden eminim.Bu makalenin sonunda uzman bir assembler programcısı olacağınızı elbette ki söyleyemem ,fakat assembly hakkında çok şey öğreneceğinizden ve Ergenekon üstadın akademisinden de bu makaleyi okuyarak çok daha fazla istifade edeceğinizden de eminim.Assembly biraz karmaşık gibi görünebilir,çünkü makinenizin yani bilgisayarınızın anladığı asıl dil bu diyebiliriz.Diyebiliriz diyorum çünkü aslında CPU yani işlemciniz Binary sayılar dediğimiz ikili sayı ( 1 ve 0 ) sisteminden başka bir dilden anlamaz.Bu sayıları ve dönüşümlerini ileriki konularda anlatacağım zaten bu nedenle üstünde durmuyorum.
Aslında üst düzey hangi programlama dilini kullanırsanız kullanın ,hepside sonunda kullandığınız prog.dilinin compiler’i (derleyici) tarafından makine diline çevrilir. Yani 1ve 0 (sıfır)’ lara .1’in mantığına “akım var”, 0 ‘ın mantığı’na da “akım yok” diyebiliriz,kısaca makine bu dilden anlar, ve yine kısaca makineler aptaldır ama çok seri ve hızlıdırlar diyebiliriz. O zaman neden assembly öğrenmeyesiniz ki? Evet dersimize geçiyoruz .

ASCII :
Arkadaşlar bir byte ile temsil edilen harfler için kullanılan en yaygın ASCII (Ameri can Standard Code for Infırmation Interchange) kod standardıdır. Herhangi bir *.exe dosyasına debugger (editor) ile baktığınız zaman ,o dosyanın içerisinde bir çok karmakarışık semboller ,işaretler ve karakterler görürsünüz.Bunlar Ascii kod karakter setinde ki rakamlara karşılık gelen harfler veya sembollerdir.Ascii tüm ülkelerde standart hale getirilmiş kod setleri olup,sizin kullandığınız bilgisayarlarda ve cep telefonlarında da bu standart kodlar kullanılır.Bu kodlar 0-255 arası değişik karakterlere ,harflere ve sayılara sahiptir.Mesela bizim kullandığımız 1 rakamını karşılığı Ascii 33 ‘tür.Büyük harfler 65 ‘den başlar ,küçük harflerde 97 ‘den başlayıp 122 ‘ye kadar devam eder.Aşağıda ki,

Sayılar: Harfler:
32=0 65=A 97=a
33=1 66=B 98=b
34=2 67=C 99 =c
35=3 68=D 122=z

gibi örnekler verebiliriz.Bunların dışında kalan karakterler ise değişik sembolleri ( ?,*,-,!,é,+) ve sesleri(Beep sesi mesela) ve ayrıca satır başı,boşluk karakteri gibi işlerin karşılığıdır.

BINARY (İKİLİ SAYI SİSTEMLERİ ):

Arkadaşlar yazıya başlarken makinelerin aslında 1 ve 0 (sıfır) dan başka bir şeyi anlamadığını söylemiştik.Çünkü makineler devrelerinde akım geçer veya geçmez mantığını kullanır.Dolayısıyla 1 için “akım vardır”,0 içinse “akım yoktur” deriz.Veya 1 için Açık,0 için Kapalı diyebiliriz.İşte bu 1 ve 0 ların her birine bit ,bu bitlerin 8 tanesinin bir araya gelip oluşturdukları gruba da bayt diyoruz arkadaşlar.Görüldüğü gibi 1 ve 0 dan oluşan sadece 2 tane sayımız var ,işte bu nedenle bu sayılara da Binary (ikili sayılar) deniyor.CPU da yani mikro işlemcide birçok işlemlerini bu bitler üzerinde yapar.Bu kısa tarifleri yeterli bularak bunlarla yapılan işlemlere geçiyorum.
Binary sayılar 0-255 arası değer alırlar.
00000000=0 11111111=255 (Ascii değer de 255 değer alıyordu)

8 tane bit bir araya gelip 1 baytı oluşturuyor demiştik yukarıda ,eğer bunlar işaretli bir sayı olacak olsaydı o zamanda –(eksi) 127 ile + 128 arasında değer alacaklardı bi nevi ikiye bölünmüş olacaktı..2 Byte lık yani 16 bitlik(word) sayının alacağı değer normal de 65535 tir.Negatif bir sayı alması durumunda ise bir yarısı -32768 ile diğer yarısı +32767 arasında olur,bunların nasıl bu değerleri aldığını görelim.Lutfen burayı iyi takip edin çünkü sayı sistemlerin de Binary sayı mantığını anlamanız size çok büyük kolaylıklar sağlayacak.

1-) 1-1-1-1-1-1-1-1 daima hesaplamaya sağdan başlıyoruz aynen onluk düzende olduğu gibi;
1*1 - 1*2 – 1*4 – 1*8 – 1*16 – 1*32 – 1*64 – 1*128
2 ve 2 nin katları şeklinde hesaplıyoruz
1+2+4+8+16+32+64+128 = 255
Çarpım sonuçlarını sadeleştiriyor ve topluyoruz sonuç =255
Not: Unutmadan söyleyeyim sağdaki ilk rakamı hep 1 ile çarparız daha sonra kullanılan sayı sisteminin katları ile çarparız.Bu Onluk düzende de,Onaltılık düzende de aynıdır,değişmez.Mesela Onluk düzen hep şu şekilde gider 1-10-100-1000- 10000 gibi 10 sayısının katları şeklinde ilerler.İkilik düzende de aynıdır yani; 1-2-4-8-16-32 gibi 2 ve 2 ‘nin katları şeklinde gider.

2-) Peki şöyle bir şey olsaydı 00101100 yine aynı işleme tabi tutardık elbette , evet yapalım ;
Dikkat sayının sağından başlıyorum
0*1- 0*2 - 1*4 -1*8 - 0*16 - 1*32
diğer sıfırları çarpmaya gerek yok çünkü sonuç sıfır olacaktır.
0 + 0 + 4 + 8 + 0 +32 = 44
sadeleştirip topladık sonuç = 44.
Anlaşılması açısından 0*1 ve 0*2 yi ekledim yoksa bunları katmadan çıkan sonuçları toplayıp sonucu bulabilirsiniz.

Onluk Sayıyı Binary’e Çevirme :
Evet arkadaşlar bunuda hemen bir örnekle anlatmadan önce şunu hatırlatayım ,sayımız zaten 1 ve 0 dan oluşuyor onun için bu sayıyı 2 ye böleceğiz ve bunu bulmak çok kolay olacak Ayrıca bir hatırlatma eğer tam bölünme oluyorsa 0 ,kalanlı bölünüyorsa 1 olarak yazılır çünkü bir sayı 2 ye ya tam bölünür yada kalanlı bölünür.Yukarıdaki sayımızın Binary karşılığını bulalım yani 44 sayının.
44 / 2 0
22 / 2 0
11 / 2 1
5 / 2 1
2 / 2 0
1 / 1 1 Kalan 1 sayısı aynen alınır.
Bu sayıyı ters çevirip aldığımızda 101100 böyle bir sayı çıkar.Bunu yukarıda göstermiş olduğum şekilde hesaplarsanız sağlamasını da yapmış olacaksınız.Başka bir örnek;
23 /2 1
11 /2 1
5 /2 1
2 /2 0
1 /1 1 Kalan 1 sayısı aynen alıyoruz çünkü 2 ye bölemeyiz.
Bu sayıyı ters çevirip aldığımızda 10111 böyle bir sayı çıkar ki bunu da 1+2+4+0+16= 23 bu şekil de topladığınız zaman sonucun 23 olduğunu göreceksiniz.

ONLUK SAYILAR (DECIMAL) :

Bu sayı sistemini aslında hepimiz biliyoruz arkadaşlar.Gündelik yaşantımızda ,okulda, işte kısaca her yerde kullandığımız sayı düzeni.Ama ikili sayı sisteminin anlaşılması açısından kısaca bu sayı sistemine değinerek geçeceğim.Bu sayılarda kendi arasında 10 ve 10’un katları şeklin de ilerler.
8452 sayısını ele alalım bu sayıda ne var?Aslında hiçbir şey yok normal bir sayı zatenJAnaliz edelim hemen ;
Sağdan başlıyoruz -à 2 tane 1 var,5 tane 10 ,4 tane 100 ,8 tane 1000 var.Dikkat ettiniz mi; 1-10-100-ve 1000 diye gittik.Yani 2*1 + 5*10 + 4*100 + 8*1000 =8452 umarım ikilik sayı düzeni bu örnekle daha iyi anlaşılır.

ONALTILIK SAYILAR ( HEXDECİMAL ):

Bunu aşağıdaki gibi örnekle açıklayalım bir .exe dosyasına baktığımız zaman A harfinin karşılığını 65 değerinde değil de, 41 değerinde görürüz.Halbuki A ‘nın Ascii kod karşılığı 65 di.Peki bu neden böyle oluyor?



Bunun nedeni arkadaşlar bilgisayarın ilk çıktığı dönemlerde programcılar Binary kodlarla (ikili sayılar) çalışmak zorundaydılar.Çünkü bilgisayar bu dilden başka bir dil anlamıyordu.Düşünün bir kere 11001010 gibi bir sayı sistemi ile ne şekilde çalışabilir ve hatasız bir kod nasıl çıkarabilirsiniz.İşte bu durum da program uzmanları ortaya bir buluş atmışlar . Bildiğiniz gibi, dört bit ikilik değerleri 0000 ile 1111 arasında (ondalık 0 ile 15 değerleri arasına eşittir), 16 olası kombinasyonun bir toplamı olarak gösterir. Eğer sayma sistemi bu 16 kombinasyonda gösterirse, 16 rakama sahip olmalıdır. Bu da bir “taban 16 sistemi” olmalı.Bu durumda programcılar bir nebze olsun daha rahat çalışsın diye bu sayı sistemini geliştirmiş ve adına Yunan sözcüğü olan “hex” (6 için) ile bir Latin sözcüğü olan “decem” (10 için) birleşimiyle oluşan “hexdecimal – (hexdesimal)” ismiyle isimlendirmişler. Bu sayede taban 16 sistemine “hexadesimal” (onaltılı) sayı sistemi dendi.
Böylece 1 ve 0 dünyasından kendilerini kurtarmış oldular .Dikkat edin kendilerini kurtarmışlar bilgisayarı değil.Dedik ya makineler sadece 1 ve 0 ‘ı anlar diye.
İşte yukarıdaki resimde gördüğünüz 41 sayısıda “A” harfinin 16 lık sayı sistemindeki karşılığıdır.Böylece kodlar 2 sıralı halde ve düzgün bir görünüme kavuşuyor.
ASSEMBLY ise Binary sayılarla olsun,Hexdecimal sayılar olsun bunların tümünün ,CPU yu görevlendirmek için oluşturdukları sayısal komutların sembolik karşılığıdır diyebiliriz.Çünkü her ne komut verirseniz verin bunların tamamı CPU ya bir sayısal değer olarak (1,0)gidecektir.
Onaltılık sayı tablosu

Hexadesimal


Rakam


Binary


Değeri


Ondalık


Değeri


Hexadesimal


Rakam


Binary


Değeri


Ondalık


Değeri


0


0000


0


8


1000


8


1


0001


1


9


1001


9


2


0010


2


A


1010


10


3


0011


3


B


1011


11


4


0100


4


C


1100


12


5


0101


5


D


1101


13


6


0110


6


E


1110


14


7


0111


7


F


1111


15



Tabloda gördüğünüz gibi 1,2,3,4,5,6,7,8,9 ‘dan sonra A,B,C,D,E,F,10,11,12 diye devam ediyor.Onluk düzende bildiğimiz sayılarla hemen hemen aynı sadece araya 6 tane harf girmiş. Burada görüldüğü gibi onaltılık sistem her 16 sayı sonrası basamak atlatıyor. Ayrıca a,b,c,d,e,f olmak üzere 6 tane daha fazladan sayıya sahip. O zaman onaltılık bir sistemde değer 10 ise onluk sistemde o sayı 16 demektir. Yani 16 nın katları olarak artmaktadır.Kafanız karışmasın hemen bir örnekle gösterelim.

0Fh = 15
10h = 16
20h = 32
30h = 48
F4h = 244
Açıkladığım gibi bu sayılarda 16 ve 16’nın katları şeklinde ilerliyor ,tıpkı Onluk düzende 10 ve 10 ‘un katları şeklinde ilerlediği gibi.Yukarıdaki örnekte dikkatinizi çektiyse ,soldaki rakamların sonunda küçük “h” harfi var.Bunu hesaplamalarda dikkate almayın sadece o sayının Hexdecimal bir sayı olduğunu gösteriri ki CPU bu sayıyı onluk düzendeki bir sayı gibi algılamasın.Normalde bundan sonra bu “h” harfini kullanacağımız için bu ne demek oluyor diye takılmayın. Assembler programlarında kullanılan sayılar şu şekillerde simgelenerek birbirinden ayrılırlar:

1010b sonundaki “b” harfi Binary sayı olduğunu;
2359d sonundaki “d” harfi Decimal yani onluk bir sayı oldugunu
4FA1h sonundaki “h” harfi HexDecimal yani Onaltılık bir sayı olduğunu gösterir.

- 'd' harfi yada harfsiz bu bildiğimiz onluk sistemde demektir. Eğer bir kaynak kodunda sayının yanında (önceden bütün sayıların hex olacağını belirten .radix16 gibi bir komut kullanılmamışsa) hiçbir simge yoksa o sayı göründüğü değerinde bildiğimiz onluk tabanda bir sayıdır. Ama eğer onaltılık kurallarıyla yazılmış (a,b,c,d,e,f içerikli) ve yanında hiçbir işaret yoksa derleyici burada 'illegal number' şeklinde bir hata mesajı verir.
Şimdiye kadar görmüş olduğumuz sayı sistemlerini kısaca hatırlayalım;

1-Binary (ikilik) Sayı sistemleri
2-Onluk (Decimal)Sayı sistemleri ve
3-Onaltılık (Hexdecimal) Sayı sistemleri.

Öncelikle şunu belirtmem gerekiyor arkadaşlar ; onluk zaten biliyoruz ama onaltılık ve ikilik sistem mutlaka bilinmesi gerekiyor. Programlarınızda, denemelerinizde hep bu sistemler kullanılacak. Komutlar hep bu sistemlere göre çalışacak ve bazıları sadece bu sistemlerdeki değerlere göre hareket edecek. Bunun için bir assembler programcısının mutlaka bu sistemleri bilmesi ve kullanması gerekiyor.Aşağıdaki konuyla bu konuları daha iyi bir şekilde pekiştirip bitireceğiz…


Onaltılık Sayıyı Onluk Sayıya Çevirme :

Arkadaşlar Onaltılık (Hexdecimal) bir sayıyı ,Onluk (Decimal ) bir sayıya 2 şekilde çevirebiliriz.
1.olarak aşağıda anlattığım şekilde çevirebilirsiniz.
2.olarak da bununla kim uğraşır diyerek, Windows ’un hesap makinesini kullanıp çevirebilirsiniz J
Ben yine de 1. olarak bahsettiğim şekliyle açıklayayım..Arkadaşlar yukarılarda ikili ve onlu sayı sistemlerini anlatırken birinci basamak her zaman kendi değerindedir demiştik.Burda da aynı kural geçerli yani sayı 0ah,0bh,0ch.. olsa bile onluk sisteme çevirilince birlik basamak olarak diğerlerine eklenir. Diğer basamaklarda aynı bildiğimiz matematik kurallarında olduğu gibi basamak çarpanı esas alınarak çarpılır. Nasıl ki 8452 sayısının 8*1000+4*100+5*10+2*1 olduğunu biliyorsak onaltılık sistemde de bu kuralın böyle olduğunu biliriz.Kısa bir örnekle acıklayalım;
FA5h sayısını ele alalım ve analiz edelim.Burda ilk önce 5 sayısını 1 le ,A’nın (Onaltılık sistemde) sahip olduğu değeri 16 ile , F’nin (Onaltılık sistemde) sahip olduğu değeri de 16 ‘nın bir sonraki katı ile yani 256 ile çarpacağız.Devam edelim,
Sağdan başlayarak yapıyorum yine ;
5*1 + A*16 + F*256 şimdi A ile F nin yerlerine Hexdecimal değerleri koyalım
5*1 + 10*16 + 15*256
Yukarıda ki tabloda A’nın hex karşılığını 10 , F nin hexdec.karşılığını ise 15 olarak göstermiştik.Sonuçları toplayalım o zaman ,
5 +160 + 3840 = 4005 olarak sonucu bulmuş oluruz.Biraz zor gibi görünebilir ama ben mümkün olduğu kadar sadeleştirip anlattım.Zaten 1 veya 2 deneme yaparsanız mantığı kavrarsınız arkadaşlar.Aşağıdaki katlara bakınca daha iyi anlayacağınızı ümit ediyorum….
Onluk Sistem : Onaltılık Sistem :
1 1
10 16
100 256
1000 4096
10000 65535
__________________
4umTurk@sl@nl@rı©
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl this Post!Reddit! Wong this Post!
Alıntı Yaparak Cevapla
Katılmıyoruz
om_far (29-06-2007)
Sponsored Links
Eski 10-06-2007, 01:16 AM
Chucky kullanıcısının avatarı
En Yakısıklı en €sprili€n Çapkın Üy€
 
Giriş Tarihi: Oct 2006
Yaş: 22
Mesajlar: 1,051
Beğenilmeyenler: 0
6 mesaj 6 kez beğenilmemiş
Teşekkürler: 88
400 Mesaja 908 kez teşekkür
İtibar Gücü: 100
Chucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsun
Cevap: Assembly Dersleri


Gördüğünüz gibi 4005 gibi Onluk düzendeki büyük bir değeri Onaltılık sayı sistemine göre sadece FA5 diyerek gösteriyoruz.Bunun bize ne kadar büyük bir kolaylık getirdiğini ve Hexdecimal sayıların neden kullanıldığını anlamış olduğunuz kanaatindeyim.
Buraya kadar anlattığım yerleri eğer anlamak ta güçlük çekiyorsanız ; tekrar bu makaleyi baştan okumanızı tavsiye ederim çünkü gerçekten okudukça kolay olduğunu göreceksiniz,ama yok eğer buraya kadar anlatılanlardan bir harf dahi anlamadım diyorsanız,size buradan itibaren bırakmanızı tavsiye ederim çünkü bundan sonraki Registerler ve Komutların çalışma prensibini anlamak ta çok daha zorlanırsınız.Bilen ve bunlar çocuk oyuncağı diyen arkadaşlar varsa da onlar için devam edeceğim.Bir sonraki konularımız Registerler ve Komutlar.
__________________
4umTurk@sl@nl@rı©
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl this Post!Reddit! Wong this Post!
Alıntı Yaparak Cevapla
Eski 10-06-2007, 01:17 AM
Chucky kullanıcısının avatarı
En Yakısıklı en €sprili€n Çapkın Üy€
 
Giriş Tarihi: Oct 2006
Yaş: 22
Mesajlar: 1,051
Beğenilmeyenler: 0
6 mesaj 6 kez beğenilmemiş
Teşekkürler: 88
400 Mesaja 908 kez teşekkür
İtibar Gücü: 100
Chucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsun
Cevap: Assembly Dersleri


ASSEMBLY PROGRAMLAMA DİLİ (BÖLÜM -2 )



REGISTERLER :

Evet arkadaşlar geldik registerler (Namı diğer Yazmaçlar nedense bu kelimeyi görünce sinir oluyorum ben buna kaydedici demeyi uygun buluyorum ama bilmeniz açısından yazdım ) konusuna, bu konuda oldukça kolay arkadaşlar.Makaleyi okudukta sonra anlayacağınızdan eminim.Registerleri kısaca şöyle tarif edebiliriz, programlamayla ilgilenen arkadaşlar bilirler,hani program yazarken değişken dediğimiz ,(a=53 , b= ”atmaca” gibi)değer atama durumları vardır ya hani,işte registerleri de bu değişkenlere benzetebiliriz.Örneğin b=”atmaca” değişkenimize başka herhangi bir değer atamadığınız sürece “b” ‘nin değeri hep “atmaca olacaktır.Taki bir değer atarsanız ,mesela 42 derseniz o zaman “b” ‘nin taşıdığı değer 42 olur.Bunun gibi registerler de (yani kaydediciler) CPU' nun her türlü işlemlerini yerine getirmesi için bu görevi yerine getirirler.
Kısaca şöyle de diyebiliriz ,işlemci yani CPU register adı verilen bölmelerden oluşur ve bu registerler de mikroişlemcinin en temel bileşenlerinden biridir .Bu registerleri ben 4 bölüme ayırmayı uygun buluyorum kimileri 3 yada 5 bölüm olarak inceleyebiliyor.

1-GENEL AMAÇLI REGİSTERLER
AX =Accumulator Register
BX = Base (Taban )Register
CX = Counter (Sayaç )Register
DX = Data (Veri )Register
2-SEGMENT REGİSTERLERİ
CS = Code Segment Register
DS = Data Segment Register
SS = Stack Segment Register
ES = Extra Segment Register
3-OFFSET REGİTERLERİ
IP = Instraction Pointer Register
SP = Stack Pointer Register
BP = Base Pointer Register
a-)İndex Registerler

SI = Source (Kaynak )Index Register
DI = Destination (Hedef)Index Register
4-FLAG (BAYRAK )REGİSTERLERİ
O = Overflow flag
D = Direction flag
I = Interrupt flag
T = Trace flag
S = Sign flag
Z = Zero flag
A = Auxilary Carry flag
P = Parity flag
C = Carry flag


Evet registerlerimiz bunlar,siz şimdilik hepsini de ezberlemeye kalkmayın zamanla programlar üzerinde durdukça öğreneceksiniz,bunlardan özellikle flag (bayrak )registerleri sadece bilgi almak açısından kullanırız ,yoksa bunlar üzerinde işlem yapamayız.İşlem sonunda eşitlik var mı yok mu,veya işlem sonunda taşma oluyor mu ya da olmuyor mu; gibi bilgileri görmek için kullanırız.Ben yine de mümkün olduğu kadar karşılarına Türkçe karşılıklarını da yazdım ki zorlanmayasınız.Bunların bir kısmını ayrıntılı olarak sonraki konularda anlatacağım zaten.

1-GENEL AMAÇLI REGİSTERLER :

Yukarıda görmüş olduğunuz (ax ,bx ,cx ve dx )registerleri eski 8 ve 16 bit işlemciler ( 8086,80186 gibi) için bu şekilde kullanılıyordu.Fakat bu işlemciler günümüzde pek kalmadı ve yeni 32 bit işlemciler daha yaygın bir şekilde kullanılıyor.Bunun içinde bu register isimlerinin başına Extended (Genişletilmiş ) kelimesinin “e” harfi getirildi.Yani EAX-EBX-ECX-EDX şeklinde oldular.Bizde bundan sonra bu Genel Registerler ,Segment Registerler ,Ofset ve İndex registerleri yazarken bu şekildeyazacağız.EBX-EDI-ESI-ESP vs gibi..
Bir ornek ;

Mov eax,24
Mov ebx, 10
Add eax , ebx
Sonuç = 34

Dönelim bu genel kaydedicilere ,bunlar kendi aralarında 2’ye bölünerek 8 adet olurlar.Şöyle ki;
EAX = AH - AL
(32 BİT)= (16 BİT) - (16 BİT)
EBX = BH - BL
(32 BİT)= (16 BİT) - (16 BİT)
ECX = CH - CL
(32 BİT)= (16 BİT) - (16 BİT)
EDX = DH - DL
Eğer bunlar 16 bit lik registerler olsaydı o zaman da 8 bit AH , 8 bit AL olarak değişecekti.Sonlarına eklenen H ve L harfleri “H” High (Yüksek)- “L” ise Low (Düşük) kelimelerinden gelmiştir. 16 bitlik bir register en fazla 65535 değerini alırken 32 bitlik bir register 4294836225 değerine kadar alır.
EAX register programlarda en çok kullanılan yazmaçlardan biridir. Accumulator’ün kısaltılması sonunda oluşan EAX yazmacı bütün giriş ve çıkış işlemlerinde ve bazı aritmetik işlemlerde kullanılır.
EBX Registeri Base register olarak da bilinir. RAM işlemlerinde adreslemede kullanılır. Register adresleme işlemlerinde daha çok offset degerlerini tutar. Ayrıca hesaplama işlemlerinde de kullanılır.
ECX Registeri Counter registeridir. Döngü işlemlerinde ve kaydırma işlemlerinde sayaç olarak kullanılırIZ.
EDX Register bazı giriş çıkış işlemlerinde ve matematiksel işlemlerde kullanılır.Daha çok çarpma ve bölme işlemlerinde büyük sayıları saklamak için AX registerinin bir parçasıymış gibi kullanılır.

2-SEGMENT REGİSTERLERİ :

Segment register’ ları (ECS, EDS, ESS ve ES) programımız bilgisayarın belleğine yüklendiği
zaman bellek içerisinde oluşturulan bölümlerin (Segment) başlangıç adreslerini tutarlar. Yani bu register’lar için bir çeşit yer göstergeci diyebiliriz. ECS, programımızın çalıştırılabilir kodlarını barındıran (Code Segment) bölgesinin başlangıç adresini tutar. Yani ECS ile gösterilen yerde makine dili kodlarımız vardır. EDS ise, programımız içerisindeki değişkenlerin saklı tutulduğu bölümdür. ESS (Stack), bellekte programımız için ayrılan stack bölümünün ( ki bu bölümü ayrı bir şekilde aşağıda anlatacağım ) başlangıç adresini tutar.ES (Extra segment) ise daha çok dizi yani string (Numerik olmayan) işlemleri için kullanılırız.

3-OFFSET VE İNDEX REGİTERLERİ :

Offset ve index register’ları bellek içerisindeki herhangi bir noktaya erişim sağlamak için kullanılır.Bu işlem için erişmek istediğimiz bölgenin offset ve segment adresleri gerekli register’lara aktarılır bizde bu şekilde işlemi gerçekleştirmiş oluruz..
Instruction Pointer register’ı ise CPU tarafından işlenecek olan bir sonraki komutun bellekteki adresini tutar. Bu register üzerinde programcının hiçbir eylemi olamaz. Her komut icra edildikten sonra CPU otomatik olarak kullanılan komuta göre gerekli değeri bu register’a atar.Arkadaşlar belki biraz ağır bir anlatım gibi görünebilir fakat bunların başka bir izah şeklini bulamadım yani şu an aklıma gelmiyor.
4-FLAG (BAYRAK )REGİSTERLERİ :

Arkadaşlarbunları detaylı bir şekilde anlatmadan önce şunu hatırlatmak istiyorum.Bayrak kaydedicisindeki her bir bitin 1 olma durumuna SET, 0 olma durumuna da RESET denir. İşlemcinin ürettiği bu sonuçlar hakkında programcı bunlara bakarak işlem durumunu analiz eder.
Overflow flag (OF): Biz buna taşma biti de diyebiliriz. İşaretli (negatif)sayı üzerinde meydana gelen taşma durumunu tespit etmek amacıyla kullanılır. Yani işlem sonucunda işaret biti değişmişse bu flag set edilir,yani 1 değerini alır.
Direction flag(DF):Bizim kullanmadığımız bir bayraktır.String işlemlerini yapan komutlar için kullanılır.Yani bir stringi hafızanın bir yerinden diğer bir yerine kopyalarken CPU tarafından kullanılmaktadır. İşlemci bu bayrağa bakarak transferin yönünü belirler.
Interrupt flag (IF) : Buna kesme bayrağı da diyebiliriz. CPU’nun çeşitli aygıtlardan gelen kesme isteklerini dikkate alıp almayacağını bildirir. 0 olması durumunda istekler dikkate alınmaz,1 olursa alır.
Trace flag (TF) : Trace biti de diyebileceğimiz bu bayrak CPU nun sadece 1 komut çalıştırma yapması için kullanılır.Hani Debugger ile bir programı açıp programda adım adım ilerliyoruz ya ,işte CPU bunu ,bu bayrağın durumuna göre yapar 1 olursa işletilmeye hazırdır demektir..
Sign flag (SF) : Yapılan işlem sonucunda elde edilen sayının en solundaki bit 1 ise bu negatif bir sayıdır demektir ve bu bayrakta 1 değerini döndürür.Eğer ki 0 ise pozitiftir ve bayrak 0 değerini yansıtır.Kısaca bu bayrak sayının negatif veya pozitif olduğunu gösterir.
ADD EAX, EBX
Eğer SF nin değeri 1 ise o zaman EAX deki sayı negatif bir sayı deriz.
Zero flag (ZF) : Bir işlemin toplam sonucu 0 ise bu flag set edilir yani 1, değilse reset yani 0 edilir.Bu bayrağı karıştırmayın arkadaşlar tekrar ediyorum eğer işlem sonunda sonuç 0 ise ,bu bayrak 1 değerini döndürüyor.Mesela
SUB EAX, EBX
işleminde iki register’ın değerleri eşitse sonuç 0 olacağı için ZF set (1)edilecektir.Aşağıdaki Olly debugger ile aldığım örnek resim olayı kavramanıza yardımcı olacak.
__________________
4umTurk@sl@nl@rı©
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl this Post!Reddit! Wong this Post!
Alıntı Yaparak Cevapla
Eski 10-06-2007, 01:20 AM
Chucky kullanıcısının avatarı
En Yakısıklı en €sprili€n Çapkın Üy€
 
Giriş Tarihi: Oct 2006
Yaş: 22
Mesajlar: 1,051
Beğenilmeyenler: 0
6 mesaj 6 kez beğenilmemiş
Teşekkürler: 88
400 Mesaja 908 kez teşekkür
İtibar Gücü: 100
Chucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsun
Cevap: Assembly Dersleri



Yukarıdaki resimde JE (jump if equal)komutunu görüyorsunuz burada bir üstündeki OR komutuyla (Daha sonra detaylı şekilde anlatacağım)işlem sonu kontrol ediliyor ve eşitlik var ise JE ile gösterilen adrese atla deniyor.Ancak aşağıdaki resimde gösterdiğim gibi Z bayrağı 0 (sıfır)gösterdiği için atlama gerçekleşmeyecektir.


Auxilary Carry flag (AF) : Dördüncü bit’ten beşinci bit’e doğru oluşan elde durumunda set edilir. Elde yoksa reset edilir. Özellikle BCD (binary coded decimal) işlemleri için düşünülmüştür.Zaten sizin sık kullanacağınız bir şey değil o nedenle fazla üstünde durmuyorum.
Parity flag (PF) : 16 bitlik bir işlem sonrasında düşük anlamlı byte içerisindeki 1’lerin sayısı çift ise bu bit set edilir 1 olur , tek ise reset edilir o olur. Yani düşük seviyeli bayt bölümündeki 1’lerin sayısı iki ile tam bölünüyorsa bu bayrağa 1 aksi taktirde 0 atanır.
Carry flag (CF) :Bu bayrak da Overflow bayrağına benzer ,ancak aralarında ki önemli fark şu arkadaşlar.Overflow bayrağı işaretli yani negatif sayılar için kullanılır demiştik.Carry (elde)bayrağı da işaretsiz pozitif sayılar için kullanılır.Yine aynı işi yapar yani bir işlem sonunda CPU taşma ile karşılaşırsa carry flag’ın değerini 1 yapar set eder.


ADRESLEMELER :

Bildiğiniz gibi programları oluşturan kodlar ve veriler hafızaya yüklendikten sonra işlemci tarafından satır-satır icra edilirler. Ayrıca CPU tüm giriş-çıkış işlemlerini de hafızaya erişerek yapar. Bazen hafızadan doğrudan bir kod ya da veri alır, işler. Bazen hafızaya bir veri gönderdiğinizde birde bakmışsınız bu bir yazıcıdan belge olarak çıkmış . İşte bilgisayarın donanım ve yazılım olayın da yaptığı bunca çeşitli iş için CPU hafızaya değişik yollardan erişme ihtiyacı duyar. Sizlerde programlarınızı yazarken CPU’nun hafızaya nasıl erişeceğini yazdığınız kodlarla belirtmek zorundasınız. Assembly dilinin bir basamağı olan adresleme modları da bu konuları kapsıyor ve bence iyi bilinmesi gereken bir konu.
Başlıca adreslemeler:

Register (Kaydedici) adreslemesi : Adından anlaşılacağı gibi kaydediciden kaydediciye yapılan işlemlerde bu adresleme modları kullanılır. En hızlı adresleme modu’dur, çünkü işlem hafızada (Bellekte) değil işlemcinin içinde gerçekleşir

mov eax, ebx ; EBX teki değeri EAX’e kopyalar
mov dl, al ; AL teki değeri DL’ye kopyalar (Açılımları yukarda söylemiştik)
mov esi, edx ; EDX teki değeri ESI’ya kopyalar
Kaydedici adreslemede en çok dikkat etmeniz gereken husus hedef ve kaynağın boyutlarıdır. Örneğin 16 bitlik bir kaydediciden 8 bitlik bir kaydediciye taşıma yapılamaz!
mov cx, al ; Yanlış kullanım, AL(8 bit) ile CX(16 bit) eşit boyutta değil.
Hafıza bölgesi adreslemesi : Bu adresleme ile register hafızanın herhangi bir bölgesi işaretlenir. Bunun için MOV komutu yerine LEA (ilerde bahsedeceğim)komutunu kullanabiliriz. MOV komutu registere verilen değeri yükler yada adresler. LEA komutu da aynı işi yapar. Ancak MOV komutundan önemli bir farkı vardır. Verdiğiniz yerdeki değeri değil adresi yükleme yapar. Örneğin:
debug 'Yazi1',01
lea eax, debug şeklinde verilince EAX registere 'Yazi' değişkeninin değeri değil bulunduğu yerin adresi yüklenir. Böylece biz bu verinin başından itibaren istediğimiz gibi çalışma yapabiliriz.
Dolaysız adresleme :Bu adresleme registerler arasındaki değerlerin hafıza adresi olarak kullanılması ile oluşan adreslemedir. Buna göre elimizde hiçbir değer yok sadece registerler vardır.
mov dword ptr [esi] ,eax =EAX deki değeri-ESI ile işaretlenen 32 bit hafıza bölgesine yaz
mov byte ptr [eax],bl = Aynı şekilde fakat burada ki değer 8 bit
mov dword ptr [esi],ebx =İlk örnek ile aynı

Burada şu ana kadar bahsetmediğim birkaç kelime var onları anlatmak istiyorum arkadaşlar.Örneğin byte ptr ve [ ] parentez şimdi bunları kısaca açıklayacağım.
byte ptr : Açılımı arkadaşlar (byte pointer) demektir.Eğer yükleyeceğiniz değer 1 byte (8 Bit) cinsinden bir değer ise bunu işlemciye bildirmek zorundasınız ,aksi takdirde hata verir.
word ptr : Bu da arkadaşlar (word pointer) anlamındadır.Ve 16 bittir.Yükleyeceğiniz değer16 bitlik ise yine CPU ya bildirmek zorundasınız…
dword ptr : Bunun açılımı da arkadaşlar (double word pointer) demektir ,yani 16 bitlik 2 sayı anlamındadır.Doğal olarak da 32 bitlik (4 bayt) lık bir değeri temsil eder.
[ ] Parentez : Bu ise arkadaşlar kullanıldığı yerin bir hafıza (bellek) adresi olduğunu gösterir.Bir [ ] parentez görürseniz o gösterilen yerin hafıza adresi olduğunu bilin..

Dolaylı Adresleme :Bu adreslemede arkadaşlar ileride göreceğimiz PUSH ve POP komutuna benzer olarak istenilen bir hafıza adresine saklama işlemi yapılır. Bu bir register olabileceği gibi bağımsız bir değerde olabilir.Örneğin :

mov dword ptr [deneme],ebx
mov word ptr [00364010] ,4252h

Böylece Registerler ve adreslemeler konusunu da bitirmiş oluyoruz.Ama siz başka makalelerde okuyarak bilginizi sağlamlaştırın derim çünkü değişik kaynaklar her zaman iyidir ama bu kadar anlaşılır olmayabilir J.Bundan sonra stack olayına da değinip ,komutlara geçeceğiz.Stack olayı da iyi bilinmeli ve anlaşılmalı arkadaşlar bu nedenle buna da değinmek istiyorum.Bu arada bugün Mübarek Kadir gecesi Allah C.C tekrarını nasip eder inşallah.

STACK ( YIĞIN ) NEDİR :

Gelelim arkadaşlar Stack dediğimiz Yığın konusuna.Bu konuda oldukça basit bir konu yeter ki bu yazdıklarımı dikkatli okuyun.Şimdi program yazan arkadaşlar bilirler ,program yazarken bir değişken kullanırız.Mesela deriz ki; sayi= 24 bu bizim değişkenimizdir.Ve değiştirilmediği sürece hep 24 değerini saklayacak.Ama biz bu değişkene başka değerlerde almak ve 24 değerinin de kaybolmamasını istiyoruz.İşte böyle bir durumda CPU bilgileri geçici olarak saklamak için hem registerleri hem de stack dediğimiz bu bölgeyi geçici yerleşim bölgesi gibi kullanır.Yani bilgilerimizi geçici olarak bu yığına atar ve geri alır.Kısaca Stack, bilgilerin geçici olarak depolandığı bir bölümdür deriz.
Bu yığına giden bilgiler arkadaşlar word uzunluğunda olup en az 2 byte (16 bit) ‘dir.Bu stack alanının bilgisini SP (Stack Pointer) tutar ve buraya gelen verilerin uzunluğuna göre SP kendi değerini azaltır.Buradan değerler geri alındığında ise SP kendi değerini alınan verinin uzunluğu kadar artırır.Bu biraz karmaşık görünebilir ama değil çünkü biraz sonra bunu da bir örnekle anlatacağım .Bu yığına veriler PUSH ve POP komutları ile atılır ve geri alınır.Atarken PUSH komutunu ,alırken de POP komutunu kullanırız.Bunları komutlar bölümünde inceleyeceğiz zaten.
Gelelim şimdi SP in veri alırken değerini azaltması olayına.Arkadaşlar şimdi bir çok bölmelerden oluşan bir kitaplık düşünün (Bu bizim Satck ‘ımız yani yığın bölgemiz).Bu kitaplığımız boş haliyle 100 adet kitap alabiliyor.Biz bu kitaplığa tutar da,5 adet kitap korsak ne olur?Kitaplığımızın %5 ‘i dolmuş olur ,yani boş alanı %95 ‘ e düşmüş yani azalmış oldu değil mi.Kitap alabilme yeri azaldı.İşte Stack ‘ta veri aldıkça boş olan yerleri azalıyor.Şimdi anladınız değil mi.
NOT : Birde unutmadan arkadaşlar bu stack’a atılan veriler ,en sondan başlayarak geri alınır.Yani Son giren veri ilk çıkar.Şöyle diyelim hani biz kitaplığa 5 adet kitap koymuştuk ya,işte bu kitapları geri alırken de ilk önce 5. kitabı sonra 4. sonra 3.-2. ve 1. kitabı alabiliriz.Stack ta da bu böyledir.Tıpkı iç içe açılan For –next döngüsü gibi.En son açılan döngü ilk önce kapatılır. VB ‘ ci olduğum için aklıma bu örnek geldi.

Evet arkadaşlar bu konuyu da bitirdik .Komutlar bölümün de görüşmek üzere.Saygı ve sevgilerimle.
__________________
4umTurk@sl@nl@rı©
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl this Post!Reddit! Wong this Post!
Alıntı Yaparak Cevapla
Eski 10-06-2007, 01:22 AM
Chucky kullanıcısının avatarı
En Yakısıklı en €sprili€n Çapkın Üy€
 
Giriş Tarihi: Oct 2006
Yaş: 22
Mesajlar: 1,051
Beğenilmeyenler: 0
6 mesaj 6 kez beğenilmemiş
Teşekkürler: 88
400 Mesaja 908 kez teşekkür
İtibar Gücü: 100
Chucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsunChucky Artık ileriyi görebiliyorsun
Cevap: Assembly Dersleri


ASSEMBLY PROGRAMLAMA DİLİ (BÖLÜM -3 )



ASSEMBLY KOMUTLARI :

Evet arkadaşlar geldik komutlar bölümüne ,assembly ‘de komutları kendi aralarında bölümlere ayırmak bence daha iyi olacaktır.Böylece komutların ne işlem yaptıklarını hangi komutların nereler de kullanıldıklarını anlamak daha kolay olur.Ayrıca vereceğim bazı püf noktalar ile de komutlara bakarak ne üzerinde etkili olduklarını hemen kavrayacaksınız.Assembly ‘ de komutları Transfer Komutları, Matematiksel Komutlar, Mantık Komutları, ,Döngü Komutları , Atlama Komutları ve Kaydırma Komutları olarak inceleyeceğiz .Çok gibi görünse de siz bir sefer bu makaleyi okuduğunuz zaman bir çoğunu hemen kavrayacaksınız.Neyse Transfer Komutları ile başlayalım.
Transfer (Veri Taşıma )Komutları :
Bu grup içerisindeki komutlar herhangi bir bilgiyi register-register, bellek-register ve register-bellek bölgeleri arasında transfer etmek için kullanılır.Başlıcaları şu şekildedir.
MOV Komutu: Arkadaşlar önceki bölümlerde birkaç örnek verirken bu komutu kullanmıştım.Şimdi bu komutu yakından inceleyeceğiz anlaşılması kolay bir komut.Adını zannedersem “Move”(taşı) kelimesinden almış.Kullanımı :

Mov Hedef , Kaynak

mov register, register
mov bellek, register
mov register, bellek
mov [adres+register], register
mov register, [adres+register]
vb .şekildedir.Yalnız dikkat edin burada ters bir durum var ,ilk önce hedef sonra ise kaynak adres yazılır mesela Windows da bir veri kopyalarken dikkat ettiyseniz orada önce kaynak ,sonra da hedef bölge yazılır,burada ise tam tersidir.Assembly komutlarının hepsinde önce komut sonra hedef ve araya ( , )virgül koyarak kaynak adres yazılır.Diğer gösterimler ise Mov komutu ile bu bellek ve registerler (kaydedici) arasında ne şekilde veri transferi yapılabileceğini gösterir.Bu komutun bayrak registerleri üzerinde herhangi bir etkisi yoktur.Unutmadan şunu da söyleyeyim taşıma yaptığınız veri ile register aynı değerde olmalıdır.
MOV AX, 1525h
MOV DS, AX
Yukarıda ki örnekte 2 byte lik 1525h (hexdecimal) değer AX (AX burada 16 bit yani 2 bytedir)registere aktarılıyor.Sonra ise AX deki değer DS ‘ye (Data Segment) yazdırılıyor.
LEA (Load Effective Address) Komutu :Bu komut ise Etkin Adresi Yükle anlamındadır.Bu komut Mov komutuna benzetilebilir ancak aralarında etkin bir fark vardır.Mov komutu ile registere bir yerdeki(hafızadan veya registerden) değer yüklersiniz.Oysa LEA komutu ile registere o yerdeki değeri değil,oranın adresini yüklersiniz.Bu şekilde iki yada üç komut ile yapılacak bir işlemi tek bir komut ile yapmış olursunuz. Kısaca ;LEA komutunun genel kullanım amacı herhangi bir register’a bir bellek adresini yüklemektir. Aşağıdaki kullanım şekli ve örnek açıklayıcı olacaktır.
lea register, adres
lea register, [adres]


dizi db ‘Merhaba’,0

Bu şekilde ki örnekte lea eax, dizi şeklinde yazarsam eax registere ‘Merhaba’ değeri değil de,bulunduğu yerin adresi yüklenir. Böylece biz bu verinin başından itibaren istediğimiz gibi çalışma yapabiliriz. Bu komutun da bayrak registerleri üzerinde herhangi bir etkisi yoktur.
MOVS (Move String)Komutu:Arkadaşlar en güçlü dizi (String)veri transfer komutu olan MOVS hafızanın bir alanından diğer bir alanına veri aktarımı yapar.Yanına aldığı B,W,D takıları ile ayrı bir opkod halini alır ve buna göre bitte işlem yapar. Diğer bir deyişle, bu komut hafızadan- hafızaya veri transferi yapar. Bir MOVS komutu SI(Source index) ile adreslenen hafıza değerini, DI (Destination index) ile adreslenen hafıza alanına aktarır.Yani bir nevi Kaynak-Hedef ilişkisi.
MOVSB = 1 byte işlem için - BYTE(8 bit)
MOVSW = 2 byte işlem için - WORD(16 bit)
MOVSD = 4 byte işlem için - DOUBLEWORD(32 bit)
LODS (Load)komutu: Bu da MOVS komutu gibi yanına aldığı ekin boyutuna göre 8 ile 32 bit arasında işlem gücü kazanır. Temel görevi SI(yada ESI) registerin gösterdiği noktadaki değeri alıp bit değerine göre (AL, AX, EAX)registere (Load)yüklemektir. Ayrıca LODS komutu değeri yükledikten sonra SI registerin değerini kullanılan bit değerine göre arttırarak sonraki veriye göre ayarlamış olur. Bu 8 bit lik veri için 1 byte- 16 bit lik bir veri için 2 byte - ve 32 bit lik bir veri çin 4 byte otomatik olarak toplanacak demektir.
LODSB = 1 byte işlem için (8 bit)
LODSW = 2 byte işlem için (16 bit)
LODSD = 4 byte işlem için (32 bit)
CMPS (Compare)Komutu : CMP komutunun bir değişiği olan bu komut tekil olarak diğerleri gibi yanına aldığı ek ile orantılı olarak bit sayısı kadar işlem(Karşılaştırma) yapar.Yine bu komut SI (veya ESI) ve DI (veya EDI) registerler ile birlikte çalışır.Bu komut tüm karşılaştırma ve test komutları gibi bayrak registeri etkiler. Bu komutu kısaca SI register ile gösterilen bölgeyi DI ile gösterilen bölge ile karşılaştırır diye açıklayabiliriz.. Bu komut ileride göreceğimiz karşılaştırma komutları gibi registerler karşılaştırması yapmaz. Karşılaştırma sonucunu ZF (zero flag) ile alırız. Eğer iki bölgede verdiğimiz bir değerin karşılaştırılması sonucu aynı ise ZF set (1) olur. Eğer yanlış ise ZF reset (0) olur.
XCHG (exchange) Komutu : Exchange komutu iki değerin karşılıklı olarak yer değiştirilmesi için kullanılır.Karşılıklı olarak registerler birbirlerinin değerlerini alırlar. Tabi yine değişim yapılacak değerlerin de aynı boyda olması gerekmektedir.Bu komut da flag register’lar üzerinde herhangi bir değişiklik yapmaz. Kullanımı çok basittir arkadaşlar.
Xchg register,bellek
Xchg bellek,register

Mov ax,1234 ( ax =1234 örnekteki değerler 16 bittir.)
Mov bx,5678 (bx = 5678 )
Xchg ax,bx (ax =5678 - bx =1234 değerler yer değişti)
XLAT Komutu :XLAT komutu esas olarak BX (veya EBX) ve AL registeri esas alarak çalışır Genellikle tablo olarak tasarlanan dizilere erişmek için kullanılır. AL kaydedicisine tablonun elemanlarından birini yükler. Bu komutu aşağıdaki örneğe bakarak daha iyi anlayabilirsiniz.
Tablo DB A, B, C, D, E, F
Bu tablonun 4. elemanını AL’ye yüklemek istersek;
MOV AL, 04 ; 04 .eleman sorguluyoruz.İndeks değeri (Diziler 0 dan başlar)
LEA BX, Tablo ; BX’e (taban kaydedici) Tablonun ofset adresi yükleniyor
XLAT ; Tablonun 4. elemanına erişilip E’nin ASCII karakterin hex karşılığı AL’ye yükleniyor(AL=105)
PUSH-PUSHA-PUSHF—POP-POPA-POPF Komutları :
Arkadaşlar Yığın (Stack) konusunu önceki bölümde anlatmıştım. Bu yığın dediğimiz bölge döngülerin döngü sayısını tutmak içinde kullanılır. Ayrıca Bayrak registerlerin (F veya EF) durumu da yığın içinde saklanılabilir.Matematiksel işlemlerde de yığın kullanılır. Bu anlamda yığın çok önemlidir.İşte bu yığına veriyi atmak ve geri almak için de PUSH ve POP komutlarını kullanırız. PUSH ve POP komutları kullanıldığında yığın bölgesinin işaretçisi olan SP (Stack Pointer ) kaydedicisinin durumu da değişir. Tabiî ki bu yığına attığımız veya yığından çektiğimiz değerin boyutuna bağlıdır. 2 byte’lık değer ile işlem yaparak yığına 2 byte lık bir değer atarsak (mesela bu AX kaydedicisinin içeriği olabilir) SP’nin değeri de 2 byte azalır.Anlamadıysanız bir önceki konudan stack konusunu tekrar okuyabilirsiniz…
PUSH komutu herhangi bir bilgiyi belleğin stack adı verilen bölümüne kaydetmek için kullanılır;diye tanımlayabiliriz.PUSH komutu ile stack üzerine atılacak bilgi en az 16-bit uzunluğunda olmalıdır.Komut aşağıdaki gibidir.
PUSH değer
Yukarıda “değer” ile gösterilen kısım daha öncede belirttiğim gibi 16-bit uzunluğunda olmalıdır. Bunun yanı sıra “değer” ile gösterilen kısım sabit bir değer alamaz. Yani PUSH ile stack üzerine yazabileceğimiz değer ya bir register içerisindeki değer yada bir bellek bölgesindeki değer olmalıdır.
mov eax,1234 AX = 1234h değeri atıyorum
push eax AX ‘teki değer şimdi STACK ‘ta ve SP-2 olarak azaldı.
POP komutu ile de stack üzerinden bilgi okuması yaparız. Yani PUSH komutu ile yığına gönderdiğimiz bilgileri POP komutu ile de geri okuruz. Okunacak bilgi 16-bit uzunluğunda olmalıdır.POP komutu ile alınan bilgi stack üzerine yazılan son bilgidir. PUSH ve POP komutları ile bilgi transferi yapılırken yazılan ve okunan bilgilerin sıralaması önemlidir, yine bir önceki konuda açıkladım. Programlar yazılırken stack üzerindeki işlemlerde hesaplama hatası yapmamak için buna dikkat etmek gerekir.
mov eax,1234 = yukarıdaki örneğimiz
push eax = satck ‘a atıldı
xor eax,eax = eax ‘i boşaltıyorum
pop eax = eax-1234 değeri geri yükledim.
PUSHA-POPA :Bazen bütün register’ların yığında saklanması gerekebilir. Örneğin bir donanım kesmesi oluştuğunda çağrılacak bir kod yazmak istersek kesme çıkışında bütün register’ların ilk konumuna getirilmesi gerekir. Bunun için kesme koduna girişte bütün register’lar stack