Bölüm 4.1: Bellek Erişimi

Mikroişlemciler
Adresleme modlarıYer değiştirmeEtkin adresKesim:bağıl konumbyte ptr / word ptrMOV kurallarıVideo belleği örneğiXCHG8/16 bit kopyalamaSayı tabanları
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Adresleme modları

BX, SI, DI, BP ve yer değiştirme ile geçerli bellek işlenenleri oluşturmak.

Adres hesabı

Etkin adresi ve kesim:bağıl konumdan fiziksel adresi hesaplamak.

Veri boyutu

byte ptr / word ptr ile erişim boyutunu belirtmek; little-endian düzeni okumak.

MOV ve XCHG

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ı

TabanBXBPyokİndisSIDIyokYer değiştirmed8d16yok++her sütundan en fazla bir seçim · BP seçilirse kesim SS, değilse DS
Kurallar
  • 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.
Örnekler
  • [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)

d88 bit işaretli yer değiştirme (−128 … +127). Örnek: 22, 55h, -1.
d1616 bit işaretli yer değiştirme. Örnek: 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]FEhd8 = −2genişletFFFEhBX = 0100h→ EA = 00FEh0100h + FFFEh = 1 00FEh: 17. bit atılır (16 bit sarma)−128 … +127 arası d8 (1 bayt), dışı d16 (2 bayt)
Etkin adres 16 bit ile hesaplanır ve başa sarar: BX = FFFFh iken [BX+2] → EA = 0001h.

Adresleme Modları

Geçerli mi, Geçersiz mi?

GeçerliAçıklama
[BX]yazmaç dolaylı
[1234h]doğrudan adres
[SI+10]indisli
[BP+DI-2]tabanlı-indisli (SS)
ES:[BX+SI]kesim önekli
GeçersizNeden?
[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, 5komutun içinde (sabit)
Yazmaç (register)MOV AX, BXyazmaç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ı-indisliMOV AL, [BX+DI]DS:BX+DI
Tabanlı-indisli + yer değiştirmeMOV 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.

Dizgi moduDizgi komutlarının işlenenleri örtüktür: kaynak 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]
G/Ç moduPortlar bellekten ayrı, 64 K'lık bir adres alanındadır. Veri yalnız AL ya da AX üzerinden geçer; port 0–255 ise numarası komutta, daha büyükse DX'te verilir.
IN  AL, 45h
OUT DX, AX
Göreceli modKomutta hedefin kendisi değil, IP'ye eklenecek işaretli uzaklık bulunur: IP = sonraki komutun adresi + uzaklık. Kısa atlamalarda uzaklık 8 bittir (−128 … +127).
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
tablo (DS:0116h …)11h011622h011733h011844h011955h011A66h011BBX = 0116h SI = 0000hAH00hAL00hCL00hCH00hDL00hDH00h

BX = 0116h: tablo'nun bağıl konumu (OFFSET derleme anında hesaplanır).

tablo (DS:0116h …)11h011622h011733h011844h011955h011A66h011BBX = 0116h SI = 0002hAH00hAL00hCL00hCH00hDL00hDH00h

SI = 2: indis yazmacı.

tablo (DS:0116h …)11h011622h011733h011844h011955h011A66h011Banlıkdeğer komutun içinde: 07hAH07hAL00hCL00hCH00hDL00hDH00h

Anlık mod: 7 komutun içindedir; belleğe gidilmez. AH = 07h.

tablo (DS:0116h …)11h011622h011733h011844h011955h011A66h011BdoğrudanEA = tablo+1 = 0117hfiziksel = 07000h + 0117h = 07117hAH07hAL22hCL00hCH00hDL00hDH00h

Doğrudan mod: adres komutun içinde: [0117h] → AL = 22h.

tablo (DS:0116h …)11h011622h011733h011844h011955h011A66h011Byazmaç dolaylıEA = BX = 0116hfiziksel = 07000h + 0116h = 07116hAH07hAL22hCL11hCH00hDL00hDH00h

Yazmaç dolaylı: EA = BX = 0116h → CL = 11h.

tablo (DS:0116h …)11h011622h011733h011844h011955h011A66h011BtabanlıEA = BX + 4 = 011Ahfiziksel = 07000h + 011Ah = 0711AhAH07hAL22hCL11hCH55hDL00hDH00h

