Adresleme Modları 1
Adresleme Modları İşlenenin nerede olacağını belirtmek için kullanılırlar. Kod çözme aşamasında adresleme yöntemi belirlenir ve işlenenin nerede bulunacağı hesaplanır. Mikroişlemcide bulunan adresleme yöntemlerinin sayısının çokluğu yüksek düzeyli dillerdeki karmaşık işlemlerin daha kolay bir şekilde yerine getirilmesini sağlar. 2
x86 Ailesinin Adresleme Modları 3
Adresleme Modları x86 mikroişlemcileri için etkili yazılım geliştirmede, her komutun kullanmış olduğu adresleme modunu bilmek gerekmektedir. Adresleme modları, veri ve programlara erişim yöntemlerini belirtir. x86 için adresleme modları açıklanırken aşağıdaki komutlar kullanılacaktır : MOV Saklayıcılar arasında veya saklayıcı ile hafıza arasında veri transferi yapar. CALL ve JMP Program akışımının farklı adreslere kaymasını sağlarlar. PUSH ve POP Yığına veri koymak ve almak için kullanılırlar. 4
x86 Veri Adreslme Modları Saklayıcı (Register) Adresleme İvedi (Immediate) Adresleme Doğrudan (Direct) Adresleme Saklayıcı Dolaylı (Register Indirect) Adresleme Taban-Artı-İndis (Base-Plus-Index) Adresleme Saklayıcı Göreceli (Register Relative) Adresleme Taban Göreceli-Artı -İndis (Base Ralative Plus Index) Adresleme 5
x86 Program Adreslme Modları Program Göreceli (Program Relative) Adresleme Doğrudan (Direct) Adresleme Dolaylı (Indirect) Adresleme Bir hafıza hücresinden diğer bir hafıza hücresine transfer yapan bir komut yoktur. 6
x86 Veri Adreslme Modları 7
x86 ailesinin komutlarındaki veri aktarım yönü aşağıda gösterildiği gibidir. MOV hefef, kaynak MOV AX, BX 8
I) Saklayıcı (Register) Adresleme Bu adresleme modu yardımıyla mikroişlemcinin iç saklayıcıları arasında işlemler gerçekleştirilebilir. Komutlarda 8-bit ve 16-bit saklayıcılar karışık olarak kullanılamaz. Bir segment saklayıcısından diğer bir segment saklayıcısına adres aktarımı için MOV komutu kullanılamaz. Ayrıca, bir CS saklayıcısı MOV komutu ile değiştirilemez. (Daha önce de belirtildiği gibi yürütülecek bir sonraki komutun adresi CS:IP çifti tarafından belirlenmekteydi. Eğer ki CS değiştirilirse yürütülecek bir sonraki komutun adresi belirsiz olacaktır.) 9
Assembly Dili MOV AH, BH MOV DH, AL MOV AX, DX MOV SP, BP MOV DS, AX MOV DI, SI MOV BX,DS MOV ES, DS MOV AL, BX MOV CS,AX Yapılan İşlem BH, AL ye kopyalanır. AL, DH ye kopyalanır. DX, AX e kopyalanır. BP, SP ye kopyalanır. AX, DS ye kopyalanır. SI, DI ya kopyalanır. DS, BX e kopyalanır. İzin verilmez (Segment ten segmente) İzin verilmez (Boyutlar farklı) İzin verilmez (CS hedef olamaz) 10
II) İvedi (Immediate) Adresleme Bu modda, veri hafızada olup bir op-code u izler. Veri 8 bit veya 16 bit olabilir. Assembly Dili MOV AL, 23 MOV BX,77H MOV CH, 100 MOV AL, A MOV BX, AB MOV CL, 10101001B Yapılan İşlem Ondalık 23 AL ye kopyalanır. 77h BX e kopyalanır. 100(64h) CH ye kopyalanır. A karakterinin ASCII kod karşılığı AL ye kopyalanır. (41h) A ve B karakterlerinin ASCII kod karşılığı BX e kopyalanır. (4241h) İkili 10101001 verisi CL ye kopyalanır. 11
III) Doğrudan (Direct) Adresleme Bu şekilde olan yöntemde, veri segmentinde (DS) yer alan bir hafıza hücresi ile, AL veya AX saklayıcısı arasında veri aktarımı yapan MOV komutu kullanılır. Örn: MOV AL, DATA DS de bulunan ve ofsetinin DATA sembolü ile belirtilen veri AL saklayıcısına aktarılır. DATA herhangi bir ofset değer olabilir. Eğer ki DATA nı ofset değeri 1234h ise bunu: MOV AL, [1234h] şeklinde de göstermek mümkündür. 12
Örn: MOV AL, [1234h] DS 1000h AX BX AH BH AL,10 BL DS:1234h 10 11234h 13
Örn: Assembly Dili MOV AL, NUMBER1 MOV AX, NUMBER2 MOVE STORE1, AL MOVE STORE2, AX MOV DH, MEM1 MOV BL,[2000h] MOV ES, SEGADR MOV BPMEM,BP Yapılan İşlem DS de bulunan NUMBER1 bellek hücresinin içeriği AL ye kopyalanır. DS de bulunan NUMBER2 bellek hücresinin içeriği AX e kopyalanır. AL nin içeriğini DS de yer alan STORE1 bellek hücresine kopyala AX nin içeriğini DS de yer alan STORE2 bellek hücresine kopyala DS de bulunan MEM1 bellek hücresinin içeriğini DH ye kopyala DS de bulunan 2000h bellek hücresinin içeriğini BL ye kopyala DS de bulunan SEGADR bellek hücresinin içeriğini ES ye kopyala BP yi DS de bulunan BPMEM bellek hücresin e kopyala. 14
IV) Saklayıcı Dolaylı (Indirect) Adresleme Bu adresleme modunda, BX, BP, DI ve SI saklayıcıları ile hafızanın herhangi bir yerinde bulunan bir veri adreslenir. BX, DI ve SI saklayıcıları kullanıldığında bu saklayıcılar DS de bulunan veriyi adreslemektedirler. Eğer kullanılan saklayıcı BP ise SS de bulunan bir hücre adreslenmiş olur. 15
BX= 2000h olsun ve bu saklayıcı ile adreslenen hafıza hücresinde 16 bitlik 2340h bilgisi olsun. DS 0100h MOV AX,[BX] ; işletildiğinde AX BX 23 40 20 00 DS: 2000h [ ] sembolü Assembly dilinde dolaylı adresleme için kullanılır. 40 03000h 23 03001h 16
Örn: Assembly Dili MOV AL, [BX] MOV [BP], CL MOV [DI], BH MOV [DI], [BX] Yapılan İşlem DS alanında bulunan ve BX ile adreslenen bir byte ı AL ye kopyala BP ile adreslenen SS alanındaki hafıza hücresine CL yi kopyala DI ile adreslenen DS alanındaki hafıza hücresine BH ı kopyala Geçersizdir. Çünkü hafızadan hafızaya kopyaya string komutları dışında izin verilmez. (bknz slayt 6) 17
Örn: MOV BX, OFFSET TABLO ; Tabloya işaret et. MOV CX, 50 ; Döngü sayacını yükle TEKRAR : IN AL, INPORT ; Giriş portunu oku MOV [BX], AL ; Veriyi hafızada sakla INC BX ; İşaretçiyi arttır LOOP TEKRAR ; CX=0 oluncaya kadar... döngüyü tekrarla... 18
V) Taban-Artı-İndis (Base-Plus-Index) Adresleme Taban saklayıcılar (BX veya BP) den biri ile bir indis saklayıcısı (DI veya SI) kullanılarak hafıza adreslenir. Taban saklayıcısı, bir hafıza dizisinin başlangıç adresini, indis saklayıcısı ise dizideki verinin göreceli pozisyonunu tutar. 19
Örn: Assembly Dili MOV DX, [BX+DI] MOV CL, [BP+SI] MOV [BX+SI],SP MOV [BP+SI],CS Yapılan İşlem DS alanında bulunan ve BX+DI toplamı ile adreslenen veri DX e kopyalanır. SS alanında bulunan ve BP+SI toplamı ile adreslenen veri CL ye kopyalanır. SP, DS alanında bulunan BX+SI toplamı ile adreslenen alana kopyalanır. CS, SS alanında bulunan ve BP+SI toplamı ile adreslenen yere kopyalanır. 20
Örn: Aşağıda verilen örnek program ARRAY adlı bir dizinin 10 numaralı elemanını 30 numaralı hafıza hücresine taşımaktadır. MOV BX, OFFSET ARRAY ; Tabloya işaret et. MOV DI, 10 ; Dizi elemanının yeri 10 MOV AL, [BX+DI] ; 10. elemanı oku MOV DI, 30 ; Dizi elemanın yeri 30 MOV [BX+DI], AL ; Elemanı 30. konuma yerleştir. 21
VI) Saklayıcı Göreceli (Register Relative) Adresleme Hafıza segmentinde bulunan veri, bir taban veya indis saklayıcısına (BX, BP, DI veya SI) bir değişim değerinin toplanmasıyla adreslenir. Örn: Assembly Dili MOV AX, [DI+100] MOV ARRAY[SI], AL MOV DI, LIST[BX] Yapılan İşlem DS alanında bulunan ve DI+100 toplamı ile adreslenen veri AX e kopyalanır. AL, DS alanında bulunan ve ARRAY+SI ile adreslenen yere kopyalanır. DS alanında bulunan ve LIST ile BX toplamı ile adreslenen veri DI ye kopyalanır. 22
VII) Taban Göreceli-Artı İndis (Base Relative-Plus Index) Adresleme Bu mod, taban artı indis adreslemeye benzemektedir. Farklı olarak, bir taban saklayıcısına bir indis saklayıcısının içeriğinin eklemenin yanısıra bir değişim adresi (displacement) ekler. Örn: Assembly Dili MOV CH, [BX+DI+10] MOV AX, FILE[BX+DI] MOV LIST[BP+SI+4], AH Yapılan İşlem DS de bulunan ve BX+DI+10 ile ifade edilen yerdeki veriyi CH a kopyalar. DS de bulunan ve FILE, BX, DI toplamı ile adreslenen veriyi AX e kopyalar. AH nin içeriği, SS te bulunan ve LIST, BP, DI ve 4 toplamı ile adreslenen yere kopyalanır. 23
Örn: Aşağıda verilen örnek program bir dosyadaki (FILE) kayıt A nın 10 numaralı elemanını, yine aynı dosyada yer alan kayıt C nin 20 numaralı elemanına kopyalamaktadır. MOV BX, OFFSET RECA ; Kayıt A adresi MOV DI, 10 ; Kayıt elemanının yeri MOV AL, FILE [BX+DI] ; Kayıt A nın 10 numaralı elemanını oku MOV BX, OFFSET RECC ; Kayıt C adresi MOV DI, 20 ; Kayıt elemanının yeri MOV FILE[BX+DI], AL ; Kayıdı C nin 20 numaralı konumuna sakla 24
REC C DI=20 BX REC B REC A DI=10 BX FILE Taban 25
x86 Program Adreslme Modları 26
Program Adreslme Modları JMP ve CALL komutlarıyla kullanılmaktadır. 3 değişik şekle sahiptir: Doğrudan Göreceli Dolaylı 27
I) Doğrudan Program Hafıza Adresleme Doğrudan program hafıza adreslemedeki komutlarda, 8085A mikroişlemcisinde olduğu gibi dallanma adresi op-code ile beraber hafızada saklanır. 8086/8088 ve sonraki kuşak x86 ailesinde bir hafıza adresi CS:IP çifti ile belirlendiğinden, eğer segmentler arası bir dallanma söz konusu ise 2 byte bir sonraki segmet numarası için sonraki 2 byte ise bir sonraki offset için kullanılır. Örn: Op-code Offset-Low Offset-High Segmet- Low Segment- High EA 00 00 00 20 JMP [2000] komutundaki işlem kodu ile segment ve offset adreslerinin hafızada yerleşimi 28
II) Göreceli Program Hafıza Adresleme Bu adresleme modu komut işaretçisine göre görecelidir. Örn: 2000 2001 EB 02 JMP[2] İşlemci JMP komutunu yürütürken IP 2002h adresine işaret etmektedir. 2002 2003 2004 - - IP göreceli adres 2 ile toplandıktan sonra 2004h olur ve program akışı bu adresten itibaren devam eder. 29
III) Dolaylı Program Hafıza Adresleme Bu modda, 16-bit saklayıcılardan herhangi biri veya bir göreceli saklayıcı ile veya bir yer değişim değeri ile beraber kullanılabilir. Örn: Assembly Dili JMP AX JMP [BX] JMP TABLE[BX] Yapılan İşlem O anki kod segment içinde, AX ile adreslenen hafıza bölgesine dallan. O anki kod segment içinde, BX ile işaretli DS de yer alan bir ofset ile adreslenen yere dallan. O anki kod segment içinde, TABLE+BX ile işaretli DS de yer alan bir ofset ile adreslenen yere dallan. 30
Örn: TABLE adresli yerden başlayan bir dallanma tablosu aşağıdaki gibi olsun. TABLE DW SUB0 DW SUB1 DW SUB2 DW SUB3 Her adres 2-byte offsettir. Bu şekilde tanımlı bir tabloya erişmek için, genelde program içinde bir offset hesaplanır, sabit tablo taban adresi ile toplanarak bir alt program adresi seçilir ve o adrese dallanılır. MOV BX, 4 JMP TABLE [BX] SUB2 ye dallanmak için gerekli olan yapı 31
Yığın Hafıza Adreslemesi 32
Yığın Hafıza Verileri geçici olarak tutar, alt programlardan dönüş adreslerini saklar. Yığın hafıza 8086/8088 ve diğer pekçok mikroişlemcide LIFO (Last in First Out) prensibine göre çalışır. Bir PUSH komutu ile veri yığın üstüne yerleştirilir. POP komutuyla veri, yığından çekilir. CALL komutunda, alt programın işletilmesinden sonra dönülecek olan adres yığında saklanır. RET komutu yığından bir adresin okunmasına neden olur. Yığın alanındaki bir veri SS:SP saklayıcı çifti ile gösterilir. 33
Örn: Assembly Dili Yapılan İşlem PUSH AX PUSH 4321h PUSH DS PUSHF PUSH [BX] POP BX AX içeriğini yığına sakla Yığına 4321h sayısını sakla DS nin bir kopyasını yığına sakla Bayrak saklayıcısını yığına sakla DS de bulunan ve BX ile adreslenen yerdeki veri, yığına aktarılır Yığından BX saklayıcısına oku POP CS Geçersizdir. (bknz slayt 7) POPF Yığından bayrak saklayıcısına oku 34