Bölüm 6: Aritmetik ve Mantıksal İşlemler
Çoktan Seçmeli · Bayrak Yazmacı
Soru 1: CF mi, OF mi?
MOV AL, 0C8h ve ardından ADD AL, 64h çalışıyor. Sonuçta AL, CF ve OF nedir?
D: İşaretsiz yorumda 200 + 100 = 300 > 255: dışarı elde çıkar, AL'de 300 − 256 = 44 = 2Ch kalır, CF = 1. İşaretli yorumda −56 + 100 = 44 doğrudur: farklı işaretli iki sayının toplamı taşamaz, OF = 0. AL 8 bittir; 12Ch oraya sığmaz.
Çoktan Seçmeli · Bayrak Yazmacı
Soru 2: En Büyük Pozitif Bayt
MOV AL, 7Fh ve ADD AL, 1 sonrasında bayraklar nedir?
D: 7Fh + 1 = 80h. İşaretsiz 127 + 1 = 128 bayta sığar: CF = 0. İşaretli +127 + 1 = +128 sığmaz, sonuç −128 görünür: iki pozitifin toplamı negatif çıktı, OF = 1. Sonucun en anlamlı biti 1: SF = 1. Ayrıca alt nibble F + 1 elde verir: AF = 1.
Çıktı Sorusu · Grup 1: İki İşlenenli
Soru 3: Yüksek ve Düşük Bayt
(a) AX = 0000h ile başlıyor. Her satırdan sonra AX nedir? (b) MOV AX, 0x00F0 ve ADD AH, 0x0010 sonrası AX nedir? İkinci komut ADD AH, 0x001E olsaydı?
MOV AH, 09H MOV AL, 05H ADD AL, AH
Cevabı göster
(a) AX: 0900h → 0905h → 090Eh. AH'ye yazmak AX'in üst baytını, AL'ye yazmak alt baytını değiştirir; 09h + 05h = 0Eh. 0Eh = 0000 1110b'de üç tane 1 var: PF = 0.
(b) AH = 00h + 10h → AX = 10F0h; AL (F0h) değişmez. Anlık değer 0x0010 diye yazılsa da hedef 8 bit olduğundan bayt olarak kullanılır. 001Eh ile AX = 1EF0h.
Çıktı Sorusu · Grup 1: İki İşlenenli
Soru 4: Çıkarmada Negatif Sonuç
Kod çalıştıktan sonra AX ve BX nedir? CF, ZF, SF, OF, AF ve PF kaç olur? (AX = BX = 0000h ile başlıyor.)
MOV AL, 05H MOV BL, 08H SUB AL, BL
Cevabı göster
AX = 00FDh, BX = 0008h. 05h − 08h = −3, 8 bitte ikiye tümleyenle FDh; AH değişmez.
| CF | ZF | SF | OF | AF | PF |
|---|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 1 | 0 |
CF = 1: küçükten büyük çıkarıldı, ödünç alındı. SF = 1: bit 7 = 1. OF = 0: işaretli 5 − 8 = −3 aralıkta ve doğru. AF = 1: alt nibble'da 5 − 8 ödünç. PF = 0: FDh = 1111 1101b'de yedi tane 1.
Çoktan Seçmeli · Grup 1: İki İşlenenli
Soru 5: Geçerli Komut
var1 bir bayt değişken (DB) olsun. Hangisi geçerli bir 8086 komutudur?
C: SUB bellek, yazmaç biçimi geçerlidir ve boyutlar (bayt, bayt) uyuşur. İki işlenen birden bellek olamaz (A); AL 8, BX 16 bittir (B); hedef sabit olamaz, sonuç ilk işlenene yazılır (D).
Çıktı Sorusu · Grup 1: İki İşlenenli
Soru 6: SUB ve SBB ile 32 Bit
00012345h − 0000ABCDh işlemi DX:AX − CX:BX olarak yapılıyor. SUB'dan sonra AX ve CF nedir? Sonuçta DX:AX kaç olur?
MOV AX, 2345h MOV DX, 0001h MOV BX, 0ABCDh MOV CX, 0000h SUB AX, BX SBB DX, CX
Cevabı göster
SUB AX, BX: 2345h − ABCDh ödünç ister → AX = 7778h, CF = 1.
SBB DX, CX: 0001h − 0000h − CF(1) = 0000h.
DX:AX = 00007778h = 30584 (74565 − 43981). En düşük sözcükte SUB, üstteki her sözcükte SBB kullanılır; ödünç CF ile taşınır.
Çoktan Seçmeli · Mantıksal İşlemler
Soru 7: Büyük Harfe Çevirme
AL'de küçük bir harf var (ör. 'k' = 6Bh). Hangi komut onu büyük harfe çevirir?
B: Küçük ve büyük harf yalnızca bit 5'te ayrılır ('k' = 6Bh, 'K' = 4Bh). DFh = 1101 1111b maskesi bit 5'i temizler, diğer bitleri korur. OR AL, 20h bit 5'i kurar ve küçük harf yapar; XOR AL, 0FFh bütün bitleri ters çevirir; AND AL, 20h bit 5 dışındaki her şeyi siler.
Adım Adım Çalıştırma · Mantıksal İşlemler
Soru 8: AND, OR, XOR, TEST
Her komuttan sonra AL nedir? TEST'ten sonra ZF ve SF kaç olur?
AL = 6Ch = 0110 1100b.
AND 0Fh üst nibble'ı siler (maskeleme): AL = 0Ch. Mantık komutları CF = OF = 0 yapar.
OR 30h bit 4 ve 5'i kurar: AL = 3Ch = 0011 1100b.
XOR 0FFh bütün bitleri ters çevirir: AL = C3h = 1100 0011b. Bit 7 = 1 → SF = 1.
TEST, AND yapar ama sonucu yazmaz: C3h AND 80h = 80h ≠ 0 → ZF = 0, SF = 1; AL = C3h kaldı. 80h'de tek bir 1 var: PF = 0.
ORG 100h MOV AL, 6Ch AND AL, 0Fh OR AL, 30h XOR AL, 0FFh TEST AL, 80h RET
Çoktan Seçmeli · Mantıksal İşlemler
Soru 9: TEST ile AND
TEST AL, 80h ile AND AL, 80h arasındaki fark nedir?
A: TEST, AND gibi bit bit VE işlemi yapar ama sonucu atar; CMP'nin SUB'a olan ilişkisi gibidir. İkisi de CF = OF = 0 yapar, ZF, SF ve PF'yi sonuca göre ayarlar. TEST AL, 80h ile AL bozulmadan işaret biti sınanır.
Çıktı Sorusu · Grup 2: Çarpma ve Bölme
Soru 10: MUL, DIV ve Onluk 10
Kod çalıştıktan sonra AX ve CX nedir? Son satır ADD AL, 10h olsaydı?
MOV CL, 4H MOV AL, 3H MUL CL MOV CL, 2H DIV CL ADD AL, 10
Cevabı göster
AX = 0010h, CX = 0002h.
- MUL CL: AX ← AL × CL = 3 × 4 = 12 = 000Ch.
- DIV CL: 000Ch ÷ 2 → AL = 06h (bölüm), AH = 00h (kalan).
- ADD AL, 10: 10 onluktur (0Ah): 06h + 0Ah = 10h.
10h yazılsaydı 06h + 10h → AX = 0016h. Sonek, sayının tabanını belirler.
Çıktı Sorusu · Grup 2: Çarpma ve Bölme
Soru 11: Bölüm ve Kalan
Kod çalıştıktan sonra AX nedir? AH ve AL neyi gösterir? BL = 0 olsaydı ne olurdu?
MOV AX, 100 MOV BL, 7 DIV BL
Cevabı göster
AX = 020Eh. 100 (onluk) = 0064h; bayt bölmede bölünen AX'tir.
100 ÷ 7 = 14, kalan 2 → AL = 0Eh (bölüm), AH = 02h (kalan).
BL = 0 ise işlemci bölme hatası kesmesi (INT 0) üretir. Bölüm AL'ye sığmadığında da aynısı olur: AX = 0400h, BL = 2 → 200h. DIV sonrasında bütün bayraklar tanımsızdır.
Çoktan Seçmeli · Grup 2: Çarpma ve Bölme
Soru 12: Çarpımın Üst Yarısı
16 bitlik çarpmada çarpımın üst 16 biti hangi yazmaçta saklanır? Bu kodda değeri nedir?
MOV AX, 1234h MOV BX, 0100h MUL BX
B: MUL BX: DX:AX ← AX × BX = 1234h × 0100h = 0012 3400h → DX = 0012h (üst), AX = 3400h (alt). Üst yarı sıfır olmadığı için CF = OF = 1. 8 bitlik MUL'de sonuç yalnızca AX'tedir (AH:AL).
Çoktan Seçmeli · Grup 2: Çarpma ve Bölme
Soru 13: IMUL Sonucu
AL = FEh ve BL = 05h iken IMUL BL sonrasında AX nedir?
C: IMUL işaretlidir: FEh = −2, sonuç −2 × 5 = −10 = FFF6h. AH yalnızca AL'nin işaret uzantısıdır, sonuç AL'ye sığmıştır: CF = OF = 0. Aynı bitlerle MUL BL işaretsiz 254 × 5 = 1270 = 04F6h verirdi.
Çoktan Seçmeli · Grup 2: Çarpma ve Bölme
Soru 14: Bölme Hatası
Hangi değerlerle DIV BL bölme hatasına (INT 0) yol açar?
C: 0400h ÷ 2 = 200h, bölüm AL'ye (en çok FFh) sığmaz → INT 0; bölen sıfır olmasa da hata oluşur. Kural: bayt bölmede AH ≥ bölen ise bölüm sığmaz (04h ≥ 2). Diğerleri: FFh, 0Eh kalan 2 ve 80h; hepsi AL'ye sığar.
Adım Adım Çalıştırma · Grup 2: Çarpma ve Bölme
Soru 15: CWD ve IDIV
−1000 ÷ 7 ve 1000 ÷ 7 sözcük bölmesiyle hesaplanıyor. Her bölmeden sonra AX ve DX nedir? CWD olmasaydı ne olurdu?
AX = −1000 = FC18h (65536 − 1000 = 64536).
CWD: AX'in işaret biti 1 → DX = FFFFh. DX:AX = FFFFFC18h, 32 bitte −1000.
BX = 7 (bölen).
IDIV BX: bölüm AX = FF72h (−142), kalan DX = FFFAh (−6). Kontrol: −142 × 7 − 6 = −1000. Kalan bölünenle aynı işaretlidir.
Bölüm CX'e saklandı.
İşaretsiz bölme için DX sıfırlanır: DX:AX = 0000 03E8h = 1000.
DIV BX: AX = 008Eh (142), DX = 0006h. CWD unutulsaydı ilk bölmede DX = 0 kalır, 0000FC18h = 64536 ÷ 7 = 9219 (2403h) gibi yanlış bir sonuç çıkardı.
ORG 100h MOV AX, -1000 CWD MOV BX, 7 IDIV BX MOV CX, AX MOV AX, 1000 XOR DX, DX DIV BX RET
Çoktan Seçmeli · Grup 3: Tek İşlenenli
Soru 16: CF'yi Korumak
AL = FFh ve CF = 0 iken aşağıdakilerden hangisi çalıştıktan sonra CF hâlâ 0 kalır?
A: INC ve DEC CF'ye dokunmaz: FFh + 1 = 00h (ZF = 1) olsa da CF = 0 kalır. ADD AL, 1 aynı sonucu verir ama elde çıktığı için CF = 1 yapar. NEG'de işlenen sıfır değilse CF = 1 olur; ADD AL, 80h'de 255 + 128 = 383 bayta sığmaz, CF = 1. INC ve DEC'in bu özelliği, ADC zincirinde sayaç artırırken CF'yi korumayı sağlar.
Çıktı Sorusu · Örnek: Dizi Toplama
Soru 17: Sözcük Dizisi Toplama
Program bittiğinde vec3 nedir? İşaretçiler neden 2'şer artar? Hangi toplamda CF = 1 olur ve o eleman neden yanlıştır?
org 100h jmp start vec1 dw 1000, 2000, 40000 vec2 dw 3000, 500, 30000 vec3 dw 3 dup(0) start: lea si, vec1 lea bx, vec2 lea di, vec3 mov cx, 3 sum: mov ax, [si] add ax, [bx] mov [di], ax add si, 2 add bx, 2 add di, 2 loop sum ret
Cevabı göster
vec3 = 4000, 2500, 4464 (0FA0h, 09C4h, 1170h).
Elemanlar DW, yani 2 bayt; bayt dizisinde INC yeterdi. Üçüncü turda 40000 + 30000 = 70000 > 65535: elde dışarı çıkar, CF = 1, AX'te 70000 − 65536 = 4464 kalır.
Doğru toplam 17 bit ister: eldeyi ayrı bir sözcüğe ADC ile eklemek gerekir.
Adım Adım Çalıştırma · BCD Aritmetiği
Soru 18: DAA ile Paketli BCD
Paketli BCD ile 38 + 45 ve ardından + 29 yapılıyor. Her DAA'dan sonra AL ve CF nedir?
AL = 38h: paketli BCD'de "38" (üst nibble 3, alt nibble 8).
38h + 45h = 7Dh (ikili toplama). Alt nibble D > 9: BCD değil.
DAA: alt nibble 9'dan büyük → AL + 06h = 83h, AF = 1. Sonuç "83" = 38 + 45 ✓
83h + 29h = ACh. Üst nibble A > 9, alt nibble C > 9.
DAA: AL + 66h = 112h → AL = 12h, CF = 1. 83 + 29 = 112: "12" ve yüzler basamağı CF'de.
ORG 100h MOV AL, 38h ADD AL, 45h DAA ADD AL, 29h DAA RET
Kod Yazma · BCD Aritmetiği
Soru 19: İki ASCII Rakamı Toplamak
AL ve BL'de birer ASCII rakam var (ör. '7' ve '8'). Toplamı iki ASCII basamak olarak AH (onlar) ve AL'ye (birler) koyan kodu AAA ile yazın. '7' + '8' için AX ne olur?
Cevabı göster
MOV AH, 0 ; onlar basamağı = 0 ADD AL, BL ; 37h + 38h = 6Fh AAA ; AH = 01h, AL = 05h OR AX, 3030h ; ASCII'ye çevir
'7' + '8' → AX = 3135h = '1', '5'. AAA yalnızca AL'nin alt nibble'ına bakar: 6Fh'nin alt nibble'ı F > 9 olduğu için 6 ekler, AH'yi 1 artırır, AL'nin üst nibble'ını siler. Bu yüzden 30h'leri önce çıkarmak gerekmez. '9' + '9' → 3138h ('18').
Çıktı Sorusu · Örnek: Sıcaklık Dönüşümü
Soru 20: Sıcaklık Dönüşümü Sınırı
Program f = c × 9 / 5 + 32 hesaplıyor. c = 40 ve c = 60 için AL ne olur? c = 60'ta OF kaçtır ve sonuç neden şüphelidir?
org 100h mov cl, 60 ; c mov al, 9 imul cl mov cl, 5 idiv cl add al, 32 ret
Cevabı göster
| c | IMUL | IDIV | AL | OF |
|---|---|---|---|---|
| 40 | AX = 0168h (360) | 48h (72) | 68h = 104 | 0 |
| 60 | AX = 021Ch (540) | 6Ch (108) | 8Ch | 1 |
108 + 32 = 140 işaretli bayta (en çok 127) sığmaz: ADD OF = 1 yapar. AL = 8Ch işaretsiz okunursa 140 °F doğrudur, ama program IMUL/IDIV ile işaretli çalıştığı için 8Ch = −116 anlamına gelir. Geçerli aralık c ∈ [−71, 53]; daha geniş aralık için sözcük işlemleri gerekir.