![]() |
|
|
| ||||||
|
Görüntüleme: 57 - Cevaplar: 1
| LinkBack | Seçenekler | Stil |
| | #1 (permalink) |
| Yeni Üye ![]() ![]() ![]() ![]() (TARKAN) Şuan Çevrimdışı Kayıt Tarihi: Nov 2006 Mesajlar: 167
Rep Gücü: 3
Rep Puanı: 3
Rep Derecesi: | ADRESLEME MODLARI 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ış vs. İşte bilgisayarın donanım ve yazılım düzeyinde 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 ilk basamağı olan adresleme modları da bu konuları kapsıyor. Her mikroişlemci üreticisi bir mikro işlemci piyasaya sürdüğünde, komut setini ve adresleme modlarınıda yayınlar. Programcılar da bu belgelere göre programlarını yazarlar. Intel 8086 işlemcisini piyasaya sürdüğünde oldukça kullanışlı bir dizi adresleme modu sağladı. Intel’in şu ana kadar ürettiği işlemcilerde bu adresleme modlarını kullanabilirsiniz. Daha sonraları bir devrim niteliğinde olan 80386 işlemcisi ile ek adresleme modlarıda geldi. Bu özel adresleme modları sadece 386 ve sonrası işlemcilerde kullanılabilir. Tabi ki bu ek adresleme modları ile assembly programlama dili daha esnek bir yapıya bürünmüştü. Bizde bu makalemizde adresleme modlarını 386 öncesi ve sonrası olarak ikiye ayıracağız. Şu ana kadar yaptığımız programlarda çok fazla komut örneği görmediniz ama makalelerimizi takip ettiyseniz MOV komutunu yakından tanımanız lazım. MOV komutu assembly programlama dilinde en çok kullanılan komutların başında gelir. Çünkü bir program çalışırken genelde hafızaya yazar yada okur. MOV komutu da bu iş için biçilmiş kaftandır ve bu kadar çok kullanıldığından dolayı bir çok adresleme modunu destekler, yani bu komut ile hafızaya çok değişik yollardan erişebilirsiniz. Bu yüzden bu makalede adresleme modlarını anlatırken MOV komutunu örnek alacağım. MOV komutunun genel kullanım şekli; MOV hedef, kaynak 8086 ADRESLEME MODLARI: 8086 Kaydedici Adresleme: 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 değil işlemcinin içinde gerçekleşir. Genel amaçlı ve indeks kaydedicilerde kaydedici adresleme modları: mov ax, bx ; BX teki değeri AX’e kopyalar mov dl, al ; AL teki değeri DL’ye kopyalar mov si, dx ; DX teki değeri SI’ya kopyalar mov sp, bp ; SP deki değeri BP’ye kopyalar mov dh, cl ; CL deki değeri DH’a kopyalar mov ax, ax ; Bu da doğru bir kullanımdır! 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 al, bx ; yanlış kullanım, ; derleme anında assembler hata verir. Fakat küçük boyuttaki kaynaktan büyük boyuttaki hedefe kopyalama yapılabilir. mov cx, al ; Doğru kullanım, ; AL’deki değer CL’ye kopyalanır. Bunlara ek olarak segment kaydedicilerinin kullanımında dikkat edilmesi gereken noktalar vardır. 1- Segment kaydedicileri arasında bir transfer işlemi ancak genel amaçlı bir kaydedici vasıtasıyla yapılabilir. mov ds,cs ; doğru kullanılmayan segment ; kaydedicisi şeklinde assembler hata verir! Bu işi yapmak için, mov ax,cs mov ds,ax komut satırları kullanılabilir. 2- CS ve IP kaydedicilerinin değeri kaydedici adresleme ile değiştirilemez mov cs, ax ; kaynak genel amaçlı kaydedici olmasına ; rağmen bu işlem mümkün değildir! Segment kaydedicileri programın icrası aşamasında hafızanın segment olarak adlandırılan bölümlerinin adreslerini tuttuklarından, bu kaydedicileri verilerinizi saklamak veya taşımak için kullanmanızı tavsiye etmem, kullanılmamalıdırlar. Bunun yerine genel amaçlı kaydedicileri kullanmanız daha uygun olur. 8086 Hafıza Adresleme Modları a- Acil Adresleme ( Immediate Addressing ) Herhangi bir genel amaçlı veya indeks kaydedicisine doğrudan bir değer yükleye bilirsiniz. Yüklenecek olan veri kod segmentten alınacağından bu tür kullanımları şahsen ben pek tavsiye etmem. İyi bir program organizasyonu için, veriler hafızanın ayrı bir bölümünde (mesela data segmentte) değişkenler veya sabitler olarak belirtilmelidir. mov al, 17 ; AL’ye 11h yüklenir. b- Direkt Adresleme (Displacement Only Addressing ) Acil adreslemenin doğru kullanılmış şeklidir. Bu adreslemede segment fset adresi kullanılarak hafızaya erişilir.mov al, ds:12 ; ds:000C adresinden ; 1 byte AL’ye kopyalanır. mov ds:12, al ; AL’nin içeriği ds:000C adresine kopyalanır. mov ax, ds:12 ; ds:000C adresinden 2 byte AX’e ; kopyalanır. mov ds:12, ax ; AX’nin içeriği ds:000C adresinden itibaren ; kopyalanır (2 byte) Aslında kaynak kod hazırlanırken genelde bu şekilde bir kod yazımı yapılmaz. Değişkenler ve sabitler sembolik kelimelerle ifade edildiğinden buna gerek yoktur. Ne var ki debugger programlarında da sembolik değişken isimlerini değil adresleri görürüz. Aşağıdaki kod parçasını inceleyin; .data sayi1 db 5 .code mov ax, @data mov ds, ax mov al, sayi ; 5 değerini al’ye yükler. mov al, ds:0000 ; aynı işi yapar yani 5’i AL’ye yükler. ; veriler tanımlanırken sayi1 db 5 şeklinde ; değil de sadece db 5 yazılsaydı, bu ; komutu kullanmak zorunda kalırdık. c- Kaydedici Dolaylı Adresleme ( Register Indirect Addressing ) Adının kaydedici olduğuna aldanmayın. Burada operand olarak kullanılan kaydedici köşeli parantez içine alınır ve bu andan itibaren bir offset adresi oluverir. mov al, [bx] ; hafızadan AL’ye 1 byte taşınır. Alınacak verinin offset adresi BX’in değeridir. mov al, [bx] mov al, [si] mov al, [di] mov al, [bp] Yukarıdaki 4 örnekte AL’ye kopyalanacak verilerin offset adresleri ilgili kaydedicinin içindeki değerdir. Segment adresleri ise ilk üçünün DS sonuncusunun SS’dir. BP indeks kaydedicisi yalnız başına hafıza adreslemede kullanılırsa, daima stack segmentin (SS) offset adreslerini gösterir. Fakat BP kaydedicisi de dahil olmak üzere bu adresleme segment kaydedicileri de belirtilerek yapılırsa, o zaman ilgili segment ffset adresine erişilmiş olunur.BX=0000, BP=0001, SI=0002, DI=0003 olduğunu varsayalım; mov al, cs:[bx] ; AL’ye CS:0000’dan kopyalama yapılır mov al, [bx] ; AL’ye DS:0000’dan kopyalama yapılır mov al, ds:[bp] ; AL’ye DS:0001’den kopyalama yapılır mov al, [bp] ; AL’ye SS:0001’den kopyalama yapılır mov al, ss:[si] ; AL’ye SS:0002’den kopyalama yapılır mov al, [si] ; AL’ye DS:0002’den kopyalama yapılır mov al, es:[di] ; AL’ye ES:0003’den kopyalama yapılır mov al, [di] ; AL’ye DS:0002’dan kopyalama yapılır d- İndeksli adresleme ( Indexed Addressing ) Kaydedici dolaylı adreslemenin operandına sabit bir değer eklenmiş halidir. Kullanım şekli; mov al, disp[bx] mov al, disp[bp] mov al, disp[si] mov al, disp[di] Not : disp kısaltması İngilizcede displacement kelimesinin karşılığıdır. Buradaki anlamı ise referans alınan ofset adresidir. Komut setlerinde adresleme modları açıklanırken disp veya mem kısaltması ile çok sık karşılaşacağınızdan, komutları yazarken İngilizce ifadeler kullanmak durumunda kaldım. Mesela BX=2000h olsun, mov dl, 20h[bx] şeklinde bir komut kullanıldığında, DS:2020h adresindeki 1 byte'lık değer dl’ye kopyalanacaktır. Aynı şekilde BP=3030h olduğunu varsayalım, mov dh,1020h[bp] gibi bir komut ile, SS:4050h adresindeki 1 byte’lık değer dh’a kopyalanır. Bu adresleme modunda da BP segment kaydedicisi daima SS’in ofsetlerini gösterir. Fakat kaydedici dolaylı adreslemede de olduğu gibi bizzat segment kaydedicisinide belirterek bu adresleme modunu kullanabiliriz. Bu durumda ofset adresleri komutta belirtilen segmentin ofseti olur. mov al, ss:disp[bx] ; BX normalde DS’nin ofsetlerini ; gösterirken burada SS’in ofseti ; olmuş. mov al, es:disp[bp] ; BP normalde SS’nin ofsetlerini ; gösterirken burada ES’in ofseti ; olmuş. mov al, cs:disp[si] ; SI normalde DS’nin ofsetlerini ; gösterirken burada CS’in ofseti ; olmuş. mov al, ss:disp[di] ; DI normalde DS’nin ofsetlerini ; gösterirken burada SS’in ofseti ; olmuş. |
|
| Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| Seçenekler | |
| Stil | |
| |
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16]