Tabanlı: EA = BX + 4 = 011Ah → CH = 55h.

tablo (DS:0116h …)11h011622h011733h011844h011955h011A66h011Btabanlı-indisliEA = BX + SI = 0118hfiziksel = 07000h + 0118h = 07118hAH07hAL22hCL11hCH55hDL33hDH00h

Tabanlı-indisli: EA = BX + SI = 0118h → DL = 33h.

tablo (DS:0116h …)11h011622h011733h011844h011955h011A66h011Btaban + indis + d8EA = BX + SI + 3 = 011Bhfiziksel = 07000h + 011Bh = 0711BhAH07hAL22hCL11hCH55hDL33hDH66h

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

BX0200

Taban yazmacı BX = 0200h.

BX0200+ SI0030

İndis yazmacı SI = 0030h eklenir.

BX0200+ SI0030+ d80004

8 bitlik yer değiştirme: +4.

BX0200+ SI0030+ d80004EA0234

Etkin adres EA = 0200h + 0030h + 0004h = 0234h (16 bit).

BX0200+ SI0030+ d80004EA0234Fiziksel adresDS × 10h = 10000h+ EA = 0234h10234hAL ← [10234h]

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

BP0100

Taban yazmacı BP = 0100h.

BP0100+ DI0010

İndis yazmacı DI = 0010h eklenir.

BP0100+ DI0010+ d8FFFE

İşaretli yer değiştirme −2 (makine kodunda FEh).

BP0100+ DI0010+ d8FFFEEA010E

EA = 0100h + 0010h − 2 = 010Eh.

BP0100+ DI0010+ d8FFFEEA010EFiziksel adresSS × 10h = 20000h+ EA = 010Eh2010EhAX ← [2010Eh], [2010Fh]

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 veriUygun modÖrnek
Tek bir değişkendoğrudanMOV AX, sayac
İşaretçinin gösterdiği elemanyazmaç dolaylıMOV AL, [SI]
Dizinin i. elemanı (dizi sabit, indis değişken)indisli + d16MOV AL, dizi[SI]
Bir kaydın (yapının) alanıtabanlı + d8MOV AX, [BX+2]
Matris ya da kayıt dizisitaban + indis + dMOV AL, mat[BX+SI]
Yığındaki parametre ya da yerel değişkentabanlı, BP ile (SS)MOV AX, [BP+4]
Başka kesimdeki tamponkesim önekliMOV AL, ES:[DI]
Taban = hangi kayıt / satırBX ya da BP, yapının başlangıcını tutar; satır değişince yalnızca taban yazmacı güncellenir.
İndis = kayıt içindeki elemanSI ya da DI döngüde artırılır; yer değiştirme dizinin ya da alanın sabit konumudur.

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
mat (satır başına 4 bayt)sütun 0123satır 0 · 011911121314satır 1 · 011D21222324satır 2 · 012131323334BX0008SI0000AH00AL00DL00

BX = 2 × 4 = 0008h: satır 2, matrisin başından 8 bayt ileride başlar (satır × satır uzunluğu).

mat (satır başına 4 bayt)sütun 0123satır 0 · 011911121314satır 1 · 011D21222324satır 2 · 012131323334BX0008SI0001AH00AL00DL00

SI = 1: satır içindeki sütun. Taban yazmacı satırı, indis yazmacı sütunu seçer.

mat (satır başına 4 bayt)sütun 0123satır 0 · 011911121314satır 1 · 011D21222324satır 2 · 012131323334BX0008SI0001AH00AL32DL00EA = 0119 + 0008 + 0001= 0122h

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).

mat (satır başına 4 bayt)sütun 0123satır 0 · 011911121314satır 1 · 011D21222324satır 2 · 012131323334BX0008SI0003AH00AL32DL00

SI = 3: aynı satırda başka bir sütun. BX değişmediği için satır sabit kaldı.

mat (satır başına 4 bayt)sütun 0123satır 0 · 011911121314satır 1 · 011D21222324satır 2 · 012131323334BX0008SI0003AH34AL32DL00EA = 0119 + 0008 + 0003= 0124h

EA = 0124h → AH = 34h. Komut aynı, yalnızca indis değişti.

mat (satır başına 4 bayt)sütun 0123satır 0 · 011911121314satır 1 · 011D21222324satır 2 · 012131323334BX0004SI0003AH34AL32DL00

