Bölüm 4: Bellek Erişimi
Giriş
Öğrenme Çıktıları
BX, SI, DI, BP ve ileri kaydırma ile geçerli bellek işlenenleri oluşturmak.
Etkin adresi ve kesim:bağıl konumdan fiziksel adresi hesaplamak.
byte ptr / word ptr ile erişim boyutunu belirtmek; little-endian düzeni okumak.
Geçerli işlenen kombinasyonlarını ayırt etmek ve kopyalama/takas programlarını izlemek.
Adresleme Modları
Bellek Erişimi
- Belleğe erişmek için BX, SI, DI, BP yazmaçları kullanılır.
- Bu yazmaçlar (ve bir sabit)
[ ]sembolleri içinde birleştirilerek farklı bellek konumlarına erişilir; bu birleştirmelere adresleme modları denir.
| Yalnız yazmaç(lar) | + d8 (8 bit kaydırma) | + d16 (16 bit kaydırma) |
|---|---|---|
| [BX + SI] | [BX + SI + d8] | [BX + SI + d16] |
| [BX + DI] | [BX + DI + d8] | [BX + DI + d16] |
| [BP + SI] | [BP + SI + d8] | [BP + SI + d16] |
| [BP + DI] | [BP + DI + d8] | [BP + DI + d16] |
| [SI] | [SI + d8] | [SI + d16] |
| [DI] | [DI + d8] | [DI + d16] |
| d16 (doğrudan adres) | [BP + d8] | [BP + d16] |
| [BX] | [BX + d8] | [BX + d16] |
24 kombinasyon, 8086 makine kodundaki mod/rm alanının tüm bellek seçenekleridir. [BP] tek başına yazılırsa assembler onu [BP + 0] (d8 = 0) olarak kodlar.
Adresleme Modları
Kombinasyon Kuralı
- BX ve BP aynı modda bir araya gelmez.
- SI ve DI aynı modda bir araya gelmez.
- SS kesimi BP ile, DS kesimi BP içermeyen modlarla kullanılır.
[BX+5]→ taban + d8 (DS)[BX+SI]→ taban + indis (DS)[DI+BX-4]→[BX+DI-4], sıra önemsiz (DS)[BP+SI+300]→ taban + indis + d16 (SS)
Adresleme Modları
İleri Kaydırma (Displacement)
22, 55h, -1.300, 5517h, -259.- Kaydırma bir sayı ya da bir değişkenin bağıl konumu (offset) olabilir:
[BX + dizi]. - Birden fazla değer varsa assembler tek bir değer hesaplar:
[BX + 2 + 3]→[BX + 5]. - Kaydırma
[ ]içinde veya dışında yazılabilir; assembler aynı makine kodunu üretir:[BX+5]=5[BX]=[BX]+5. - İşaretli bir değerdir; pozitif ya da negatif olabilir:
[SI-1]. - Assembler değer −128…127 aralığındaysa kısa (d8), değilse uzun (d16) biçimi seçer.
[BX+2] → EA = 0001h.Adresleme Modları
Geçerli mi, Geçersiz mi?
| Geçerli | Açıklama |
|---|---|
[BX] | yazmaç dolaylı |
[1234h] | doğrudan adres |
[SI+10] | indisli |
[BP+DI-2] | tabanlı-indisli (SS) |
ES:[BX+SI] | kesim önekli |
| Geçersiz | Neden? |
|---|---|
[AX], [CX], [DX] | adreslemede kullanılamaz |
[BL], [BH] | 8 bitlik yazmaç adres olamaz |
[BX+BP] | iki taban yazmacı |
[SI+DI] | iki indis yazmacı |
[SP], [BX*2] | 8086'da yok (80386+) |
Tablo kullanılarak tüm geçerli kombinasyonlar oluşturulabilir: taban (BX/BP) + indis (SI/DI) + kaydırma, her biri isteğe bağlı.
Adresleme Modları
Adresleme Modu Türleri
| Mod | Örnek | İşlenen nerede? |
|---|---|---|
| Dolaysız (immediate) | MOV AX, 5 | komutun içinde (sabit) |
| Yazmaç (register) | MOV AX, BX | yazmaçta |
| Doğrudan (direct) | MOV AX, [1000h] | DS:1000h |
| Yazmaç dolaylı | MOV AX, [BX] | DS:BX |
| Tabanlı (based) | MOV AX, [BP+4] | SS:BP+4 |
| İndisli (indexed) | MOV AL, [SI+3] | DS:SI+3 |
| Tabanlı-indisli | MOV AL, [BX+DI] | DS:BX+DI |
| Tabanlı-indisli + kaydırma | MOV AL, [BX+SI+8] | DS:BX+SI+8 |
İlk ikisi belleğe gitmez; geri kalanlar etkin adres (EA) hesaplar. Fiziksel adres = kesim × 10h + EA.
Adresleme Modları
Etkin Adres Adım Adım
MOV AL, [BX + SI + 4] · DS = 1000h, BX = 0200h, SI = 0030h
Taban yazmacı BX = 0200h.
İndis yazmacı SI = 0030h eklenir.
8 bitlik ileri kaydırma: +4.
Etkin adres EA = 0200h + 0030h + 0004h = 0234h (16 bit).
BP yok → kesim DS. Fiziksel adres = 10000h + 0234h = 10234h. AL bu adresteki baytı alır.
Adresleme Modları
BP ile Erişim
MOV AX, [BP + DI - 2] · SS = 2000h, BP = 0100h, DI = 0010h
Taban yazmacı BP = 0100h.
İndis yazmacı DI = 0010h eklenir.
İşaretli kaydırma −2 (makine kodunda FEh).
EA = 0100h + 0010h − 2 = 010Eh.
BP kullanıldığı için kesim SS: 20000h + 010Eh = 2010Eh. AX ← [2010Eh] (2 bayt: 2010Eh ve 2010Fh).
Adresleme Modları
Etkin Adres Hesaplayıcı
Yazmaç değerleri onaltılık; kaydırma onlu (-2) ya da onaltılık (1Ah) girilebilir.
Kesim ve Bağıl Konum
Kesim ve Bağıl Konum
- Kesim yazmacındaki (CS, DS, SS, ES) değere kesim (segment), adresi veren yazmaçlardaki (BX, SI, DI, BP) değere bağıl konum (offset) denir.
- Kesim belleğin bir bloğunu, bağıl konum o bloktaki belirli bir konumu temsil eder; ikisi birleşerek fiziksel adresi oluşturur.
DS = 1234h, SI = 7890h. Gösterim: 1234:7890.
Kesim 10h ile çarpılır (4 bit sola kaydırma): 12340h.
Bağıl konum eklenmek üzere hizalanır: 7890h.
12340h + 7890h = 19BD0h fiziksel adres.
Kesim ve Bağıl Konum
Kesim Öneki
Varsayılan kesim, köşeli parantez önüne kesim öneki yazılarak değiştirilebilir:
MOV AX, 0B800h MOV ES, AX ; ES = video belleği MOV BX, 0 MOV AL, ES:[BX] ; ES:0000'dan oku MOV AL, [BX] ; DS:0000'dan oku MOV DL, SS:[SI] ; SS:SI'dan oku
Önek, makine kodunda komutun önüne eklenen 1 baytlık bir koddur (ES: → 26h, CS: → 2Eh, SS: → 36h, DS: → 3Eh).
- DS'yi değiştirmeden başka bir kesimdeki veriye (ör. video belleği) erişmek.
- Yığındaki veriye BP dışındaki bir yazmaçla erişmek:
SS:[BX]. - Koddaki bir tabloya erişmek:
CS:[SI].
IP her zaman CS ile, SP her zaman SS ile kullanılır; bunlar değiştirilemez.
Veri Türü
Veri Türü Belirtme
- Derleyiciye erişilecek verinin boyutunu bildirmek için ön ekler kullanılır:
byte ptr [BX]: bir bayt (8 bit) erişimi.word ptr [BX]: iki bayt (16 bit, bir sözcük) erişimi.
- emu8086 daha kısa önekleri de destekler:
b.[SI]: SI'nın gösterdiği adresteki değeri bir bayt olarak yorumlar.w.[DI]: DI'nın gösterdiği adresteki değeri iki bayt olarak yorumlar.
- Bazı durumlarda assembler türü kendisi çıkarır: diğer işlenen bir yazmaçsa boyutu odur.
| Komut | Boyut nereden belli? |
|---|---|
MOV [BX], AL | AL 8 bit → bayt yazılır |
MOV [BX], AX | AX 16 bit → sözcük yazılır |
MOV [BX], 5 | belirsiz! → MOV BYTE PTR [BX], 5 ya da MOV WORD PTR [BX], 5 |
Veri Türü · Kodu adım adım çalıştır
Kod İzleme: byte ptr ve word ptr
BX = 0200h. Bellekte önceki değerler (AA BB CC DD) duruyor.
word ptr: 2 bayt yazılır. Düşük bayt (34h) düşük adrese: 34 12.
byte ptr: yalnızca 0200h değişir → FF 12. 0201h'ye dokunulmaz.
Aynı sabit, word ptr: 00FFh yazılır → FF 00. 0201h de değişti!
AX 16 bit olduğundan boyut belli: AX = 00FFh (0201h üst bayt).
CL 8 bit: [BX+1] = 0201h'deki bayt → CL = 00h.
MOV BX, 0200h MOV WORD PTR [BX], 1234h MOV BYTE PTR [BX], 0FFh MOV WORD PTR [BX], 0FFh MOV AX, [BX] ; sözcük MOV CL, [BX+1] ; bayt
Veri Türü
Little-Endian Düzen
- 8086 little-endiandir: 16 bitlik bir değerin düşük baytı düşük adreste, yüksek baytı bir sonraki adreste saklanır.
MOV [0200h], AX→ [0200h] = AL, [0201h] = AH.MOV AX, [0200h]tersini yapar.- emu8086'nın bellek penceresinde sözcükler bu yüzden “ters” görünür: 1234h →
34 12. - Bu kural makine kodundaki sabitler için de geçerlidir:
MOV AX, 1234h→B8 34 12.
MOV Komutu
MOV Komutu
MOV hedef, kaynak: kaynaktaki değeri hedefe kopyalar; kaynak değişmez.- Kaynak: dolaysız değer (sabit), genel amaçlı yazmaç, kesim yazmacı ya da bellek konumu.
- Hedef: genel amaçlı yazmaç, kesim yazmacı (CS hariç) ya da bellek konumu.
- CS ve IP yazmaçlarına değer atamak için kullanılmaz.
- İki işlenenin boyutu aynı olmalıdır: ikisi de bayt ya da ikisi de sözcük.
- İki işlenen birden bellek olamaz.
- MOV bayrakları etkilemez.
MOV BYTE PTR [SI], 10h.MOV Komutu
Desteklenen İşlenenler
Genel amaçlı
MOV REG, memory MOV memory, REG MOV REG, REG MOV memory, immediate MOV REG, immediate
Kesim yazmaçları
MOV SREG, memory MOV memory, SREG MOV REG, SREG MOV SREG, REG
| REG | AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP |
| SREG | DS, ES, SS ve CS (CS yalnızca ikinci işlenen, yani kaynak olarak) |
| memory | [BX], [BX+SI+7], değişken… |
| immediate | 5, -24, 3Fh, 10001101b… |
Dikkat: MOV SREG, immediate ve MOV SREG, SREG yoktur; değer önce bir genel yazmaca alınır.
MOV Komutu
MOV: Geçerli mi?
| Komut | ? | Komut | ? |
|---|---|---|---|
MOV [BX], [SI] | 1 | MOV AX, CS | 6 |
MOV DS, ES | 2 | MOV SP, BX | 7 |
MOV DS, 100h | 3 | MOV BL, DX | 8 |
MOV CS, AX | 4 | MOV AL, [SI+BP] | 9 |
MOV [BX], 5 | 5 | MOV 5, AX | 10 |
Cevaplar
- Geçersiz: bellekten belleğe MOV yok →
MOV AL,[SI]·MOV [BX],AL. - Geçersiz: kesimden kesime yok →
MOV AX,ES·MOV DS,AX. - Geçersiz: kesime sabit atanamaz.
- Geçersiz: CS hedef olamaz (JMP FAR kullanılır).
- Boyut belirsiz →
BYTE PTR/WORD PTRgerekir. - Geçerli (CS kaynak olabilir). 7. Geçerli (ama yığını bozabilir). 8. Geçersiz: boyutlar farklı. 9. Geçerli:
[BP+SI], kesim SS. 10. Geçersiz: hedef sabit olamaz.
Program Örneği
Program Örneği
ORG 100h ; .com programı için MOV AX, 0B800h ; AX = B800h MOV DS, AX ; DS = B800h MOV CL, 'A' ; CL = 41h MOV CH, 11011111b ; CH = DFh MOV BX, 15Eh ; BX = 015Eh MOV [BX], CX ; B800:015E ← CX RET ; DOS'a dön
- Program, video belleği üzerinde belirli bir konuma 'A' harfini yazar.
MOV, kaynak ve hedef arasında değer kopyalar.ORG, programın başlangıç adresini belirler (makine koduna çevrilmez).;yorum satırları için kullanılır.- DS'ye sabit doğrudan atanamadığı için B800h önce AX'e yüklenir.
| Komut | Makine kodu | Komut | Makine kodu |
|---|---|---|---|
MOV AX, 0B800h | B8 00 B8 | MOV CH, 11011111b | B5 DF |
MOV DS, AX | 8E D8 | MOV BX, 15Eh | BB 5E 01 |
MOV CL, 'A' | B1 41 | MOV [BX], CX · RET | 89 0F · C3 |
Program Örneği · Kodu adım adım çalıştır
Kod İzleme: Ekrana 'A' Yazmak
Ekran boş: her hücre 20h (boşluk) + 07h (siyah zemin üzerine gri yazı).
AX = B800h (renkli metin ekranının kesimi).
DS = AX = B800h. Artık [ ] erişimleri video belleğine gider.
CL = 'A' = 41h (ASCII kodu).
CH = 11011111b = DFh: renk (öznitelik) baytı.
BX = 015Eh = 350: ekrandaki konumun bağıl adresi.
CX = DF41h sözcük olarak yazılır: [015Eh] = 41h ('A'), [015Fh] = DFh (renk). Fiziksel: B8000h + 15Eh = B815Eh.
RET: DOS'a dönülür; 'A' harfi ekranda kalır.
ORG 100h MOV AX, 0B800h MOV DS, AX MOV CL, 'A' MOV CH, 11011111b MOV BX, 15Eh MOV [BX], CX RET
Program Örneği
Metin Modu Video Belleği
MOV Örnekleri · Kodu adım adım çalıştır
Bellekten Bir Değeri Yazmaca Taşıma
DS = 0700h. DS:1000h'de CD AB baytları var. IP = 0100h.
MOV AX,[1000h]: iki bayt okunur, little-endian → AX = ABCDh. Komut 3 bayt → IP = 0103h.
Bellek değişmedi; MOV yalnızca kopyalar. Fiziksel adres: 07000h + 1000h = 08000h.
ORG 100h MOV AX, [1000h] ; A1 00 10 RET
MOV Örnekleri
emu8086'da Görünüm
- Sol: yazmaçlar (H/L yarıları ayrı).
CS = DS = 0700h,IP = 0100h,SP = FFFEh. - Orta: bellek (fiziksel adres
07100h= 0700:0100).A1 00 10komutun 3 baytıdır. - Sağ: ayrıştırılmış (disassembled) kod:
MOV AX, [01000h], ardındanRET(C3). - single step ile komut yürütülür; değişen yazmaçlar renklenir.
- Bellek boş olduğundan bu ekranda AX = 0000h kalır.
![emu8086 öykünücü penceresi: yazmaçlar, 07100h adresinde A1 00 10 baytları ve MOV AX, [01000h] komutu.](img/bolum04_bellek_erisimi/s12_2.webp)
emu8086 öykünücü penceresi
MOV Örnekleri · Kodu adım adım çalıştır
Yazmaçtaki Değeri Belleğe Taşıma
DS:2000h boş (00 00).
BX = 1234h; IP = 0103h.
BX belleğe yazılır: [2000h] = 34h, [2001h] = 12h. Komut 4 bayt → IP = 0107h.
BX değişmedi. Fiziksel adres: 07000h + 2000h = 09000h.
ORG 100h MOV BX, 1234h ; BB 34 12 MOV [2000h], BX ; 89 1E 00 20 RET
MOV Örnekleri · Kodu adım adım çalıştır
İki Yazmaç Değerini Takas
CX = 10 = 000Ah (sayılar varsayılan olarak onludur).
DX = 20 = 0014h.
XCHG iki işleneni tek komutta değiştirir: CX = 0014h, DX = 000Ah. Bayraklar etkilenmez.
MOV CX, 10 ; CX = 000Ah MOV DX, 20 ; DX = 0014h XCHG CX, DX ; takas
MOV Örnekleri
XCHG Kuralları
- Yazmaç ↔ yazmaç:
XCHG AX, BX - Yazmaç ↔ bellek:
XCHG AL, [SI] - Bellek ↔ bellek yok.
- Kesim yazmaçları ve sabitler kullanılamaz.
- Boyutlar aynı olmalı; bayraklar değişmez.
XCHG AX, regtek baytlık komuttur (XCHG AX, AX=NOP= 90h).
XCHG olmasaydı takas için geçici bir yazmaç gerekirdi:
MOV AX, CX ; AX ← CX (yedek) MOV CX, DX ; CX ← DX MOV DX, AX ; DX ← eski CX
3 komut ve bir yazmaç daha harcanır; XCHG bunu tek komutta yapar.
MOV Örnekleri · Kodu adım adım çalıştır
Bir Yazmaca Başka Yazmacın İçeriğini Kopyalama
SI'ya bir bellek adresi (bağıl konum) atanır: 3000h.
DI = SI = 3000h. Kopyalanan şey adrestir, bellekteki veri değil.
Artık SI ve DI aynı hücreyi gösterir: AL = [3000h] = 5Ah.
[DI+1] = 3001h'ye AL yazılır → 5A 5A.
MOV SI, 3000h ; SI = adres MOV DI, SI ; DI = SI MOV AL, [SI] ; DS:3000h MOV [DI+1], AL ; DS:3001h
MOV Örnekleri · Kodu adım adım çalıştır
Bir Bellek Adresine Sabit Bir Değeri Yazma
DS:4000h … 4003h: 00 99 00 99.
65 = 41h = 'A' tek bayt olarak yazılır. Makine kodu C6 06 00 40 41 (5 bayt) → IP = 0105h. [4001h] değişmez.
WORD PTR: 0041h yazılır → [4002h] = 41h, [4003h] = 00h (99h ezildi). Komut 6 bayt → IP = 010Bh.
Sabitin boyutu yoktur; boyutu PTR öneki belirler.
ORG 100h MOV BYTE PTR [4000h], 65 ; 'A' MOV WORD PTR [4002h], 65 RET
MOV Örnekleri · Kodu adım adım çalıştır
Bir Yazmacın Alt Baytını Diğerine Kopyalama
AX = 1234h: AH = 12h, AL = 34h.
Etkiyi görmek için BX = FFFFh.
AL (AX'in alt baytı) BL'ye kopyalanır: BL = 34h. BH değişmez → BX = FF34h.
MOV AX, 1234h ; AH = 12h, AL = 34h MOV BX, 0FFFFh MOV BL, AL ; yalnız BL
MOV Örnekleri · Kodu adım adım çalıştır
Bir Yazmacın Üst Baytına Ekleme
AX = 00FFh.
AH = 00h + 01h = 01h → AX = 01FFh. Sonuç sıfır değil, elde yok.
AL = FFh + 1 = 00h, CF = 1, ZF = 1. Elde AH'ye geçmez: AX = 0100h.
Karşılaştırma için AX yeniden 01FFh. MOV bayrakları değiştirmez.
16 bitlik toplama: 01FFh + 1 = 0200h; elde AL'den AH'ye geçti, CF = 0.
MOV AX, 00FFh ; AH = 00h, AL = FFh ADD AH, 01h ; yalnız AH ADD AL, 01h ; yalnız AL MOV AX, 01FFh ADD AX, 1 ; 16 bit
MOV Örnekleri · Kodu adım adım çalıştır
İkilik, Sekizlik ve Onaltılık Değer Atama
00000101b = 5 → AL = 05h.
0Ah = 10 → BL = 0Ah. Harfle başladığı için başta 0 var.
10o (sekizli) = 1×8 + 0 = 8 → CL = 08h.
AL = 5 + 10 = 15 = 0Fh. PF = 1 (0000 1111: dört adet 1).
AL = 15 − 8 = 7 = 07h. Ödünç yok → CF = 0; PF = 0 (üç adet 1).
mov al, 00000101b ; ikili mov bl, 0ah ; onaltılık mov cl, 10o ; sekizli add al, bl ; 5 + 10 = 15 sub al, cl ; 15 - 8 = 7
MOV Örnekleri
Sayı Yazımı
| Taban | Sonek | Örnek | Onlu değer |
|---|---|---|---|
| Onlu (decimal) | yok ya da d | 25, 25d | 25 |
| İkili (binary) | b | 00011001b | 25 |
| Sekizli (octal) | o ya da q | 31o | 25 |
| Onaltılı (hexadecimal) | h | 19h, 0FFh | 25, 255 |
| Karakter | ' ' | 'A' | 65 (41h) |
0Ah, 0B800h. Aksi hâlde Ah, AH yazmacıyla; B800h bir etiketle karışır. emu8086 ayrıca 0x1000 biçimini de kabul eder.Özet
Özet
Özet
Alıştırmalar
- DS = 3000h, BX = 0010h, SI = 0005h:
[BX+SI+20h]için EA ve fiziksel adres? - SS = 4000h, BP = FFFEh:
[BP+4]için EA ve fiziksel adres? [BX+BP],[DI+SI],[BX+DI+300],[DX]modlarından hangileri geçerli?- [0500h] = 78h, [0501h] = 56h ise
MOV AX,[0500h]sonrası AX?MOV AL,[0501h]sonrası AL? - Ekranın satır 10, sütun 40 konumuna yeşil zemin üzerine sarı 'X' yazan kodu yazın (renk 2Eh).
- DS'yi değiştirmeden ES ile video belleğine yazmak için önceki programı nasıl değiştirirsiniz?
Cevaplar
- EA = 0035h; fiziksel = 30000h + 0035h = 30035h.
- EA = FFFEh + 4 = 0002h (başa sarar); fiziksel = 40002h.
- Yalnızca
[BX+DI+300]. - AX = 5678h; AL = 56h.
- Bağıl adres (10×80+40)×2 = 1680 = 690h:
MOV AX,0B800h·MOV DS,AX·MOV BX,690h·MOV WORD PTR [BX],2E58h. MOV AX,0B800h·MOV ES,AX· … ·MOV ES:[BX],CX.
Özet
Kaynaklar
- emu8086 belgeleri, 8086 assembler tutorial for beginners, bölüm 2: memory access, MOV instruction.
- Intel, 8086/8088 User's Manual, adresleme modları ve komut kodlaması.
- Barry B. Brey, The Intel Microprocessors, 8. baskı, Pearson, bölüm 3 (Addressing Modes).
- IBM PC metin modu video belleği (B800h) ve öznitelik baytı belgeleri.