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

Bölüm 4: Değişkenler · Çalışma Soruları
AdlandırmaDB, DW, DDBellek yerleşimiORG 100hDUP ve dizilerLEA ve OFFSETEQUToplamaKarşılaştırmaÇift sözcük
Sercan KÜLCÜ

Çoktan Seçmeli · Değişkenler

Soru 1: Geçerli Tanım

Aşağıdaki veri tanımlarından hangisi hatasız derlenir?

D: ? ilk değersiz sözcük ayırır (emu8086 belleğe 00 00 koyar). A: ad harfle başlamalıdır. B: yazmaç adı değişken adı olamaz. C: 300 bir bayta (0 … 255 ya da −128 … 127) sığmaz; DW gerekir.

Kod Okuma · Değişkenler

Soru 2: DB, DW ve DD

Tanımlar art arda yerleşiyor. a) Her biri kaç bayttır, A'ya göre bağıl uzaklıkları nedir? b) X ve Y bellekte hangi baytlarla durur? c) MOV AL, X neden hatalıdır?

A  DB 41h
S  DB 'Hi$'
X  DW 1234h
Y  DD 12345678h
Z  DW ?
T  DB 3 DUP(0)
Cevabı göster
  • a) A: 1 bayt (+0) · S: 3 bayt, 'H' 'i' '$' (+1) · X: 2 (+4) · Y: 4 (+6) · Z: 2 (+10) · T: 3 (+12) → toplam 15 bayt
  • b) Little-endian: X → 34 12, Y → 78 56 34 12
  • c) X sözcüktür, AL bayttır: boyut uyuşmaz. MOV AL, BYTE PTR X → AL = 34h (düşük bayt); MOV AX, X → AX = 1234h.

DB = 1, DW = 2, DD = 4 bayt; tırnak içindeki her karakter bir bayttır.

Çoktan Seçmeli · Bellek Yerleşimi

Soru 3: Kaç Bayt?

Aşağıdaki tanımlar bellekte toplam kaç bayt yer kaplar?

a DB 5
b DW 3 DUP(0)
c DB 'ABC', 0
d DD 12345678h

C: a: 1 bayt · b: 3 sözcük = 6 bayt · c: 'A', 'B', 'C' ve 0 = 4 bayt · d: çift sözcük = 4 bayt → 1 + 6 + 4 + 4 = 15. 12, DUP'u bir kez saymaktır; 18, DD'yi 8 bayt saymaktır.

Adım Adım Çalıştırma · Bellek Yerleşimi

Soru 4: Değişken Adresleri

Başlangıçta yazmaçlar 0. RET'ten hemen önce AX, DX ve CL ne olur? Değişkenler hangi bağıl konumlara yerleşir?

AX0007AHALBX0000BHBLCX0000CHCLDX0000DHDLSI0000

Kod 0100h'den başlar; komutlar 3+3+3+4+2+4+1 = 20 (14h) bayt → a = 0114h, dizi = 0115h, w = 0118h. AL ← [0114h] = 07h (a bayt değişkendir).

AX0007AHALBX0115BHBLCX0000CHCLDX0000DHDLSI0000

OFFSET dizi = 0115h: adres, derleme anında bilinen bir sabittir. BX artık diziyi gösterir.

AX3007AHALBX0115BHBLCX0000CHCLDX0000DHDLSI0000

EA = 0115h + 2 = 0117h → dizi[2] = 30h → AH = 30h, AX = 3007h.

AX3007AHALBX0115BHBLCX0000CHCLDX0000DHDLSI0118

LEA SI, w → SI = 0118h (adres, içerik değil).

AX3007AHALBX0115BHBLCX0000CHCLDXABCDDHDLSI0118

DX ← [0118h] sözcüğü: düşük bayt CDh, yüksek ABh → DX = ABCDh.

AX3007AHALBX0115BHBLCX00CDCHCLDXABCDDHDLSI0118

BYTE PTR w yalnız [0118h]'i okur → CL = CDh (düşük bayt).

ORG 100h
MOV AL, a
MOV BX, OFFSET dizi
MOV AH, [BX+2]
LEA SI, w
MOV DX, [SI]
MOV CL, BYTE PTR w
RET
a    DB 7
dizi DB 10h, 20h, 30h
w    DW 0ABCDh

Çoktan Seçmeli · Bellek Yerleşimi

Soru 5: ORG 100h

.COM programının başındaki ORG 100h için hangisi doğrudur?

A: ORG bir direktiftir, makine koduna çevrilmez; değişken adresleri ona göre hesaplanır (MOV AL, var1 → MOV AL, [0108h]). Kesimin ilk 256 baytı (PSP) DOS'a aittir. .COM'da CS = DS = ES = SS ve başta SP = FFFEh'dir; fiziksel adres DOS'un seçtiği kesime bağlıdır.

Kod Okuma · Diziler

Soru 6: Dizgide İndis

Kod çalışınca AL, AH, BL ve s dizgisi ne olur? ('a' = 61h, 'e' = 65h, 'h' = 68h)

