Bölüm 6: Aritmetik ve Mantıksal İşlemler

Bölüm 6: Aritmetik ve Mantıksal İşlemler · Çalışma Soruları
BayraklarADD · SUB · SBBAND · OR · XOR · TESTMUL · IMULDIV · IDIV · CWDINC · NEGDizi toplamaBCD: DAA · AAASıcaklık dönüşümü
Sercan KÜLCÜ

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

CFZFSFOFAFPF
101010

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?

AL6ChAL (ikili)0716150413120100CF0ZF0SF0OF0PF0

AL = 6Ch = 0110 1100b.

AL0ChAL (ikili)0706050413120100CF0ZF0SF0OF0PF1

AND 0Fh üst nibble'ı siler (maskeleme): AL = 0Ch. Mantık komutları CF = OF = 0 yapar.

AL3ChAL (ikili)0706151413120100CF0ZF0SF0OF0PF1

OR 30h bit 4 ve 5'i kurar: AL = 3Ch = 0011 1100b.

ALC3hAL (ikili)1716050403021110CF0ZF0SF1OF0PF1

XOR 0FFh bütün bitleri ters çevirir: AL = C3h = 1100 0011b. Bit 7 = 1 → SF = 1.

ALC3hAL (ikili)1716050403021110CF0ZF0SF1OF0PF0

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?

DX0000hAXFC18hBX0000hCX0000h

AX = −1000 = FC18h (65536 − 1000 = 64536).

DXFFFFhAXFC18hBX0000hCX0000h

CWD: AX'in işaret biti 1 → DX = FFFFh. DX:AX = FFFFFC18h, 32 bitte −1000.

DXFFFFhAXFC18hBX0007hCX0000h

BX = 7 (bölen).

DXFFFAhAXFF72hBX0007hCX0000h

IDIV BX: bölüm AX = FF72h (−142), kalan DX = FFFAh (−6). Kontrol: −142 × 7 − 6 = −1000. Kalan bölünenle aynı işaretlidir.

DXFFFAhAXFF72hBX0007hCXFF72h

Bölüm CX'e saklandı.

DX0000hAX03E8hBX0007hCXFF72h

İşaretsiz bölme için DX sıfırlanır: DX:AX = 0000 03E8h = 1000.

DX0006hAX008EhBX0007hCXFF72h

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?

AL38hAL: iki BCD basamağı (nibble)0706151413020100CF0AF0

AL = 38h: paketli BCD'de "38" (üst nibble 3, alt nibble 8).

AL7DhAL: iki BCD basamağı (nibble)0716151413120110CF0AF0

38h + 45h = 7Dh (ikili toplama). Alt nibble D > 9: BCD değil.

AL83hAL: iki BCD basamağı (nibble)1706050403021110CF0AF1

DAA: alt nibble 9'dan büyük → AL + 06h = 83h, AF = 1. Sonuç "83" = 38 + 45 ✓

ALAChAL: iki BCD basamağı (nibble)1706150413120100CF0AF0

83h + 29h = ACh. Üst nibble A > 9, alt nibble C > 9.

AL12hAL: iki BCD basamağı (nibble)0706051403021100CF1AF1

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
cIMULIDIVALOF
40AX = 0168h (360)48h (72)68h = 1040
60AX = 021Ch (540)6Ch (108)8Ch1

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.

Son

Bölüm 6: Aritmetik ve Mantıksal İşlemler: Çalışma Soruları
Konu anlatımı: aritmetik ve mantıksal işlemler sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.