Assembly & Emu8086 #2

0
471
views
assembly
assembly

Uzun bir aradan sonra, bu yazımda sizlere daha önce bilgi vermeye çalıştığım Assembly & Emu8086 konusunun devamı olarak, adresleme modları hakkında bilgi vermeye çalışacağım.
Mikroişlemci için verimli bir yazılım geliştirme, adresleme modlarının hangi komutlar üzerinde etkili olduğunun bilinmesiyle sağlanır.

VERİYİ TAŞIMAK
Mov Komutu: En çok kullanılan komut olup adından da anlaşılacağı gibi veri taşımak için kullanılır. Detayları aşağıda anlatmaya devam ediyorum.

MOV hedef, kaynak
MOV AX,BX
Kaynaktan Hedefe

Register Adresleme
Komutlarda 8-bit ve 16-bit registerları karışık olarak kullanamazsınız.
Daha önce bahsettiğimiz Segment Register diğer bir Segment Registera adres aktarımı için MOV komutu kullanılamaz.
Daha önce bahsettiğimiz CS:IP çifti bir sonraki komutun adresini belirler. Bu yüzden eğer CS değiştirirseniz bir sonraki komutun adresi belirsiz olacaktır. Bunun için CS registerı MOV komutu ile değiştirilmez.

Daha açıklayıcı olması için bir örnek.
MOV AH, BH ————– BH, AL’ye kopyalar
MOV AX, DX ————– DX, AX’e kopyalar
MOV SP, BP ————– BP, SP’ye kopyalar
MOV DS, AX ————- AX, DS’ye kopyalar

MOV ES, DS ————- İzin Verilmez( Segment—Segment)
MOV AL,BX ————– İzin Verilmez ( 8-Bit – 16-Bit)
MOV CS, AX ————- İzin Verilmez ( CS hedef olamaz)

Immediate Adresleme
Bu mod da, veri hafızada olup bir opcode’u izler. Veri 8 bit veya 16 bit olabilir.
Burayı da bir örnekle daha açık hale getirmek daha iyi olacaktır.

Burada gördüğünüz gibi 7.satırdaki komutumuz 18 değerini AL ye kopyaladı.
8. satırda 26H değerini BX e kopyaladık. Burada BX değeri 0026H olarak gözüküyor. Sebebi ise 26H olarak kopyalarken başında 00 olduğu içindir.
9.satırda CH registerına 118 değerini kopyalıyor. Fakat solda 76 değerini görüyoruz. Bunun sebebi ise 118 değerinin Hexadecimal karşılığı 76 olmasıdır. 118 yerine 118H yazarsanız eğer hata alırsınız . Çünkü CH registerı 8-bit iken siz ona 118h yazarak kapasitesinden daha fazla bir veri kaydetmesini istiyorsunuz bu da imkansız bir durumdur.
10. Satırda AH registerına ‘A’ harfimizin ASCII kod tablosundaki karşılığını olan 41H yazar.
11. Satırda ise ‘A’ ve ‘B’ harflerinin ASCII karşılığıdır. ‘A’ ASCII Karşılığı 41H, ‘B’ ASCII karşılığı 42H dır.

Doğrudan Adresleme
Doğrudan adresleme yönteminde, veri segmentinde (DS) yer alan bir hafıza hücresi ile, AL veya AX registerı arasında veri aktarımı yapan MOV komutu kullanılır.
Bu duruma şu şekilde örnek verebiliriz.

MOV AL, DATA -> DS’de bulunan ve ofsetinin DATA sembolü ile belirtilen veri AL registerına kopyalınır. DATA herhangi bir ofset değer olabilir. Eğer ki DATA’nın ofset değeri 1023h ise bunu:
MOV AL, [1023h] -> şeklinde göstermek mümkündür.

Dolaylı Adresleme
Bu adresleme modunda BX,BP,DI ve SI registerları ile hafızanın herhangi bir yerinde bulunan bir veri adreslenebilir.
BX, DI ve SI registerları kullanıldığında bu registerlar DS’de bulunan veriyi adreslemektedirler.
Eğer kullanılan register BP ise SS’de bulunan bir hücre adreslenmiş olur.
Bu duruma örnek verirsek:
BX = 2000H ve register ile adreslenen hafıza hücresinde 2340H olsun.
MOV AX, [BX] ;işlemi yapıldığı zaman

Taban-Artı-Indis Adresleme
Dolaylı adreslemede köşeli parantez içinde kalan BX/BP/SI/DI kaydedicilerine bir indis değeri eklenerek kullanılır.
KOMUT register, [BX/BP/SI/DI+indis]
KOMUT [BX/BP/SI/DI+indis], register
Örnek olarak;
MOVAX, [SI+18]
ADD [DI-8],CX
MOV CX, [SI+DI+5]
MOV AX, [BX+DI]

Adresleme modlarımız bunlar. Umarım açıklayıcı olmuştur. Herhangi bir sorunuz olursa her zaman sorabilirsiniz.

CEVAP VER

Please enter your comment!
Please enter your name here