ORG 100h
MOV SI, 3
MOV AL, s[SI]
MOV BL, s[1]
INC SI
MOV s[SI], '!'
MOV AH, s+6
RET
s DB 'Merhaba', 0
Cevabı göster
  • İndis bayt cinsindendir ve 0'dan başlar: s[0] = 'M', s[1] = 'e', s[2] = 'r', s[3] = 'h' …
  • AL ← s[3] = 68h ('h'); BL ← s[1] = 65h ('e')
  • SI = 4: s[4] ← '!' (dizi DB olduğu için boyut belli) → s = "Merh!ba", 0
  • AH ← s+6 = 61h ('a') → AX = 6168h

s[SI] = [s + SI] = [SI + s]: aynı adres, farklı yazım.

Hesap Sorusu · Diziler

Soru 7: DUP ve Sözcük Dizisi

a) c DB 3 DUP(1, 2), 0 bellekte hangi baytları oluşturur?
b) t DW 10 DUP(?) kaç bayt kaplar? 7. elemanın (indis 6) t'ye göre bağıl uzaklığı nedir?
c) MOV AX, t[3] hangi elemanı okur?

Cevabı göster
  • a) 01 02 01 02 01 02 00 (7 bayt): DUP parantezdeki listeyi 3 kez tekrarlar.
  • b) 10 sözcük = 20 bayt; i. elemanın uzaklığı 2 × i → 6 × 2 = 12 = 0Ch.
  • c) Hiçbirini tam okumaz: t[3], 2. elemanın (t+2, t+3) yüksek baytı ile 3. elemanın (t+4) düşük baytını birleştirir. Sözcük dizisinde indis hep çift olmalıdır.

Çoktan Seçmeli · Adresler

Soru 8: LEA ve OFFSET

LEA BX, dizi ile MOV BX, OFFSET dizi için hangisi doğrudur?

B: Basit bir değişkende ikisi aynı sonucu verir. Fark: OFFSET derleme anında hesaplanan bir sabittir; LEA ise adresi çalışma anında hesaplayabilir: LEA SI, [BX+DI+4], LEA BX, dizi[SI]. Ne LEA ne MOV bayrakları değiştirir.

Adım Adım Çalıştırma · Adresler

Soru 9: LEA ile Adres Almak

Kod çalışınca AX, BX ve num3 ne olur? LEA ne yükler?

AX0000AHALBX0000BHBLSI0115num300+100

SI ← num1'in adresi (0115h). LEA belleğe erişmez, yalnız adresi hesaplar.

AX0005AHALBX0000BHBLSI0115num300+100

AX ← [SI] = 0005h (yazmaç dolaylı adresleme).

AX0005AHALBX0000BHBLSI0117num300+100

SI ← num2'nin adresi (0117h): 2 bayt ileride.

AX0005AHALBX000ABHBLSI0117num300+100

BX ← [SI] = 000Ah (10 onluktur).

AX000FAHALBX000ABHBLSI0117num300+100

AX = 0005h + 000Ah = 000Fh.

AX000FAHALBX000ABHBLSI0119num300+100

SI ← num3'ün adresi (0119h).

AX000FAHALBX000ABHBLSI0119num30F+100

[SI] ← AX: num3 = 000Fh (bellekte 0F 00).

lea si, num1
mov ax, [si]     ; 1. sayı
lea si, num2
mov bx, [si]     ; 2. sayı
add ax, bx
lea si, num3
mov [si], ax     ; num3'e yaz
ret
num1 dw 5
num2 dw 10
num3 dw 0

Çoktan Seçmeli · Adresler

Soru 10: Değer mi, Adres mi?

VAR1, 0108h bağıl konumunda VAR1 DW 1234h olarak tanımlı. MOV BX, VAR1 ve MOV CX, OFFSET VAR1 sonrası BX ve CX nedir?

D: MASM/emu8086'da değişken adı bellekteki değeri temsil eder: MOV BX, VAR1 = MOV BX, [0108h] → 1234h. OFFSET ise adresin kendisini (0108h) sabit olarak verir; LEA CX, VAR1 de aynı sonucu verirdi.

Çoktan Seçmeli · Sabitler

Soru 11: EQU Sabiti

k EQU 5 ve SATIR EQU 80 tanımlı. Hangisi doğrudur?

A: EQU sabitleri yalnızca derleme sırasında vardır: assembler her kullanımda adı değeriyle değiştirir ve ifadeyi hesaplar: 80 × 2 + 5 = 165 (anlık değer). Bellekte yer kaplamazlar, değiştirilemezler (MOV k, 7 → hedef sabit olamaz); MOV AL, k anlık 5 yükler.

Kod Okuma · Örnek Programlar

Soru 12: Değişkenlerle Toplama

AX sırayla hangi değerleri alır? SONUC'ta (bayt bayt) ne bulunur? JMP BASLA neden gerekli? (b) DEGER1 = 1225H, DEGER2 = 2133H olsaydı?

