Bölüm 4.1: Bellek Erişimi
Giriş
Öğrenme Çıktıları
BX, SI, DI, BP ve yer değiştirme 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 yer değiştirme) | + d16 (16 bit yer değiştirme) |
|---|---|---|
| [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ı
Yer Değiştirme (Displacement)
22, 55h, -1.300, 5517h, -259.- Yer değiştirme 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]. - Yer değiştirme
[ ]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) + yer değiştirme, her biri isteğe bağlı.
Adresleme Modları
Adresleme Modu Türleri
| Mod | Örnek | İşlenen nerede? |
|---|---|---|
| Anlık (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 + yer değiştirme | 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ı
Dizgi, G/Ç ve Göreceli Mod
Üç mod daha vardır: işlenen komutta hiç yazılmaz, bellekten ayrı bir adres alanında bulunur ya da adres IP'ye göre hesaplanır.
DS:SI, hedef ES:DI. Her işlemden sonra SI ve DI, DF = 0 iken artar, DF = 1 iken azalır (bayt ±1, sözcük ±2).MOVSB ; ES:[DI] ← DS:[SI]
IN AL, 45h OUT DX, AX
JNZ dongu ; 75 FA = −6
Komut adları bitişik yazılır (MOVSB, MOVS B değil). OUT'ta önce port, sonra veri yazmacı gelir: OUT 50h, AL; IN A, 45 8085 yazımıdır.
Adresleme Modları · Kodu adım adım çalıştır
Kod İzleme: Altı Adresleme Modu
ORG 100h MOV BX, OFFSET tablo MOV SI, 2 MOV AH, 7 ; anlık MOV AL, [tablo+1] ; doğrudan MOV CL, [BX] ; dolaylı MOV CH, [BX+4] ; tabanlı MOV DL, [BX+SI] ; taban+indis MOV DH, [BX+SI+3] ; + d8 RET tablo DB 11h,22h,33h,44h,55h,66h
BX = 0116h: tablo'nun bağıl konumu (OFFSET derleme anında hesaplanır).
SI = 2: indis yazmacı.
Anlık mod: 7 komutun içindedir; belleğe gidilmez. AH = 07h.
Doğrudan mod: adres komutun içinde: [0117h] → AL = 22h.
Yazmaç dolaylı: EA = BX = 0116h → CL = 11h.
Tabanlı: EA = BX + 4 = 011Ah → CH = 55h.
Tabanlı-indisli: EA = BX + SI = 0118h → DL = 33h.
Taban + indis + d8: EA = BX + SI + 3 = 011Bh → DH = 66h. BP kullanılmadığı için kesim hep DS.
.COM programında DS = 0700h alındı; fiziksel adres = DS × 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 yer değiştirme: +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 yer değiştirme −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; yer değiştirme onluk (-2) ya da onaltılık (1Ah) girilebilir.
Adresleme Modları
Veri Yapısına Göre Adresleme Modu
| Erişilen veri | Uygun mod | Örnek |
|---|---|---|
| Tek bir değişken | doğrudan | MOV AX, sayac |
| İşaretçinin gösterdiği eleman | yazmaç dolaylı | MOV AL, [SI] |
| Dizinin i. elemanı (dizi sabit, indis değişken) | indisli + d16 | MOV AL, dizi[SI] |
| Bir kaydın (yapının) alanı | tabanlı + d8 | MOV AX, [BX+2] |
| Matris ya da kayıt dizisi | taban + indis + d | MOV AL, mat[BX+SI] |
| Yığındaki parametre ya da yerel değişken | tabanlı, BP ile (SS) | MOV AX, [BP+4] |
| Başka kesimdeki tampon | kesim önekli | MOV AL, ES:[DI] |
Aynı veriye birden çok modla ulaşılabilir; seçim, hangi parçanın sabit, hangisinin çalışma anında değişken olduğuna göre yapılır.
Adresleme Modları · Kodu adım adım çalıştır
Kod İzleme: Matris Elemanına Erişim
org 100h mov bx, 2*4 ; satır 2 mov si, 1 ; sütun 1 mov al, mat[bx+si] ; mat[2][1] mov si, 3 ; sütun 3 mov ah, mat[bx+si] ; mat[2][3] sub bx, 4 ; satır 1 mov dl, mat[bx+si] ; mat[1][3] ret mat db 11h,12h,13h,14h db 21h,22h,23h,24h db 31h,32h,33h,34h
BX = 2 × 4 = 0008h: satır 2, matrisin başından 8 bayt ileride başlar (satır × satır uzunluğu).
SI = 1: satır içindeki sütun. Taban yazmacı satırı, indis yazmacı sütunu seçer.
mat[bx+si]: EA = 0119h + 8 + 1 = 0122h → AL = 32h (satır 2, sütun 1). Yer değiştirme mat'ın bağıl konumudur (d16).
SI = 3: aynı satırda başka bir sütun. BX değişmediği için satır sabit kaldı.
EA = 0124h → AH = 34h. Komut aynı, yalnızca indis değişti.
sub bx, 4: bir satır yukarı (BX = 0004h). Sütun (SI = 3) korunur.
EA = 0119h + 4 + 3 = 0120h → DL = 24h (satır 1, sütun 3).
ret: AX = 3432h, DL = 24h. Üç eleman tek bir adresleme kalıbıyla okundu.
Satır öncelikli (row-major) düzen: eleman[satır][sütun] adresi = mat + satır × sütun sayısı + sütun. Sözcük matrisinde her iki terim ×2 alınır.
Adresleme Modları
Etkin Adres Hesap Süresi
| Etkin adres bileşimi | Saat turu |
|---|---|
[BX], [BP], [SI], [DI] | 5 |
doğrudan [d16] | 6 |
[BP+DI], [BX+SI] | 7 |
[BP+SI], [BX+DI] | 8 |
| tek yazmaç + d8/d16 | 9 |
[BP+DI+d], [BX+SI+d] | 11 |
[BP+SI+d], [BX+DI+d] | 12 |
| kesim öneki | +2 |
8086'da etkin adres, yürütme biriminde ayrı bir toplama ile hesaplanır; bu süre komutun kendi süresine eklenir.
MOV AX, BX: 2 tur (bellek yok).MOV CL, [BX]: 8 + 5 = 13 tur.MOV CL, [BX+DI+4]: 8 + 12 = 20 tur.- Tek adresteki bir sözcük, ikinci yol döngüsü için +4 tur daha ister.
Döngü içinde sık okunan değeri bir yazmaçta tutmak, her turda bu hesabı ortadan kaldırır.
Değerler Intel 8086 kullanıcı kılavuzundaki tablodandır; 80286 ve sonrasında adres hesabı ayrı bir birimde yapıldığı için bu farklar küçülür.
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
Adres Hatları ve Bellek Kapasitesi
n adres hattı 2n farklı konum seçer. Bir konumdaki bit sayısını veri hattı sayısı belirler:
kapasite = 2n × veri genişliği
- 8086: 20 hat → 220 = 1 048 576 konum = 1 MB (00000h–FFFFFh).
- Bir kesimin sınırı bağıl konumdan gelir: 16 bit → 216 = 64 KB.
- Ters soru: en az kaç hat? Kapasiteyi aşan ilk 2'nin kuvveti alınır: 6 GB için 232 = 4 GB yetmez, 33 hat (8 GB).
| Adres / veri hattı | Kapasite |
|---|---|
| 12 / 8 | 4096 × 1 B = 4 KB |
| 16 / 4 | 64 K × 4 bit = 32 KB |
| 16 / 8 | 64 KB (bir kesim) |
| 20 / 8 | 1 MB (8086) |
| 24 / 16 | 16 M × 2 B = 32 MB |
| 32 / 8 | 4 GB (80386) |
Bellek yongasında veri hattı sayısı sözcük genişliğidir; kapasite bayt cinsinden istenirse bit sayısı 8'e bölünür.
Kesim ve Bağıl Konum
Ters Hesap: Fiziksel Adresten DS:SI
Fiziksel adres 2A5C3h'e DS:SI ile erişmek isteniyor. Tek bir cevap yoktur; DS'nin alabileceği aralık bulunur.
Denetim her zaman ileri hesapla yapılır: 1A5Dh × 10h + FFF3h = 1A5D0h + FFF3h = 2A5C3h.
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.
Kesim ve Bağıl Konum · Kodu adım adım çalıştır
Kod İzleme: ES ile Video Belleği
ORG 100h MOV AX, 0B800h MOV ES, AX ; ES = video MOV BX, 00A0h ; satır 1 MOV BYTE PTR ES:[BX], 'K' MOV BYTE PTR ES:[BX+1], 1Eh MOV AL, [BX] ; DS:00A0h MOV DL, ES:[BX] ; B800:00A0h RET
AX = B800h: renkli metin ekranının kesimi. Video belleğinde bir hücre = karakter + renk.
ES = B800h. DS hâlâ programın kesiminde (0700h): değişkenlere erişim bozulmaz.
BX = 00A0h = 160 = (1 × 80 + 0) × 2: 1. satırın ilk hücresi.
ES: öneki (makine kodunda 26h baytı): B8000h + 00A0h = B80A0h ← 'K' (4Bh).
B80A1h ← 1Eh: mavi zemin üzerine sarı yazı. Ekranda sarı bir K belirir.
Önek yok → varsayılan DS: 07000h + 00A0h = 070A0h okunur (programın PSP alanı, burada 00h). Aynı bağıl konum, başka bayt.
ES:[BX] yeniden video belleğine gider: DL = 4Bh ('K').
Başlangıçta video hücresi 20h 07h (boşluk, gri) kabul edildi. Önek yalnızca o komutu etkiler; DS değişmez.
Kesim ve Bağıl Konum · Kodu adım adım çalıştır
Kod İzleme: BP ile Veriye Erişmek
veri segment bos db 3 dup(0) x db 'D' veri ends yigin segment stack dw 64 dup(0) yigin ends kod segment assume cs:kod, ds:veri, ss:yigin basla: mov ax, veri mov ds, ax mov bp, offset x mov al, [bp] ; SS:BP okunur! mov bl, ds:[bp] ; DS:BP mov si, offset x mov cl, [si] ; DS:SI mov ax, 4C00h int 21h kod ends end basla
AX = 0710h: veri kesiminin paragraf numarası (yükleyici belirler). EXE başlarken DS veriyi göstermez.
DS = 0710h. Yığın kesimi SS = 0711h ayrı bir bloktur; bu programda DS ≠ SS.
BP = 0003h: x'in bağıl konumu. Adres doğru, sorun kesim seçiminde.
[bp] varsayılan olarak SS ile birleşir: 07113h okunur, AL = 00h. 'D' değil, yığındaki bir bayt geldi.
ds:[bp]: önek varsayılanı değiştirir, 07103h okunur → BL = 44h ('D').
Aynı bağıl konum SI'ya alınır: SI = 0003h.
[si] varsayılan olarak DS kullanır: CL = 44h. Veri için BX/SI/DI, yığın için BP seçilir.
AH = 4Ch, AL = 0: program dönüş kodu 0 ile DOS'a döner.
.COM programında CS = DS = SS olduğu için bu hata görünmez; ayrı yığın kesimli .EXE programında ortaya çıkar.
Kesim ve Bağıl Konum
Kesim Yazmacını Değiştirmek
PUSH DS ; DS'yi sakla MOV AX, 0B800h MOV DS, AX ; geçici kesim MOV BYTE PTR [0], 'Z' POP DS ; değişkenler geri MOV AX, yeni_yigin MOV SS, AX ; ardından hemen MOV SP, 0400h ; SP kurulur
ES, varsayılan olarak yalnızca dizgi hedefinde kullanıldığı için ikinci bir veri bloğuna (video belleği, tampon) erişmenin en güvenli yoludur.
Veri Tipi
Veri Tipi 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 Tipi · 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 yüksek 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 Tipi
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.
Veri Tipi · Kodu adım adım çalıştır
Kod İzleme: Sözcük Dizisinde İndis Hatası
org 100h mov si, 1 ; indis 1 mov ax, dizi[si] ; HATA! shl si, 1 ; indis × 2 mov bx, dizi[si] ; dizi[1] mov si, 2 ; indis 2 shl si, 1 ; SI = 4 mov cx, dizi[si] ; dizi[2] ret dizi dw 1234h, 5678h, 9ABCh
SI = 1: "ikinci eleman" düşüncesiyle indis 1 verildi. Ama SI bir bayt uzaklığıdır.
dizi[si] = 0118h: dizi[0]'ın yüksek baytı ile dizi[1]'in düşük baytı okunur → AX = 7812h. Ne 1234h ne 5678h.
shl si, 1: indis × 2 → SI = 2. Sözcük dizisinde bayt uzaklığı = indis × 2.
EA = 0119h → BX = 5678h = dizi[1]. Doğru eleman.
SI = 2: bu kez indis 2 (üçüncü eleman).
shl si, 1: SI = 4. Kaydırma, 2 ile çarpmanın en kısa yoludur.
EA = 011Bh → CX = 9ABCh = dizi[2].
Döngüde sözcük dizisi gezilirken SI her turda ADD SI, 2 ile ilerletilir; INC SI yalnızca bayt dizileri içindir.
MOV Komutu
MOV Komutu
MOV hedef, kaynak: kaynaktaki değeri hedefe kopyalar; kaynak değişmez.- Kaynak: anlık 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… |
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,AXya daPUSH ES·POP DS. - Geçersiz: kesime sabit atanamaz.
- Geçersiz: CS hedef olamaz (JMP FAR kullanılır); IP de doğrudan yazılamaz (
MOV IP, AXyerineJMP AX). - 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.
MOV Komutu · Kodu adım adım çalıştır
Kod İzleme: Yazmaç Üzerinden Blok Kopyalama
org 100h mov si, offset kaynak mov di, offset hedef mov cx, 4 kopya: mov al, [si] ; bellek → AL mov [di], al ; AL → bellek inc si inc di loop kopya ret kaynak db 'ABCD' hedef db 4 dup('.')
SI = 0112h: kaynağın bağıl konumu.
DI = 0116h: hedefin bağıl konumu. İki işaretçi iki ayrı tampon gösterir.
CX = 4: kopyalanacak bayt sayısı (LOOP sayacı).
mov al, [si]: bellekten yazmaca → AL = 'A' (41h). Bellekten belleğe MOV olmadığı için ara durak AL.
mov [di], al: yazmaçtan belleğe → [0116] = 41h.
inc si: kaynak işaretçisi sonraki bayta.
inc di: hedef işaretçisi de sonraki bayta. İki işaretçi birlikte ilerler.
loop kopya: CX = 3 ≠ 0 → başa dön.
Tur 2 (özet): 'B' kopyalandı, SI = 0114h, DI = 0118h, CX = 2.
Tur 3 (özet): 'C' kopyalandı, CX = 1.
Tur 4 (özet): 'D' kopyalandı, CX = 0 → LOOP düşer. Hedef artık ABCD.
ret: SI ve DI tamponların hemen arkasını gösteriyor (0116h, 011Ah).
Her bayt için iki bellek erişimi ve bir yazmaç gerekir. Aynı iş dizgi komutlarıyla (REP MOVSB: DS:SI → ES:DI) tek komutta yapılır.
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).;açıklama 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.
RET: IP = 0000h (PSP'deki INT 20h). 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.
RET: IP = 0000h. 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 onluktur).
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
Kod İzleme: XCHG ile Takas
ORG 100h MOV SI, OFFSET sayi MOV AL, 5Ah XCHG AL, [SI] ; AL ↔ [SI] MOV CX, 1111h MOV DX, 2222h MOV AX, CX ; yedek MOV CX, DX MOV DX, AX ; takas XCHG CX, DX ; tek komut RET sayi DB 0A5h
SI = 0116h: sayi'nın adresi; bellekte sayi = A5h.
AL = 5Ah.
XCHG AL, [SI]: AL ↔ bellek. AL = A5h, sayi = 5Ah. Ara yazmaç gerekmedi.
CX = 1111h.
DX = 2222h. Şimdi aynı takas XCHG olmadan yapılacak.
MOV AX, CX: CX'in yedeği AX'te (AX'in eski değeri kayboldu).
MOV CX, DX: CX = 2222h. CX'in eski değeri yalnızca AX'te duruyor.
MOV DX, AX: DX = 1111h. Takas 3 komut ve bir yazmaç harcadı.
XCHG CX, DX: tek komutta geri takas: CX = 1111h, DX = 2222h; AX dokunulmadan kaldı.
XCHG bayrakları değiştirmez; bellek ↔ bellek ve kesim yazmacı ile takas yoktur.
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.
RET: IP = 0000h. 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 Düşük Baytını Diğerine Kopyalama
AX = 1234h: AH = 12h, AL = 34h.
Etkiyi görmek için BX = FFFFh.
AL (AX'in düşük 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 Yüksek 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
İkili, 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 | Onluk değer |
|---|---|---|---|
| Onluk (decimal) | yok ya da d | 25, 25d | 25 |
| İkili (binary) | b | 00011001b | 25 |
| Sekizli (octal) | o ya da q | 31o | 25 |
| Onaltılık (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.MOV Örnekleri
Bellek Erişiminde Sık Yapılan Hatalar
| Hatalı | Ne olur? | Doğrusu |
|---|---|---|
MOV SI, dizi | SI'ya dizinin adresi değil ilk elemanın değeri yüklenir. | MOV SI, OFFSET dizi ya da LEA SI, dizi |
INC SI (sözcük dizisi) | Sözcüğün ortasından okunur: iki elemanın yarıları birleşir. | ADD SI, 2 |
MOV AL, [BP] ile değişken | SS kesiminden okunur; .EXE'de yanlış bayt gelir. | [BX], [SI] ya da DS:[BP] |
MOV [BX], 5 | Boyut belirsiz; derleyici hata verir ya da tahmin eder. | MOV BYTE PTR [BX], 5 |
MOV AX, B800h | B800h bir etiket adı sanılır. | MOV AX, 0B800h |
| DS'yi değiştirip bırakmak | Sonraki tüm değişken erişimleri başka kesime gider. | PUSH DS … POP DS ya da ES |
MOV AX, [0200h] → 3412h beklemek | Little-endian unutuldu: bellekte 34 12 ise AX = 1234h. | Düşük adres = düşük bayt |
Bu hataların çoğu derleme hatası vermez; program çalışır ama yanlış adresten okur. emu8086'da bellek penceresinde EA ve fiziksel adres kontrol edilerek bulunur.
Laboratuvar · 8086 komutları adım adım
Laboratuvar: Bellek Erişimi
Ö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.