sub bx, 4: bir satır yukarı (BX = 0004h). Sütun (SI = 3) korunur.

mat (satır başına 4 bayt)sütun 0123satır 0 · 011911121314satır 1 · 011D21222324satır 2 · 012131323334BX0004SI0003AH34AL32DL24EA = 0119 + 0004 + 0003= 0120h

EA = 0119h + 4 + 3 = 0120h → DL = 24h (satır 1, sütun 3).

mat (satır başına 4 bayt)sütun 0123satır 0 · 011911121314satır 1 · 011D21222324satır 2 · 012131323334BX0004SI0003AH34AL32DL24

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şimiSaat turu
[BX], [BP], [SI], [DI]5
doğrudan [d16]6
[BP+DI], [BX+SI]7
[BP+SI], [BX+DI]8
tek yazmaç + d8/d169
[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.
DS1234

DS = 1234h, SI = 7890h. Gösterim: 1234:7890.

DS1234× 10h12340

Kesim 10h ile çarpılır (4 bit sola kaydırma): 12340h.

DS1234× 10h12340+ SI7890

Bağıl konum eklenmek üzere hizalanır: 7890h.

DS1234× 10h12340+ SI7890=19BD0elde: 4 + 9 = D, 3 + 8 = B,2 + 7 = 9, 1 + 0 = 1 → 19BD0h

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 / 84096 × 1 B = 4 KB
16 / 464 K × 4 bit = 32 KB
16 / 864 KB (bir kesim)
20 / 81 MB (8086)
24 / 1616 M × 2 B = 32 MB
32 / 84 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.

En büyük DSSI en küçük olsun: DS = ilk dört basamak = 2A5Ch, SI = 2A5C3h − 2A5C0h = 0003h.
En küçük DSSI en çok FFFFh olabilir: DS × 10h ≥ 2A5C3h − FFFFh = 1A5C4h → DS ≥ 1A5C,4h → 1A5Dh, SI = FFF3h.
Kaç farklı çift?DS her artışta SI 10h azalır: 2A5Ch − 1A5Dh + 1 = 1000h = 4096 çift.
4096 geçerli DS değeriDS = 1A5DhDS = 2A5ChSI = FFF3hSI = 0003hsol: SI > FFFFh olurdusağ: SI < 0 olurdu

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).

Ne zaman gerekir?
  • 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
DS = 0700h07000h + 0000h = 07000h00h+0ES = 0700h07000h + 0000h = 07000h20h+007h+1ekran, satır 1:AL00hDL00h

AX = B800h: renkli metin ekranının kesimi. Video belleğinde bir hücre = karakter + renk.

DS = 0700h07000h + 0000h = 07000h00h+0ES = B800hB8000h + 0000h = B8000h20h+007h+1ekran, satır 1:AL00hDL00h

ES = B800h. DS hâlâ programın kesiminde (0700h): değişkenlere erişim bozulmaz.

DS = 0700h07000h + 00A0h = 070A0h00h+0ES = B800hB8000h + 00A0h = B80A0h20h+007h+1ekran, satır 1:AL00hDL00h

BX = 00A0h = 160 = (1 × 80 + 0) × 2: 1. satırın ilk hücresi.

DS = 0700h07000h + 00A0h = 070A0h00h+0ES = B800hB8000h + 00A0h = B80A0h4Bh+007h+1ekran, satır 1:KAL00hDL00h

ES: öneki (makine kodunda 26h baytı): B8000h + 00A0h = B80A0h ← 'K' (4Bh).

DS = 0700h07000h + 00A0h = 070A0h00h+0ES = B800hB8000h + 00A0h = B80A0h4Bh+01Eh+1ekran, satır 1:KAL00hDL00h

B80A1h ← 1Eh: mavi zemin üzerine sarı yazı. Ekranda sarı bir K belirir.

DS = 0700h07000h + 00A0h = 070A0h00h+0ES = B800hB8000h + 00A0h = B80A0h4Bh+01Eh+1ekran, satır 1:KAL00hDL00h

Önek yok → varsayılan DS: 07000h + 00A0h = 070A0h okunur (programın PSP alanı, burada 00h). Aynı bağıl konum, başka bayt.