JMP BASLA
DEGER1 DW 125H
DEGER2 DW 133H
SONUC  DW ?
BASLA:
MOV AX, DEGER1
ADD AX, DEGER2
MOV SONUC, AX
Cevabı göster
  • AX: 0125h → 0258h (5 + 3 = 8, 2 + 3 = 5, 1 + 1 = 2; elde yok)
  • SONUC = 0258h → bellekte 58h, 02h. MOV SONUC, AX AX'i değiştirmez.
  • Veriler kodun arasında: JMP olmasaydı CPU 25 01 33 01 … baytlarını komut sanıp yürütürdü.
  • (b) AX: 1225h → 3358h

Çoktan Seçmeli · Örnek Programlar

Soru 13: Onluk mu, Onaltılık mı?

Kod çalışınca AX ne olur?

MOV AX, SAYI1
MOV BX, SAYI2
ADD AX, BX
RET
SAYI1 DW 5H
SAYI2 DW 10H

C: 10H onaltılıktır (16): 5h + 10h = 15h. 000Fh, 10'u onluk saymaktır (5 + 10 = 15 = 0Fh); 0010h BX'in değeridir; 0105h baytları yan yana yazmaktır. Sonek yoksa sayı onluktur: DW 10 → 000Ah.

Adım Adım Çalıştırma · Örnek Programlar

Soru 14: RET'ten Sonra Gelen Veriler

Kod çalışınca AX, BX ve num4 ne olur?

AX0005AHALBX0000BHBLnum400+100

AX ← num1 = 0005h. Değişken adı değeri temsil eder.

AX0005AHALBX000ABHBLnum400+100

BX ← num2 = 000Ah: 10 onluktur (sonek yok).

AX000FAHALBX000ABHBLnum400+100

AX = 5 + 10 = 000Fh.

AX000FAHALBX000FBHBLnum400+100

BX ← num3 = 15 = 000Fh.

AX001EAHALBX000FBHBLnum400+100

AX = 000Fh + 000Fh = 001Eh (30).

AX001EAHALBX000FBHBLnum41E+100

num4 ← AX → bellekte 1E 00. Ardından RET: alttaki veri satırları hiç yürütülmez, JMP gerekmez.

mov ax, num1     ; 1. sayı
mov bx, num2     ; 2. sayı
add ax, bx
mov bx, num3     ; 3. sayı
add ax, bx
mov num4, ax     ; toplamı sakla
ret
num1 dw 5
num2 dw 10
num3 dw 15
num4 dw 0

Kod Okuma · Örnek Programlar

Soru 15: İşaretli mi, İşaretsiz mi?

Program büyük olanı max_value'ya yazıyor. max_value ne olur? JGE yerine JAE yazılsaydı?

ORG 100h
MOV AX, value1
CMP AX, value2
JGE buyuk
MOV AX, value2
buyuk:
MOV max_value, AX
RET
value1 DW -3
value2 DW 2
max_value DW ?
Cevabı göster
  • value1 = −3 bellekte FFFDh olarak durur.
  • CMP AX, value2: FFFDh − 0002h hesaplanır, sonuç atılır, bayraklar kurulur.
  • JGE işaretli karşılaştırır: −3 ≥ 2 yanlış → atlamaz, AX ← value2 → max_value = 0002h.
  • JAE işaretsiz karşılaştırır: 65533 ≥ 2 doğru → atlar → max_value = FFFDh.

Bellekte yalnızca bit deseni vardır; işaretli mi işaretsiz mi olduğuna kullanan komut karar verir.

Çoktan Seçmeli · Örnek Programlar

Soru 16: Çift Sözcük

Kod çalışınca DX:AX ne olur?

MOV AX, WORD PTR data
MOV DX, WORD PTR [data+2]
ADD AX, 1
ADC DX, 0
RET
data DD 0001FFFFh

B: data'nın baytları FF FF 01 00: AX = FFFFh (düşük sözcük), DX = 0001h. ADD AX, 1 → AX = 0000h, CF = 1. ADC DX, 0 eldeyi yüksek sözcüğe ekler: DX = 0002h. DX:AX = 00020000h = 0001FFFFh + 1. A, eldeyi unutmaktır (ADD DX, 0).

Hata Bulma · Örnek Programlar

Soru 17: Hatalı Tanım ve Erişim

Bu programda dört hata var. Nedenleri nedir, nasıl düzeltilir?

ORG 100h
MOV AL, v2
MOV v1, v2
MOV k, 7
RET
v1 DW 1
v2 DW 2
s  DW 'Merhaba'
k  EQU 5
Cevabı göster
  • MOV AL, v2: v2 sözcük, AL bayt → MOV AX, v2 (ya da MOV AL, BYTE PTR v2)
  • MOV v1, v2: iki bellek işleneni → MOV AX, v2 · MOV v1, AX
  • MOV k, 7: k bir EQU sabitidir; bellekte yeri yoktur, değiştirilemez (assembler MOV 5, 7 görür)
  • s DW 'Merhaba': metin dizgisi DW ile tanımlanamaz → s DB 'Merhaba'

Son

Bölüm 4: Değişkenler: Çalışma Soruları
Konu anlatımı: Değişkenler sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.