Bölüm 4: Bellek Erişimi

Mikroişlemciler
Adresleme modlarıİleri kaydırmaEtkin 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 ileri kaydırma 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 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ı

TabanBXBPyokİndisSIDIyokKaydırmad8d16yok++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ı

İleri Kaydırma (Displacement)

d88 bit işaretli dolaysız ileri kaydırma (−128 … +127). Örnek: 22, 55h, -1.
d1616 bit işaretli dolaysız ileri kaydırma. Örnek: 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.
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) + kaydırma, her biri isteğe bağlı.

Adresleme Modları

Adresleme Modu Türleri

ModÖrnekİşlenen nerede?
Dolaysız (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 + kaydırmaMOV 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

BX0200

Taban yazmacı BX = 0200h.

BX0200+ SI0030

İndis yazmacı SI = 0030h eklenir.

BX0200+ SI0030+ d80004

8 bitlik ileri kaydırma: +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 kaydırma −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; 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.
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

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.

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.
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 Türü · 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 üst 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 Türü

Little-Endian Düzen

AX = 1234h1234üst bayt (AH)alt 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.

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 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…

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]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.
  3. Geçersiz: kesime sabit atanamaz.
  4. Geçersiz: CS hedef olamaz (JMP FAR kullanılır).
  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.

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

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

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

AXB800AHALCX0000CHCLBX0000BHBLDS0B56B800: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.

AXABCDAHALIP0103DS:1000 …1000CD1001AB100200

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.

BX1234BHBLIP0107DS:2000 …200034200112200200

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

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

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.

IP010BDS:4000 …400041400199400241400300

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

AX1234AHALBX0000BHBL

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

AX1234AHALBXFFFFBHBL

Etkiyi görmek için BX = FFFFh.

AX1234AHALBXFF34BHBL

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

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

İkilik, 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ÖrnekOnlu değer
Onlu (decimal)yok ya da d25, 25d25
İkili (binary)b00011001b25
Sekizli (octal)o ya da q31o25
Onaltılı (hexadecimal)h19h, 0FFh25, 255
Karakter' ''A'65 (41h)
Onaltılı 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.

Özet

Özet

Adresleme[taban + indis + kaydırma]; taban BX/BP, indis SI/DI, kaydırma 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: Bellek Erişimi
Sonraki bölüm: Bölüm 4: Değişkenler
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.