DS = 0700h07000h + 00A0h = 070A0h00h+0ES = B800hB8000h + 00A0h = B80A0h4Bh+01Eh+1ekran, satır 1:KAL00hDL4Bh

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
veri: DS = 0700h000000000001000002440003fiz. 07100h…yığın: SS = 0711h000000000001000002000003fiz. 07110h…BP0000SI0000AL10BL00CL00

AX = 0710h: veri kesiminin paragraf numarası (yükleyici belirler). EXE başlarken DS veriyi göstermez.

veri: DS = 0710h000000000001000002440003fiz. 07100h…yığın: SS = 0711h000000000001000002000003fiz. 07110h…BP0000SI0000AL10BL00CL00

DS = 0710h. Yığın kesimi SS = 0711h ayrı bir bloktur; bu programda DS ≠ SS.

veri: DS = 0710h000000000001000002440003fiz. 07100h…yığın: SS = 0711h000000000001000002000003fiz. 07110h…BP0003SI0000AL10BL00CL00

BP = 0003h: x'in bağıl konumu. Adres doğru, sorun kesim seçiminde.

veri: DS = 0710h000000000001000002440003fiz. 07100h…yığın: SS = 0711h000000000001000002000003fiz. 07110h…BP0003SI0000AL00BL00CL00SS:0003 → 07113h

[bp] varsayılan olarak SS ile birleşir: 07113h okunur, AL = 00h. 'D' değil, yığındaki bir bayt geldi.

veri: DS = 0710h000000000001000002440003fiz. 07100h…yığın: SS = 0711h000000000001000002000003fiz. 07110h…BP0003SI0000AL00BL44CL00DS:0003 → 07103h

ds:[bp]: önek varsayılanı değiştirir, 07103h okunur → BL = 44h ('D').

veri: DS = 0710h000000000001000002440003fiz. 07100h…yığın: SS = 0711h000000000001000002000003fiz. 07110h…BP0003SI0003AL00BL44CL00

Aynı bağıl konum SI'ya alınır: SI = 0003h.

veri: DS = 0710h000000000001000002440003fiz. 07100h…yığın: SS = 0711h000000000001000002000003fiz. 07110h…BP0003SI0003AL00BL44CL44DS:0003 → 07103h

[si] varsayılan olarak DS kullanır: CL = 44h. Veri için BX/SI/DI, yığın için BP seçilir.

veri: DS = 0710h000000000001000002440003fiz. 07100h…yığın: SS = 0711h000000000001000002000003fiz. 07110h…BP0003SI0003AL00BL44CL44

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
DSDeğişken adları yalnızca bağıl konumdur; DS değişince aynı ad başka kesimdeki bir bayta gider. Geçici değişiklik PUSH DS / POP DS ile sarılır ya da ES kullanılır.
SS ve SPBirlikte değişir. 8086, kesim yazmacına MOV/POP yapan komuttan sonraki komut bitene kadar kesme kabul etmez; böylece SS:SP çifti yarım kalmaz.
CSMOV ile yazılmaz; uzak JMP/CALL/RET ya da INT/IRET CS ve IP'yi birlikte değiştirir.

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.
34[BX]12[BX+1]…[BX+2]byte ptr [BX] → 34hword ptr [BX] → 1234h (düşük bayt düşük adreste)
KomutBoyut nereden belli?
MOV [BX], ALAL 8 bit → bayt yazılır
MOV [BX], AXAX 16 bit → sözcük yazılır
MOV [BX], 5belirsiz! → 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

BX0200BHBLAX0000AHALCX0000CHCLDS:0200 … DS:02030200AA0201BB0202CC0203DD

BX = 0200h. Bellekte önceki değerler (AA BB CC DD) duruyor.

BX0200BHBLAX0000AHALCX0000CHCLDS:0200 … DS:02030200340201120202CC0203DD

word ptr: 2 bayt yazılır. Düşük bayt (34h) düşük adrese: 34 12.

BX0200BHBLAX0000AHALCX0000CHCLDS:0200 … DS:02030200FF0201120202CC0203DD

byte ptr: yalnızca 0200h değişir → FF 12. 0201h'ye dokunulmaz.

BX0200BHBLAX0000AHALCX0000CHCLDS:0200 … DS:02030200FF0201000202CC0203DD

Aynı sabit, word ptr: 00FFh yazılır → FF 00. 0201h de değişti!

BX0200BHBLAX00FFAHALCX0000CHCLDS:0200 … DS:02030200FF0201000202CC0203DD

