Bölüm 4: Değişkenler
Ç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?
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).
OFFSET dizi = 0115h: adres, derleme anında bilinen bir sabittir. BX artık diziyi gösterir.
EA = 0115h + 2 = 0117h → dizi[2] = 30h → AH = 30h, AX = 3007h.
LEA SI, w → SI = 0118h (adres, içerik değil).
DX ← [0118h] sözcüğü: düşük bayt CDh, yüksek ABh → DX = ABCDh.
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?
SI ← num1'in adresi (0115h). LEA belleğe erişmez, yalnız adresi hesaplar.
AX ← [SI] = 0005h (yazmaç dolaylı adresleme).
SI ← num2'nin adresi (0117h): 2 bayt ileride.
BX ← [SI] = 000Ah (10 onluktur).
AX = 0005h + 000Ah = 000Fh.
SI ← num3'ün adresi (0119h).
[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?
AX ← num1 = 0005h. Değişken adı değeri temsil eder.
BX ← num2 = 000Ah: 10 onluktur (sonek yok).
AX = 5 + 10 = 000Fh.
BX ← num3 = 15 = 000Fh.
AX = 000Fh + 000Fh = 001Eh (30).
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.
JGEişaretli karşılaştırır: −3 ≥ 2 yanlış → atlamaz, AX ← value2 → max_value = 0002h.JAEiş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 daMOV AL, BYTE PTR v2)MOV v1, v2: iki bellek işleneni →MOV AX, v2·MOV v1, AXMOV k, 7: k bir EQU sabitidir; bellekte yeri yoktur, değiştirilemez (assemblerMOV 5, 7görür)s DW 'Merhaba': metin dizgisi DW ile tanımlanamaz →s DB 'Merhaba'