Bölüm 4: Değişkenler

Mikroişlemciler
DB / DW / DDAdlandırma kurallarıBellek yerleşimiORG 100h ve .COMDiziler ve DUPLEA ve OFFSETEQU sabitleriToplama ve karşılaştırmaDouble word
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Tanımlama

DB, DW, DD, DUP ve ? ile değişken ve dizi tanımlamak.

Bellek yerleşimi

Derleyicinin değişkenleri hangi bağıl konumlara, hangi bayt sırasıyla yerleştirdiğini çıkarmak.

Adresler

LEA ve OFFSET ile değişken adresini almak ve dizi elemanlarına indisle erişmek.

Programlar

Değişkenler arasında veri taşıyan, toplayan ve karşılaştıran programları adım adım izlemek.

Değişkenler

Değişkenler

  • Bir değişken bir bellek konumunu temsil eder.
  • Programcı için var1 adını kullanmak, 5A73:235B adresini kullanmaktan çok daha kolaydır.
  • Derleyici iki temel tür destekler:
    • BYTE (8 bit): ad DB değer (Define Byte)
    • WORD (16 bit): ad DW değer (Define Word)
  • DD (Define Double word, 32 bit) de vardır; bölüm sonunda ele alınır.
counter DB 10h     ; BYTE
sum     DW 0FFFFh  ; WORD
counter10sumFFsum+1FF…1 bayt2 bayt

Değişkenler

Adlandırma ve İlk Değer

  • Değişken adları harfle başlamalıdır; sonrasında harf ve rakam kombinasyonları içerebilir.
  • Yazmaç ve komut adları (AX, MOV…) değişken adı olamaz.
  • Ad belirtilmeyen değişkenler de olabilir: adları yoktur ama adresleri vardır.
  • Herhangi bir sayısal değer (ikili, onlu, onaltılı, karakter) alabilir.
  • İlk değer atanmamış değişkenler için ? kullanılır (emu8086 belleğe 00 koyar).
Tanım?
sayi1 DB 5geçerli
1sayi DB 5rakamla başlıyor
ax DW 0yazmaç adı
DB 0Ahadsız, ama adresi var
sonuc DW ?ilk değersiz
harf DB 'A'41h

Değişkenler

Değer Aralıkları

DirektifBoyutİşaretsizİşaretliÖrnek
DB1 bayt0 … 255−128 … 127x DB -1 → FFh
DW2 bayt0 … 65535−32768 … 32767y DW -2 → FE FF
DD4 bayt0 … 4 294 967 295−231 … 231−1z DD 1 → 01 00 00 00
Bellekte yalnızca bit deseni saklanır; işaretli mi işaretsiz mi olduğu, değeri kullanan komuta bağlıdır (ör. JGE işaretli, JAE işaretsiz karşılaştırır). DB 300 bir bayta sığmaz → assembler hata verir.

Bellek Yerleşimi

Örnek Kod

ORG 100h
MOV AL, var1   ; AL ← var1
MOV BX, var2   ; BX ← var2
RET            ; programı bitir
VAR1 DB 7      ; BYTE, 7
var2 DW 1234h  ; WORD, 1234h
  • Kod önce, değişkenler RET'ten sonra: CPU onlara hiç ulaşmaz.
  • Derleyici kaynağı bir bayt dizisine çevirir ve değişken adlarını bellek konumlarıyla değiştirir.
  • Büyük-küçük harfe duyarsızdır: VAR1 ile var1 aynı değişkendir.
0100A001010801020101038B01041E0105090106010107C3010807010934010A12MOV AL, [0108h]MOV BX, [0109h]RETVAR1var2

Bellek Yerleşimi · Kodu adım adım çalıştır

Kod İzleme: var1 ve var2

AX0000AHALBX0000BHBLIP01000B56:0107 … 010A0107C3010807010934010A12

Program 0B56:0100'e yüklendi; DS = CS = 0B56h, IP = 0100h.

AX0007AHALBX0000BHBLIP01030B56:0107 … 010A0107C3010807010934010A12

MOV AL, [0108h]: VAR1'in değeri → AL = 07h. IP = 0103h.

AX0007AHALBX1234BHBLIP01070B56:0107 … 010A0107C3010807010934010A12