AX 16 bit olduğundan boyut belli: AX = 00FFh (0201h yüksek bayt).

BX0200BHBLAX00FFAHALCX0000CHCLDS:0200 … DS:02030200FF0201000202CC0203DD

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

AX = 1234h1234yüksek bayt (AH)düşük bayt (AL)0200340201120202…düşük adres → düşük bayt
  • 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
34011712011878011956011ABC011B9A011Cdizi[0]dizi[1]dizi[2]SI0001AX0000BX0000CX0000

SI = 1: "ikinci eleman" düşüncesiyle indis 1 verildi. Ama SI bir bayt uzaklığıdır.

34011712011878011956011ABC011B9A011Cdizi[0]dizi[1]dizi[2]SI0001AX7812BX0000CX0000EA = 0117 + 0001 = 0118

dizi[si] = 0118h: dizi[0]'ın yüksek baytı ile dizi[1]'in düşük baytı okunur → AX = 7812h. Ne 1234h ne 5678h.

34011712011878011956011ABC011B9A011Cdizi[0]dizi[1]dizi[2]SI0002AX7812BX0000CX0000

shl si, 1: indis × 2 → SI = 2. Sözcük dizisinde bayt uzaklığı = indis × 2.

34011712011878011956011ABC011B9A011Cdizi[0]dizi[1]dizi[2]SI0002AX7812BX5678CX0000EA = 0117 + 0002 = 0119

EA = 0119h → BX = 5678h = dizi[1]. Doğru eleman.

34011712011878011956011ABC011B9A011Cdizi[0]dizi[1]dizi[2]SI0002AX7812BX5678CX0000

SI = 2: bu kez indis 2 (üçüncü eleman).

34011712011878011956011ABC011B9A011Cdizi[0]dizi[1]dizi[2]SI0004AX7812BX5678CX0000

shl si, 1: SI = 4. Kaydırma, 2 ile çarpmanın en kısa yoludur.

34011712011878011956011ABC011B9A011Cdizi[0]dizi[1]dizi[2]SI0004AX7812BX5678CX9ABCEA = 0117 + 0004 = 011B

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.
REGSREGMEMIMM✗MEM ↔ MEM ✗SREG ↔ MEMREG → REG
MOV AX, BXBX'teki değeri AX'e kopyalar. BX değişmez.
MOV [SI], 10hSI'nın gösterdiği adrese (DS:SI) 10h değerini yazar. Boyut belirsiz olduğundan doğrusu 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
REGAX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP
SREGDS, ES, SS ve CS (CS yalnızca ikinci işlenen, yani kaynak olarak)
memory[BX], [BX+SI+7], değişken…
immediate5, -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]1MOV AX, CS6
MOV DS, ES2MOV SP, BX7
MOV DS, 100h3MOV BL, DX8
MOV CS, AX4MOV AL, [SI+BP]9
MOV [BX], 55MOV 5, AX10
Cevaplar
  1. Geçersiz: bellekten belleğe MOV yok → MOV AL,[SI] · MOV [BX],AL.
  2. Geçersiz: kesimden kesime yok → MOV AX,ES · MOV DS,AX ya da PUSH ES · POP DS.
  3. Geçersiz: kesime sabit atanamaz.
  4. Geçersiz: CS hedef olamaz (JMP FAR kullanılır); IP de doğrudan yazılamaz (MOV IP, AX yerine JMP AX).
  5. Boyut belirsiz → BYTE PTR / WORD PTR gerekir.
  6. 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('.')
kaynak'A'0112'B'0113'C'0114'D'0115hedef'.'0116'.'0117'.'0118'.'0119SIAL00CX0000

SI = 0112h: kaynağın bağıl konumu.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'.'0116'.'0117'.'0118'.'0119SIDIAL00CX0000

DI = 0116h: hedefin bağıl konumu. İki işaretçi iki ayrı tampon gösterir.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'.'0116'.'0117'.'0118'.'0119SIDIAL00CX0004

CX = 4: kopyalanacak bayt sayısı (LOOP sayacı).

kaynak'A'0112'B'0113'C'0114'D'0115hedef'.'0116'.'0117'.'0118'.'0119SIDIAL'A'CX0004

mov al, [si]: bellekten yazmaca → AL = 'A' (41h). Bellekten belleğe MOV olmadığı için ara durak AL.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'A'0116'.'0117'.'0118'.'0119SIDIAL'A'CX0004

mov [di], al: yazmaçtan belleğe → [0116] = 41h.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'A'0116'.'0117'.'0118'.'0119SIDIAL'A'CX0004

inc si: kaynak işaretçisi sonraki bayta.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'A'0116'.'0117'.'0118'.'0119SIDIAL'A'CX0004

inc di: hedef işaretçisi de sonraki bayta. İki işaretçi birlikte ilerler.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'A'0116'.'0117'.'0118'.'0119SIDIAL'A'CX0003

loop kopya: CX = 3 ≠ 0 → başa dön.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'A'0116'B'0117'.'0118'.'0119SIDIAL'B'CX0002

Tur 2 (özet): 'B' kopyalandı, SI = 0114h, DI = 0118h, CX = 2.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'A'0116'B'0117'C'0118'.'0119SIDIAL'C'CX0001

Tur 3 (özet): 'C' kopyalandı, CX = 1.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'A'0116'B'0117'C'0118'D'0119AL'D'CX0000

Tur 4 (özet): 'D' kopyalandı, CX = 0 → LOOP düşer. Hedef artık ABCD.

kaynak'A'0112'B'0113'C'0114'D'0115hedef'A'0116'B'0117'C'0118'D'0119AL'D'CX0000

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.
KomutMakine koduKomutMakine kodu
MOV AX, 0B800hB8 00 B8MOV CH, 11011111bB5 DF
MOV DS, AX8E D8MOV BX, 15EhBB 5E 01
MOV CL, 'A'B1 41MOV [BX], CX · RET89 0F · C3

Program Örneği · Kodu adım adım çalıştır

Kod İzleme: Ekrana 'A' Yazmak

AX0000AHALCX0000CHCLBX0000BHBLDS0700B800:015C … 015F (video belleği)015C20015D07015E20015F07

Ekran boş: her hücre 20h (boşluk) + 07h (siyah zemin üzerine gri yazı).

AXB800AHALCX0000CHCLBX0000BHBLDS0700B800:015C … 015F (video belleği)015C20015D07015E20015F07

AX = B800h (renkli metin ekranının kesimi).

AXB800AHALCX0000CHCLBX0000BHBLDSB800B800:015C … 015F (video belleği)015C20015D07015E20015F07

DS = AX = B800h. Artık [ ] erişimleri video belleğine gider.

AXB800AHALCX0041CHCLBX0000BHBLDSB800B800:015C … 015F (video belleği)015C20015D07015E20015F07

CL = 'A' = 41h (ASCII kodu).

AXB800AHALCXDF41CHCLBX0000BHBLDSB800B800:015C … 015F (video belleği)015C20015D07015E20015F07

CH = 11011111b = DFh: renk (öznitelik) baytı.

AXB800AHALCXDF41CHCLBX015EBHBLDSB800B800:015C … 015F (video belleği)015C20015D07015E20015F07

BX = 015Eh = 350: ekrandaki konumun bağıl adresi.

AXB800AHALCXDF41CHCLBX015EBHBLDSB800B800:015C … 015F (video belleği)015C20015D07015E41015FDF

CX = DF41h sözcük olarak yazılır: [015Eh] = 41h ('A'), [015Fh] = DFh (renk). Fiziksel: B8000h + 15Eh = B815Eh.

AXB800AHALCXDF41CHCLBX015EBHBLDSB800B800:015C … 015F (video belleği)015C20015D07015E41015FDF

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