MOV BX, [0109h]: 34h düşük, 12h yüksek bayt → BX = 1234h. IP = 0107h.

AX0007AHALBX1234BHBLIP01070B56:0107 … 010A0107C3010807010934010A12

RET (0107h'de C3) programı bitirir. 0108h'den sonrası veridir, komut olarak yürütülmez.

ORG 100h
MOV AL, var1   ; AL ← var1
MOV BX, var2   ; BX ← var2
RET            ; programı bitir
VAR1 DB 7      ; BYTE, 7
var2 DW 1234h  ; WORD, 1234h

Bellek Yerleşimi

Derleyici Ne Yapar?

  • Kaynak kodu bir dizi bayta dönüştürür; değişken adlarını bağıl konumlarla değiştirir: MOV AL, var1 → MOV AL, [0108h].
  • .COM dosyaları yüklendiğinde DS, CS yazmacının değerini alır (ES ve SS de aynıdır).
  • Bağıl konum (offset), bellek kesiminin başlangıcından itibaren olan uzaklıktır.
  • VAR1'in bağıl konumu 0108h, tam adresi 0B56:0108'dir.
  • var2'nin bağıl konumu 0109h, tam adresi 0B56:0109'dur.
    • WORD türünde olduğu için 2 bayt kaplar (0109h ve 010Ah).
    • Düşük bayt düşük adreste saklanır: 34h, 12h'den önce yer alır (little-endian).
Kesim değeri (0B56h) DOS'un programı nereye yüklediğine bağlıdır ve her çalıştırmada farklı olabilir; bağıl konumlar ise derleme anında sabittir.

Bellek Yerleşimi

ORG 100h Direktifi

  • Derleyiciye yürütülebilir dosyanın yükleneceği adresi söyler; değişken adları adreslerle değiştirilirken dikkate alınır.
  • .COM dosyalarında kullanılır.
  • İşletim sistemi kesimin ilk 256 baytında (PSP) programla ilgili verileri tutar; komut satırı parametreleri bu alandadır.
  • .EXE dosyaları 0000h bağıl konumuna yüklenir ve değişkenler için ayrı bir kesim kullanır.
  • Direktifler gerçek makine koduna dönüştürülmez.
PSP: DOS bilgileri, komut satırı (80h–FFh)0000hkod: ORG 100h, ilk komut0100hdeğişkenler (RET'ten sonra)boşyığın: SP = FFFEh'den aşağı büyürFFFEhFFFFhCS = DS = ES = SStek kesim, en fazla 64 KBIP = 0100h

Bellek Yerleşimi

.COM ve .EXE

.COM.EXE
BaşlangıçORG 100h, IP = 0100hgiriş noktası END start ile belirtilir
Kesimlertek kesim: CS = DS = ES = SSayrı kod, veri ve yığın kesimleri
Boyuten fazla 64 KB (PSP dahil)64 KB'tan büyük olabilir
DShazır, değişkenlere doğrudan erişilirprogramın başında MOV AX, @data · MOV DS, AX
Dosyayalnızca makine kodu (başlık yok)yeniden yerleştirme (relocation) bilgili başlık

Bu dersteki örneklerin çoğu emu8086 .COM şablonuyla yazılmıştır.

Diziler

Diziler

  • Diziler değişken zincirleri olarak düşünülebilir: ardışık bellek konumlarında saklanan veri gruplarıdır.
  • Tırnak içindeki metin otomatik olarak bayt dizisine (ASCII kodları) dönüştürülür.
  • Dizi elemanlarına bellek adresi üzerinden erişilir: ilk eleman dizinin adresinde, sonrakiler ardından.
a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h
b DB 'Hello', 0
…a[0]48a[1]65a[2]6Ca[3]6Ca[4]6Fa[5]00b[0]48b[1]65b[2]6C…

a ve b bellekte aynı baytları tutar: 48h 'H', 65h 'e', 6Ch 'l', 6Ch 'l', 6Fh 'o', 00h (dizgi sonu).

Diziler · Kodu adım adım çalıştır

Kod İzleme: Dizi Elemanlarına Erişim

AX0000AHALBX0000BHBLSI0000a dizisia[0]48a[1]65a[2]6Ca[3]6Ca[4]6Fa[5]00

a[3], a + 3 bayt demektir: AL = 6Ch ('l').

AX0000AHALBX0000BHBLSI0000a dizisia[0]48a[1]65a[2]6Ca[3]6Ca[4]6Fa[5]00

İndis yazmacı SI = 0.

AX0000AHALBX0048BHBLSI0000a dizisia[0]48a[1]65a[2]6Ca[3]6Ca[4]6Fa[5]00

a[SI] = [a + SI]: BL = 48h ('H').

AX0000AHALBX0048BHBLSI0001a dizisia[0]48a[1]65a[2]6Ca[3]6Ca[4]6Fa[5]00

SI = 1: bir sonraki bayt.

AX0000AHALBX6548BHBLSI0001a dizisia[0]48a[1]65a[2]6Ca[3]6Ca[4]6Fa[5]00

BH = a[1] = 65h ('e'). BX = 6548h.

AX0000AHALBX6548BHBLSI0001a dizisia[0]48a[1]45a[2]6Ca[3]6Ca[4]6Fa[5]00

Dizi bayt türünde olduğu için boyut belli: a[1] ← 45h ('E'). Dizi artık “HEllo”.

AX0000AHALBX6548BHBLSI0001a dizisia[0]48a[1]45a[2]6Ca[3]6Ca[4]6Fa[5]00

RET. Dizi tanımı kodun sonunda, yürütülmeyen bölgede.

MOV AL, a[3]   ; a + 3
MOV SI, 0
MOV BL, a[SI]  ; a + 0
INC SI
MOV BH, a[SI]  ; a + 1
MOV a[SI], 'E' ; a[1] ← 45h
RET
a DB 48h,65h,6Ch,6Ch,6Fh,0

Diziler

Erişim Yolları ve DUP

Elemana erişim
  • Köşeli parantezle sabit indis: MOV AL, a[3]
  • Bellek indis yazmaçları (BX, SI, DI, BP) ile: MOV SI, 3 · MOV AL, a[SI]
  • Eşdeğer yazımlar: a[SI] = [a + SI] = [SI + a]
  • İndis bayt cinsindendir, eleman sayısı değil.
DUP işleci Büyük dizi için: sayı DUP(değer(ler))
  • c DB 5 DUP(9) = c DB 9, 9, 9, 9, 9
  • d DB 5 DUP(1, 2) = d DB 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
  • tampon DB 100 DUP(?): 100 baytlık ilk değersiz alan
  • tablo DW 10 DUP(0): 10 sözcük = 20 bayt
Kaynaktaki “DW dizi tanımlamak için kullanılamaz” ifadesi eksiktir: DW ile sayı dizileri tanımlanabilir (w DW 1000h, 2000h); kullanılamadığı şey metin dizgileridir (DW 'Hello' geçersiz). Değerler 255'ten büyük ya da −128'den küçükse DW gerekir.

Diziler · Kodu adım adım çalıştır

Kod İzleme: DW Dizisinde İndis

AX0000AHALBX0000BHBLCX0000CHCLDX0000DHDLSI0000w dizisi (bayt bayt)w+011w+111w+222w+322w+433w+533

w[0]: ilk sözcük → AX = 1111h.

AX0000AHALBX2222BHBLCX0000CHCLDX0000DHDLSI0000w dizisi (bayt bayt)w+011w+111w+222w+322w+433w+533

İkinci eleman w[2]'dedir (her eleman 2 bayt): BX = 2222h.

AX0000AHALBX2222BHBLCX0000CHCLDX0000DHDLSI0004w dizisi (bayt bayt)w+011w+111w+222w+322w+433w+533

i. elemanın indisi = 2 × i: üçüncü eleman için SI = 4.

AX0000AHALBX2222BHBLCX3333CHCLDX0000DHDLSI0004w dizisi (bayt bayt)w+011w+111w+222w+322w+433w+533

CX = w[SI] = 3333h.

AX0000AHALBX2222BHBLCX3333CHCLDX2211DHDLSI0004w dizisi (bayt bayt)w+011w+111w+222w+322w+433w+533

w[1] elemanın ortasından okur: baytlar 11h, 22h → DX = 2211h. Sık yapılan hata!

MOV AX, w[0]   ; 1. eleman
MOV BX, w[2]   ; 2. eleman
MOV SI, 4
MOV CX, w[SI]  ; 3. eleman
MOV DX, w[1]   ; dikkat!
w DW 1111h, 2222h, 3333h

Diziler

Tanımdan Bayta

Bir DB / DW / DD satırı yazın: sayılar (onlu, h, b, o), 'metin' (yalnız DB), ? ve n DUP(…) desteklenir. Hücre üstü: değişkenin başından bayt uzaklığı.

Adresler

Değişkenin Adresini Alma

LEA (Load Effective Address)Değişkenin adresini (bağıl konum) yazmaca yükler: LEA BX, VAR1. İndisli değişkenlerin adresini almak için de kullanılabilir: LEA BX, a[SI].
OFFSETAssembler işlecidir; değişkenin bağıl konum değerini derleme anında sağlar: MOV BX, OFFSET VAR1.
Değişkenin adresi, bir prosedüre parametre geçirmek için çok kullanışlıdır: prosedüre büyük bir dizinin kendisi değil, yalnızca 16 bitlik adresi verilir.
KomutBX'e ne yüklenir?
MOV BX, VAR1 (VAR1 DW)VAR1'in değeri (içerik)
LEA BX, VAR1 · MOV BX, OFFSET VAR1VAR1'in adresi (bağıl konum)

Adresler · Kodu adım adım çalıştır

Kod İzleme: LEA ile Değişken Güncelleme

AX0000AHALBX0000BHBLDS:010C … (VAR1 = 010Dh)010CC3010D22010E00

Kod 0100h'den başlar; derleyici VAR1'i 010Dh'ye yerleştirdi (12 bayt kod + RET).

AX0022AHALBX0000BHBLDS:010C … (VAR1 = 010Dh)010CC3010D22010E00

AL = VAR1'in değeri = 22h.

AX0022AHALBX010DBHBLDS:010C … (VAR1 = 010Dh)010CC3010D22010E00

BX = VAR1'in adresi = 010Dh. BX artık VAR1'i gösteren bir işaretçidir.

AX0022AHALBX010DBHBLDS:010C … (VAR1 = 010Dh)010CC3010D44010E00

[BX] üzerinden VAR1 güncellenir: [010Dh] = 44h.

AX0044AHALBX010DBHBLDS:010C … (VAR1 = 010Dh)010CC3010D44010E00

VAR1 tekrar okunur: AL = 44h. Değişkene adı ile de işaretçi ile de erişilebilir.

AX0044AHALBX010DBHBLDS:010C … (VAR1 = 010Dh)010CC3010D44010E00

RET. END kaynak dosyanın sonunu bildiren direktiftir.

ORG 100h
MOV AL, VAR1          ; değer
LEA BX, VAR1          ; adres
MOV BYTE PTR [BX], 44h
MOV AL, VAR1          ; yeni değer
RET
VAR1 DB 22h
END

Adresler

LEA ve OFFSET Aynı mı?

OFFSET ile aynı program

ORG 100h
MOV AL, VAR1
MOV BX, OFFSET VAR1
MOV BYTE PTR [BX], 44h
MOV AL, VAR1
RET
VAR1 DB 22h
END
  • emu8086'da LEA BX, VAR1 ve MOV BX, OFFSET VAR1 aynı makine koduna derlenir: MOV BX, num (BB 0D 01); num, değişkenin bağıl konumunun 16 bitlik değeridir.
  • MASM/TASM LEA BX, VAR1'i gerçek LEA komutu olarak kodlar (8D 1E 0D 01, 4 bayt); sonuç yine aynıdır.
  • Fark: LEA BX, a[SI] adresi çalışma anında hesaplar (a + SI); OFFSET yalnızca sabit adres verir.
  • Köşeli parantez içinde yalnızca BX, SI, DI, BP kullanılabilir.

Sabitler

Sabitler (EQU)

  • Değişkenlere benzer, ancak yalnızca derleme sırasında var olurlar; bellekte yer kaplamazlar.
  • Bir sabitin değeri tanımlandıktan sonra değiştirilemez.
  • Programın farklı bölümlerinde aynı değerin kullanılmasını sağlar; değer tek yerden güncellenir.
  • Tanım: ad EQU <herhangi bir ifade>
  • Assembler her kullanımda adı değeriyle değiştirir: MOV AX, k → MOV AX, 5 (B8 05 00).
k      EQU 5
SATIR  EQU 80

MOV AX, k        ; AX = 5
MOV BX, SATIR*2  ; BX = 160
MOV CL, k+1      ; CL = 6
k EQU 5k DB 5
Bellekkullanmaz1 bayt
MOV AL, kAL ← 5 (dolaysız)AL ← [k] (bellekten)
Değiştirilebilir mi?hayırevet: MOV k, 7

Örnek Programlar · Kodu adım adım çalıştır

Kod İzleme: Değişkenler Arasında Veri Taşıma

AX0000AHALdeğişkenler (DS)value10Avalue1+100value200value2+100

jmp start CPU'yu verilerin üzerinden atlatır; aksi hâlde veri baytları komut gibi yürütülürdü.

AX000AAHALdeğişkenler (DS)value10Avalue1+100value200value2+100

value1 → AX = 000Ah. Bellekten belleğe doğrudan MOV olmadığı için ara yazmaç gerekir.

AX000AAHALdeğişkenler (DS)value10Avalue1+100value20Avalue2+100

AX → value2: bellekte 0A 00. Artık value1 = value2 = 10.

AX000AAHALdeğişkenler (DS)value10Avalue1+100value20Avalue2+100

end start: kaynağın sonu; start programın giriş noktasıdır.

jmp start
value1 DW 10    ; 2 baytlık değişken
value2 DW 0     ; ikinci değişken
start:
MOV AX, value1  ; AX ← value1
MOV value2, AX  ; value2 ← AX
end start

Örnek Programlar · Kodu adım adım çalıştır

Kod İzleme: Değişkenleri Toplama

AX0000AHALBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0değişkenler (DS)value105value1+101value203value2+101result00result+100

Başlangıç: result ? ile tanımlı; emu8086 belleğe 00 00 koyar, ama değerine güvenilmez.

AX0105AHALBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0değişkenler (DS)value105value1+101value203value2+101result00result+100

AX = value1 = 0105h.

AX0208AHALBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0değişkenler (DS)value105value1+101value203value2+101result00result+100

ADD bellek işlenenini doğrudan kullanabilir: 0105h + 0103h = 0208h. Bayraklar: CF = 0, ZF = 0, PF = 0 (08h'de bir adet 1).

AX0208AHALBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0değişkenler (DS)value105value1+101value203value2+101result08result+102

result ← AX: bellekte 08 02 (little-endian).

AX0208AHALBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0değişkenler (DS)value105value1+101value203value2+101result08result+102

Sonuç: result = 0208h = 520 (261 + 259).

jmp start
value1 DW 105h  ; ilk değer 105h
value2 DW 103h  ; ilk değer 103h
result DW ?     ; belirsiz
start:
MOV AX, value1  ; AX ← value1
ADD AX, value2  ; AX ← AX + value2
MOV result, AX  ; result ← AX
end start

Örnek Programlar · Kodu adım adım çalıştır

Kod İzleme: Büyük Olanı Bul (10, 5)

AX000AAHALBayraklarCF=0ZF=0SF=0OF=0değişkenler (DS)value10Avalue1+100value205value2+100max_value00max_value+100

AX = value1 = 000Ah.

AX000AAHALBayraklarCF=0ZF=0SF=0OF=0değişkenler (DS)value10Avalue1+100value205value2+100max_value00max_value+100

CMP çıkarma yapar ama sonucu saklamaz, yalnız bayrakları ayarlar: 10 − 5.

AX000AAHALBayraklarCF=0ZF=0SF=0OF=0değişkenler (DS)value10Avalue1+100value205value2+100max_value00max_value+100

JGE (işaretli ≥): SF = OF olduğundan atlanır → greater_or_equal.

AX000AAHALBayraklarCF=0ZF=0SF=0OF=0değişkenler (DS)value10Avalue1+100value205value2+100max_value00max_value+100

AX = value1 (zaten öyleydi; bu satır gereksiz ama zararsız).

AX000AAHALBayraklarCF=0ZF=0SF=0OF=0değişkenler (DS)value10Avalue1+100value205value2+100max_value0Amax_value+100

max_value ← AX = 000Ah.

AX000AAHALBayraklarCF=0ZF=0SF=0OF=0değişkenler (DS)value10Avalue1+100value205value2+100max_value0Amax_value+100

RET: DOS'a dönüş. RET olmasaydı CPU value1'in baytlarını komut sanıp yürütürdü.

ORG 100h
MOV AX, value1     ; AX ← value1
CMP AX, value2     ; AX − value2
JGE greater_or_equal
MOV AX, value2     ; küçükse value2
JMP store_max
greater_or_equal:
MOV AX, value1
store_max:
MOV max_value, AX  ; sonucu sakla
RET                ; (kaynakta eksikti)
value1 DW 10
value2 DW 5
max_value DW ?

Örnek Programlar · Kodu adım adım çalıştır

Kod İzleme: Büyük Olanı Bul (3, 7)

AX0003AHALBayraklarCF=0ZF=0SF=0OF=0değişkenler (DS)value103value1+100value207value2+100max_value00max_value+100

AX = value1 = 0003h.

AX0003AHALBayraklarCF=1ZF=0SF=1OF=0değişkenler (DS)value103value1+100value207value2+100max_value00max_value+100

CMP çıkarma yapar ama sonucu saklamaz, yalnız bayrakları ayarlar: 3 − 7.

AX0003AHALBayraklarCF=1ZF=0SF=1OF=0değişkenler (DS)value103value1+100value207value2+100max_value00max_value+100

SF ≠ OF → koşul sağlanmaz, atlanmaz; sıradaki komuta geçilir.

AX0007AHALBayraklarCF=1ZF=0SF=1OF=0değişkenler (DS)value103value1+100value207value2+100max_value00max_value+100

AX = value2 = 0007h (büyük olan).

AX0007AHALBayraklarCF=1ZF=0SF=1OF=0değişkenler (DS)value103value1+100value207value2+100max_value00max_value+100

JMP koşulsuz atlar → store_max.

AX0007AHALBayraklarCF=1ZF=0SF=1OF=0değişkenler (DS)value103value1+100value207value2+100max_value07max_value+100

max_value ← AX = 0007h.

AX0007AHALBayraklarCF=1ZF=0SF=1OF=0değişkenler (DS)value103value1+100value207value2+100max_value07max_value+100

RET: DOS'a dönüş. RET olmasaydı CPU value1'in baytlarını komut sanıp yürütürdü.

ORG 100h
MOV AX, value1     ; AX ← value1
CMP AX, value2     ; AX − value2
JGE greater_or_equal
MOV AX, value2     ; küçükse value2
JMP store_max
greater_or_equal:
MOV AX, value1
store_max:
MOV max_value, AX  ; sonucu sakla
RET                ; (kaynakta eksikti)
value1 DW 10
value2 DW 5
max_value DW ?

Örnek Programlar

Karşılaştırma Notları

CMPCMP a, b = a − b hesaplanır, sonuç atılır; yalnız bayraklar (CF, ZF, SF, OF, PF, AF) güncellenir.
İşaretli / işaretsizJGE, JG, JL: işaretli (SF, OF). JAE, JA, JB: işaretsiz (CF). value1 = −1 (FFFFh), value2 = 5 için JGE atlamaz, JAE atlar.
Kaynaktaki hataProgramda veri tanımları kodun hemen ardındaydı ve RET yoktu; CPU 0A 00 05 00… baytlarını komut olarak yürütürdü. Düzeltme: RET (ya da başta jmp start).
İyileştirmegreater_or_equal altındaki MOV AX, value1 gereksizdir; AX zaten value1'dir. Etiket doğrudan store_max'e atlayabilir.

Koşullu atlamalar “Akış Kontrolü” bölümünde ayrıntılı işlenir.

Örnek Programlar

Double Word Değişken

jmp start
mydouble dd 12345678h  ; double word
mywords  dw 5678h      ; 2 ayrı word
         dw 1234h
mybytes  db 78h        ; 4 ayrı byte
         db 56h
         db 34h
         db 12h
data dd 00010010001101000101011001111000b
start:  ; data'yı DX:AX'e yükle
mov ax, word ptr data
mov dx, word ptr [data+2]

Dört tanımın da bellekteki karşılığı aynıdır:

+078+156+234+312düşük word → AXyüksek → DX
  • DD 32 bit = 4 bayt; en düşük bayt en düşük adreste.
  • 8086'nın 32 bitlik yazmacı yoktur: değer DX:AX çiftinde tutulur (DX yüksek, AX düşük sözcük).

Örnek Programlar · Kodu adım adım çalıştır

Kod İzleme: DX:AX'e 32 Bitlik Yükleme

DX0000DHDLAX5678AHALdata (4 bayt)data+078data+156data+234data+312

data'nın ilk iki baytı (78 56) → AX = 5678h. word ptr: data DD olduğu için boyut açıkça belirtilir.

DX1234DHDLAX5678AHALdata (4 bayt)data+078data+156data+234data+312

data+2'deki iki bayt (34 12) → DX = 1234h. DX:AX = 1234:5678h = 12345678h.

mov ax, word ptr data      ; data+0
mov dx, word ptr [data+2]  ; data+2
data dd 12345678h

Örnek Programlar

Veri Tanımlama Özeti

YazımAnlamıBellek
x DB 7bir bayt07
y DW 1234hbir sözcük34 12
z DD 12345678hdouble word78 56 34 12
s DB 'Hi', 0dizgi + sonlandırıcı48 69 00
t DB 3 DUP(0)tekrar00 00 00
u DW ?ilk değersiz?? ?? (emu8086: 00 00)
k EQU 10sabityer kaplamaz

Adres: LEA BX, x / MOV BX, OFFSET x. Değer: MOV AL, x. Boyut değiştirme: word ptr, byte ptr.

Özet

Özet

DeğişkenBir bellek konumuna verilen ad; derleyici adı bağıl konumla değiştirir.
DB / DW / DD1, 2, 4 bayt; little-endian; ? ilk değersiz.
ORG 100h.COM kodu 0100h'den başlar; ilk 256 bayt PSP. Veriler RET'ten sonra ya da jmp ile atlanarak.
DizilerArdışık baytlar; a[i] bayt uzaklığıdır; DUP ile tekrar; DW dizisinde indis 2 × i.
LEA / OFFSETAdres almak için; LEA çalışma anında indisli adres de hesaplar.
EQUDerleme anı sabiti; bellekte yer kaplamaz, değiştirilemez.

Özet

Alıştırmalar

  1. x DB 5, 6 · y DW 0ABCDh · z DB 'OK' tanımları 0200h'den başlıyorsa her baytın adresi ve değeri?
  2. tablo DW 10 DUP(?) kaç bayt kaplar? 7. elemanın (indis 6) bağıl uzaklığı nedir?
  3. Önceki sorudaki y için MOV AL, BYTE PTR y ve MOV AL, BYTE PTR y+1 sonrası AL?
  4. LEA SI, a[BX] ile MOV SI, OFFSET a arasındaki fark nedir?
  5. İki DW değişkenin toplamını üçüncüsüne yazan, toplamda taşma olursa (CF = 1) tasma DB 1 yapan kodu yazın.
  6. dd 0FFFFFFFFh değerine 1 eklemek için DX:AX'te hangi komut çifti gerekir?
Cevaplar
  1. 0200: 05, 0201: 06, 0202: CD, 0203: AB, 0204: 4F ('O'), 0205: 4B ('K').
  2. 20 bayt; uzaklık 6 × 2 = 12 = 0Ch.
  3. CDh ve ABh.
  4. LEA, a + BX'i çalışma anında hesaplar; OFFSET yalnızca a'nın sabit adresidir.
  5. MOV AX,v1 · ADD AX,v2 · MOV v3,AX · JNC son · MOV tasma,1 · son:
  6. ADD AX,1 · ADC DX,0 (eldeyi yüksek sözcüğe taşır).

Özet

Kaynaklar

  • emu8086 belgeleri, 8086 assembler tutorial for beginners, bölüm 3: variables (DB, DW, DUP, LEA, OFFSET, EQU).
  • Barry B. Brey, The Intel Microprocessors, 8. baskı, Pearson.
  • Kip R. Irvine, Assembly Language for x86 Processors, Pearson (veri tanımlama direktifleri).
  • Microsoft MASM 6.1 Programmer's Guide: DB/DW/DD, DUP, EQU, OFFSET.

Son

Bölüm 4: Değişkenler
Sonraki bölüm: Bölüm 5: Kesmeler
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.