Asütun 079024satır 2, sütun 15
Konum80×25 metin ekranında her hücre 2 bayttır: karakter + renk. Bağıl adres = (satır × 80 + sütun) × 2 → (2 × 80 + 15) × 2 = 350 = 15Eh.
Renk baytı DFh = 1101 1111bBit 7: yanıp sönme (emu8086'da parlak zemin) · bit 6–4 = 101: macenta zemin · bit 3–0 = 1111: parlak beyaz yazı.

MOV Örnekleri · Kodu adım adım çalıştır

Bellekten Bir Değeri Yazmaca Taşıma

AX0000AHALIP0100DS:1000 …1000CD1001AB100200

DS = 0700h. DS:1000h'de CD AB baytları var. IP = 0100h.

AXABCDAHALIP0103DS:1000 …1000CD1001AB100200

MOV AX,[1000h]: iki bayt okunur, little-endian → AX = ABCDh. Komut 3 bayt → IP = 0103h.

AXABCDAHALIP0000DS:1000 …1000CD1001AB100200

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 10 komutun 3 baytıdır.
  • Sağ: ayrıştırılmış (disassembled) kod: MOV AX, [01000h], ardından RET (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.

emu8086 öykünücü penceresi

MOV Örnekleri · Kodu adım adım çalıştır

Yazmaçtaki Değeri Belleğe Taşıma

BX0000BHBLIP0100DS:2000 …200000200100200200

DS:2000h boş (00 00).

BX1234BHBLIP0103DS:2000 …200000200100200200

BX = 1234h; IP = 0103h.

BX1234BHBLIP0107DS:2000 …200034200112200200

BX belleğe yazılır: [2000h] = 34h, [2001h] = 12h. Komut 4 bayt → IP = 0107h.

BX1234BHBLIP0000DS:2000 …200034200112200200

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

CX000ACHCLDX0000DHDL

CX = 10 = 000Ah (sayılar varsayılan olarak onluktur).

CX000ACHCLDX0014DHDL

DX = 20 = 0014h.

CX0014CHCLDX000ADHDL

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ı

XCHG hedef, kaynak
  • 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, reg tek 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
AX0000hCX0000hDX0000hsayi · 0116hA5h

SI = 0116h: sayi'nın adresi; bellekte sayi = A5h.

AX005AhCX0000hDX0000hsayi · 0116hA5h

AL = 5Ah.

AX00A5hCX0000hDX0000hsayi · 0116h5AhAL ↔ [SI]

XCHG AL, [SI]: AL ↔ bellek. AL = A5h, sayi = 5Ah. Ara yazmaç gerekmedi.

AX00A5hCX1111hDX0000hsayi · 0116h5Ah

CX = 1111h.

AX00A5hCX1111hDX2222hsayi · 0116h5Ah

DX = 2222h. Şimdi aynı takas XCHG olmadan yapılacak.

AX1111hCX1111hDX2222hsayi · 0116h5Ah1. AX ← CX3 komut + yardımcı yazmaç

MOV AX, CX: CX'in yedeği AX'te (AX'in eski değeri kayboldu).

AX1111hCX2222hDX2222hsayi · 0116h5Ah2. CX ← DX3 komut + yardımcı yazmaç

MOV CX, DX: CX = 2222h. CX'in eski değeri yalnızca AX'te duruyor.

AX1111hCX2222hDX1111hsayi · 0116h5Ah3. DX ← AX3 komut + yardımcı yazmaç

MOV DX, AX: DX = 1111h. Takas 3 komut ve bir yazmaç harcadı.

AX1111hCX1111hDX2222hsayi · 0116h5AhCX ↔ DX: 1 komut

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

SI3000DI0000AX0000AHALDS:3000 …30005A300100300200

SI'ya bir bellek adresi (bağıl konum) atanır: 3000h.

SI3000DI3000AX0000AHALDS:3000 …30005A300100300200

DI = SI = 3000h. Kopyalanan şey adrestir, bellekteki veri değil.

SI3000DI3000AX005AAHALDS:3000 …30005A300100300200

Artık SI ve DI aynı hücreyi gösterir: AL = [3000h] = 5Ah.

SI3000DI3000AX005AAHALDS:3000 …30005A30015A300200

[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

IP0100DS:4000 …400000400199400200400399

DS:4000h … 4003h: 00 99 00 99.

IP0105DS:4000 …400041400199400200400399

65 = 41h = 'A' tek bayt olarak yazılır. Makine kodu C6 06 00 40 41 (5 bayt) → IP = 0105h. [4001h] değişmez.

IP010BDS:4000 …400041400199400241400300

WORD PTR: 0041h yazılır → [4002h] = 41h, [4003h] = 00h (99h ezildi). Komut 6 bayt → IP = 010Bh.

IP0000DS:4000 …400041400199400241400300

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

AX1234AHALBX0000BHBL

AX = 1234h: AH = 12h, AL = 34h.

AX1234AHALBXFFFFBHBL

Etkiyi görmek için BX = FFFFh.

AX1234AHALBXFF34BHBL

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

AX00FFAHALBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0

AX = 00FFh.

AX01FFAHALBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0

AH = 00h + 01h = 01h → AX = 01FFh. Sonuç sıfır değil, elde yok.

AX0100AHALBayraklarCF=1ZF=1SF=0OF=0PF=1AF=1

AL = FFh + 1 = 00h, CF = 1, ZF = 1. Elde AH'ye geçmez: AX = 0100h.

AX01FFAHALBayraklarCF=1ZF=1SF=0OF=0PF=1AF=1

Karşılaştırma için AX yeniden 01FFh. MOV bayrakları değiştirmez.

AX0200AHALBayraklarCF=0ZF=0SF=0OF=0PF=1AF=1

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

AX0005AHALBX0000BHBLCX0000CHCLBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0

00000101b = 5 → AL = 05h.

AX0005AHALBX000ABHBLCX0000CHCLBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0

0Ah = 10 → BL = 0Ah. Harfle başladığı için başta 0 var.

AX0005AHALBX000ABHBLCX0008CHCLBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0

10o (sekizli) = 1×8 + 0 = 8 → CL = 08h.

AX000FAHALBX000ABHBLCX0008CHCLBayraklarCF=0ZF=0SF=0OF=0PF=1AF=0

AL = 5 + 10 = 15 = 0Fh. PF = 1 (0000 1111: dört adet 1).

AX0007AHALBX000ABHBLCX0008CHCLBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0

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ı

TabanSonekÖrnekOnluk değer
Onluk (decimal)yok ya da d25, 25d25
İkili (binary)b00011001b25
Sekizli (octal)o ya da q31o25
Onaltılık (hexadecimal)h19h, 0FFh25, 255
Karakter' ''A'65 (41h)
Onaltılık sayı bir harfle (A–F) başlıyorsa başına 0 eklenir: 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, diziSI'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şkenSS kesiminden okunur; .EXE'de yanlış bayt gelir.[BX], [SI] ya da DS:[BP]
MOV [BX], 5Boyut belirsiz; derleyici hata verir ya da tahmin eder.MOV BYTE PTR [BX], 5
MOV AX, B800hB800h bir etiket adı sanılır.MOV AX, 0B800h
DS'yi değiştirip bırakmakSonraki tüm değişken erişimleri başka kesime gider.PUSH DS … POP DS ya da ES
MOV AX, [0200h] → 3412h beklemekLittle-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

Adresleme[taban + indis + yer değiştirme]; taban BX/BP, indis SI/DI, yer değiştirme d8/d16 — her biri isteğe bağlı.
Kesim seçimiBP varsa SS, yoksa DS; önekle değiştirilebilir (ES:[BX]).
Fiziksel adreskesim × 10h + EA; 1234:7890 → 19BD0h.
Boyutbyte ptr / word ptr (b. / w.); yazmaç işlenen boyutu belirler. Little-endian.
MOVKopyalar, bayrakları etkilemez; bellek↔bellek, kesim↔sabit, CS/IP hedef yok.
XCHGİki işleneni tek komutta takas eder; kesim ve sabit yok.

Özet

Alıştırmalar

  1. DS = 3000h, BX = 0010h, SI = 0005h: [BX+SI+20h] için EA ve fiziksel adres?
  2. SS = 4000h, BP = FFFEh: [BP+4] için EA ve fiziksel adres?
  3. [BX+BP], [DI+SI], [BX+DI+300], [DX] modlarından hangileri geçerli?
  4. [0500h] = 78h, [0501h] = 56h ise MOV AX,[0500h] sonrası AX? MOV AL,[0501h] sonrası AL?
  5. Ekranın satır 10, sütun 40 konumuna yeşil zemin üzerine sarı 'X' yazan kodu yazın (renk 2Eh).
  6. DS'yi değiştirmeden ES ile video belleğine yazmak için önceki programı nasıl değiştirirsiniz?
Cevaplar
  1. EA = 0035h; fiziksel = 30000h + 0035h = 30035h.
  2. EA = FFFEh + 4 = 0002h (başa sarar); fiziksel = 40002h.
  3. Yalnızca [BX+DI+300].
  4. AX = 5678h; AL = 56h.
  5. Bağıl adres (10×80+40)×2 = 1680 = 690h: MOV AX,0B800h · MOV DS,AX · MOV BX,690h · MOV WORD PTR [BX],2E58h.
  6. 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.

Son

Bölüm 4.1: Bellek Erişimi
Sonraki bölüm: Bölüm 4.2: Değişkenler · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.