Bölüm 2.2: 8086 Yazmaçları

Bölüm 2.2: 8086 Yazmaçları · Çalışma Soruları
Yazmaç kümesiAH ve ALCX ve LOOPMUL / DIVSPSI, DI ve DFDurum bayraklarıKontrol bayraklarıBayraklar ve IP
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Çoktan Seçmeli · Yazmaç Kümesi

Soru 1: Kesim Yazmaçlarının Görevi

8086'da CS, DS, SS ve ES kesim yazmaçları ne tutar?

A: Kesim yazmacı bir paragraf numarası tutar: kesim tabanı = yazmaç × 10h. DS = 2000h ise veri kesimi 20000h'de başlar ve 2FFFFh'ye kadar uzanır. Kesim içindeki bağıl konumları IP, SP, BP, SI, DI ve BX gibi yazmaçlar tutar; veri ve sonuçlar genel amaçlı yazmaçlardadır.

Çıktı Sorusu · Yazmaç Kümesi

Soru 2: AH ve AL

Her komuttan sonra AX ve CF kaçtır?

MOV AX, 12F0h
ADD AL, 20h
INC AH
ADD AX, 0F0h
Cevabı göster
KomutAXCF
MOV AX, 12F0h12F0h0
ADD AL, 20h1210h1
INC AH1310h1
ADD AX, 0F0h1400h0

F0h + 20h = 110h: 8 bitlik işlemde elde AH'ye geçmez, CF'ye gider; AL = 10h, AH değişmez. INC CF'ye dokunmaz. Son toplama 16 bitliktir: 1310h + 00F0h = 1400h, elde AH'ye geçer.

Adım Adım Çalıştırma · Yazmaç Kümesi

Soru 3: 8 Bitlik Yazmaç Parçaları

Başlangıçta yazmaçlar 0. Kod çalışınca AX, BX ve CX ne olur? (b) İlk satır MOV AX, 0x4231, son satır MOV CH, AH olsaydı?

AX4321AHALBX0000BHBLCX0000CHCL

AX ← 4321h: AH = 43h, AL = 21h. 0x öneki onaltılık demektir.

AX4321AHALBX0021BHBLCX0000CHCL

BL ← AL = 21h. Yalnız BX'in düşük baytı yazılır; BH = 00h kalır → BX = 0021h.

AX4321AHALBX0021BHBLCX0043CHCL

CL ← AH = 43h → CX = 0043h. MOV hiçbir bayrağı etkilemez. (b) MOV AX, 0x4231 · MOV BL, AL · MOV CH, AH ile: AX = 4231h, BX = 0031h, CX = 4200h.

MOV AX, 0x4321
MOV BL, AL
MOV CL, AH

Çoktan Seçmeli · Genel Amaçlı Yazmaçlar

Soru 4: CX Yazmacı

CX yazmacının örtük (komutta yazılmadan) kullanıldığı görev hangisidir?

B: CX (count): LOOP önce CX'i azaltır, sıfır değilse atlar; REP dizgi komutunu CX kez tekrarlar; SHL AX, CL gibi çok bitlik kaydırmada sayı CL'dedir. Yüksek yarı ve port numarası DX'in, dizgi hedefi DI'nin, yığın çerçevesi tabanı BP'nin görevidir.

Çoktan Seçmeli · Genel Amaçlı Yazmaçlar

Soru 5: Adres Tutabilen Yazmaç

Aşağıdaki komutlardan hangisi 8086'da derlenmez?

C: Köşeli parantez içinde yalnızca BX, BP, SI ve DI (ve bir yer değiştirme) kullanılabilir. AX, CX ve DX adresleme yazmacı değildir; veri yazmaçlarından adres tutabilen tek yazmaç BX'tir. Doğrusu: MOV BX, CX + MOV AX, [BX].

Adım Adım Çalıştırma · Genel Amaçlı Yazmaçlar

Soru 6: MUL ve DIV ile DX:AX

Her komuttan sonra DX, AX, BX, CX kaçtır? MUL sonrasında CF ve OF neden 1 olur? DIV'in bölümü ve kalanı nereye yazılır?

DX0000hAX0300hBX0000hCX0000hCF0OF0DX:AX = 00000300h

AX = 0300h (768).

DX0000hAX0300hBX0200hCX0000hCF0OF0DX:AX = 00000300h

BX = 0200h (512).

DX0006hAX0000hBX0200hCX0000hCF1OF1DX:AX = 00060000h

16 bitlik MUL: DX:AX = AX × BX = 768 × 512 = 393 216 = 0006 0000h → DX = 0006h, AX = 0000h. Yüksek yarı sıfır değil → CF = OF = 1; SF, ZF, AF, PF tanımsız.

DX0006hAX0000hBX0200hCX0007hCF1OF1DX:AX = 00060000h

CX = 7. Bölünen olarak DX:AX'teki 32 bitlik değer kalır.

DX0005hAXDB6DhBX0200hCX0007hCF?OF?DX:AX = 0005DB6Dh

DIV CX: 393 216 / 7 = 56 173 kalan 5 → bölüm AX = DB6Dh, kalan DX = 0005h. Bölüm 16 bite sığdığı için bölme hatası yok; altı bayrak tanımsız (?).

mov ax, 0300h
mov bx, 0200h
mul bx
mov cx, 0007h
div cx

Çıktı Sorusu · Genel Amaçlı Yazmaçlar

Soru 7: LOOP Kaç Kez Döner?

Program bittiğinde AX kaçtır? Birinci satır MOV CX, 0 olsaydı döngü kaç kez döner, AX kaç olurdu?

MOV CX, 4
MOV AX, 1
D: ADD AX, AX
LOOP D
Cevabı göster

Gövde CX = 4, 3, 2, 1 için çalışır; her turda AX ikiye katlanır: 1 → 2 → 4 → 8 → 16. AX = 0010h, CX = 0.

LOOP önce CX'i azaltır, sonra sınar. CX = 0 ile girilirse ilk LOOP CX'i FFFFh yapar; döngü 65 536 kez döner. 265536 16 bite sığmaz: 16. turdan sonra AX = 0 olur ve öyle kalır → AX = 0000h.

Bu tuzaktan korunmak için döngüden önce JCXZ ile CX = 0 durumu atlanır.

Çoktan Seçmeli · İşaretçi ve İndis Yazmaçları

Soru 8: Yığın İşaretçisi

Yığın işaretçisi (SP) için hangisi doğrudur?

D: SP 16 bittir ve SS kesimi içinde yığının tepesinin bağıl konumunu tutar. Yığın düşük adreslere doğru büyür: PUSH SP ← SP − 2, sonra yazma; POP önce okuma, sonra SP ← SP + 2. Yığındaki öğeler hep 16 bittir; POP eski hücreyi silmez, yalnızca geçersiz sayar.

Çıktı Sorusu · İşaretçi ve İndis Yazmaçları

Soru 9: Geriye Doğru Kopyalama

DS = ES ve DS:0200h–0204h'de "ABCDE" dizgisi var. Program bittiğinde SI, DI ve CX kaçtır? Hangi baytlar hangi sırayla kopyalanır? DS:0300h–0304h'de ne olur?

STD
MOV SI, 0204h
MOV DI, 0304h
MOV CX, 5
REP MOVSB
Cevabı göster

STD → DF = 1: her adımda SI ve DI 1 azalır. Kopyalama sondan başa yapılır: 0204h → 0304h ('E'), 0203h → 0303h ('D'), …, 0200h → 0300h ('A').

Sonuç: SI = 01FFh, DI = 02FFh, CX = 0; DS:0300h–0304h = "ABCDE", sıra korunur.

Geriye doğru kopyalama, hedef kaynağın biraz ilerisinde olan çakışan alanlarda gerekir; ileri yönde (CLD) kopyalasaydık kaynağın henüz okunmamış baytlarının üzerine yazardık.

Çoktan Seçmeli · İşaretçi ve İndis Yazmaçları

Soru 10: Dizgi Komutunun İşlenenleri

MOVSB komutunun kaynağı ve hedefi nedir?

A: Dizgi komutlarında kaynak hep DS:SI, hedef hep ES:DI'dir; işlenenler komutta yazılmaz (örtük). Her adımdan sonra SI ve DI, DF'ye göre 1 (bayt) ya da 2 (sözcük) artar ya da azalır. Dizgi komutu dışında [DI] sıradan bir adrestir ve DS kesimini kullanır.

Çoktan Seçmeli · Bayrak Yazmacı

Soru 11: Durum mu, Kontrol mü?

Aşağıdaki bayraklardan hangisi bir durum bayrağı değil, kontrol bayrağıdır?

B: Durum bayraklarını (CF, PF, AF, ZF, SF, OF) işlemci her aritmetik/mantık işleminden sonra sonuca göre kendisi kurar. Kontrol bayraklarını (TF, IF, DF) programcı ayarlar: TF = 1 iken her komuttan sonra INT 1 oluşur ve program tek adımda çalıştırılabilir.

Çoktan Seçmeli · Bayrak Yazmacı

Soru 12: Bayrak Yazmacı

16 bitlik bayrak yazmacı (FLAGS) için hangisi doğrudur?

D: Durum bayrakları CF, PF, AF, ZF, SF, OF son aritmetik/mantık işleminin sonucunu anlatır ve donanımca kurulur. Kontrol bayrakları TF, IF, DF ise işlemcinin davranışını yönetir; programcı STD/CLD, STI/CLI ya da PUSHF/POPF ile ayarlar. Kalan 7 bit kullanılmaz.

Adım Adım Çalıştırma · Bayrak Yazmacı

Soru 13: Bayrak İzleme

Her komuttan sonra AL ve CF, ZF, SF, OF, PF, AF kaçtır? (Başlangıçta bayraklar 0.)

AL64h= 0110 0100bişaretli: 100CF0ZF0SF0OF0PF0AF0

AL = 64h (+100). MOV bayrakları değiştirmez.

AL96h= 1001 0110bişaretli: −106CF0ZF0SF1OF1PF1AF0

64h + 32h = 96h: +100 + 50 = 150 > 127 → OF = 1, SF = 1. İşaretsiz 150 doğru → CF = 0. 4 + 2 nibble eldesi yok → AF = 0; 1001 0110'da dört 1 → PF = 1.

ALFFh= 1111 1111bişaretli: −1CF1ZF0SF1OF0PF1AF1

96h − 97h = FFh: küçükten büyük çıkarıldı → CF = 1; AF = 1. İşaretli −106 − (−105) = −1 doğru → OF = 0.

AL00h= 0000 0000bişaretli: 0CF1ZF1SF0OF0PF1AF1

FFh + 1 = 00h → ZF = 1. INC CF'yi değiştirmez: CF = 1 kaldı.

AL00h= 0000 0000bişaretli: 0CF1ZF0SF1OF0PF1AF1

CMP AL, 1: 00h − 01h hesaplanır ama AL'ye yazılmaz. Ödünç → CF = 1, sonuç FFh → SF = 1, ZF = 0. AL hâlâ 00h.

mov al, 64h
add al, 32h
sub al, 97h
inc al
cmp al, 1

Çoktan Seçmeli · Bayrak Yazmacı

Soru 14: Bayrakları Okuma

AL = 80h iken ADD AL, 80h çalışıyor. Sonra bayraklar ne olur?

C: 80h + 80h = 100h → AL = 00h, dışarı taşan 1 → CF = 1; sonuç sıfır → ZF = 1; MSB 0 → SF = 0. İşaretli yorumda −128 + (−128) = −256 sığmaz ve iki negatifin toplamı pozitif (0) çıktı → OF = 1.

Hesap Sorusu · Bayrak Yazmacı

Soru 15: Bayrakları Elle Hesaplamak

Her işlemden sonra sonucu ve CF, ZF, SF, OF, PF, AF bayraklarını bulun.

  1. MOV AX, 7FF8h / ADD AX, 0009h
  2. MOV BX, 0005h / SUB BX, 0007h
Cevabı göster
SonuçCFZFSFOFPFAF
18001h001101
2FFFEh101001
  1. +32760 + 9 = 32769 > 32767 → OF = 1, MSB = 1 → SF = 1; işaretsiz toplam sığdı → CF = 0. 8h + 9h nibble eldesi → AF = 1. PF yalnız düşük bayta bakar: 01h'de bir tane 1 → PF = 0.
  2. 5 − 7: ödünç → CF = 1; işaretli 5 − 7 = −2 doğru → OF = 0. 5h − 7h nibble ödüncü → AF = 1. Düşük bayt FEh'de yedi tane 1 → PF = 0.

Adım Adım Çalıştırma · Bayrak Yazmacı

Soru 16: Bayraklar ve IP

.COM programı 0100h'den başlıyor; yazmaçlar ve bayraklar 0. Her komuttan sonra IP, AX, BL ve CF, ZF, SF, OF, PF, AF ne olur?

IP0103hAX7FF0hBL00hCF0ZF0SF0OF0PF0AF0

AX = 7FF0h. Komut 3 bayt → IP = 0103h. MOV bayrakları değiştirmez.

IP0106hAX8000hBL00hCF0ZF0SF1OF1PF1AF0

7FF0h + 0010h = 8000h. İşaretli +32752 + 16 = +32768 16 bite sığmaz → OF = 1, SF = 1. Elde yok: CF = 0. Düşük bayt 00h (sıfır tane 1) → PF = 1.

IP0108hAX8000hBLF0hCF0ZF0SF1OF1PF1AF0

BL = F0h. 8 bitlik MOV, 2 bayt → IP = 0108h.

IP010BhAX8000hBL10hCF1ZF0SF0OF0PF0AF0

F0h + 20h = 110h → BL = 10h, CF = 1. İşaretli −16 + 32 = 16 doğru → OF = 0. 10h'de tek bir 1 → PF = 0.

IP010DhAX8000hBL0FhCF1ZF0SF0OF0PF1AF1

10h − 1 = 0Fh: bit 4'ten ödünç → AF = 1. DEC, CF'yi değiştirmez: CF = 1 kaldı.

IP0110hAX7FFFhBL0FhCF0ZF0SF0OF1PF1AF1

8000h − 1 = 7FFFh: −32768 − 1 sığmaz → OF = 1. İşaretsiz 32768 − 1 doğru → CF = 0.

IP0000hAX7FFFhBL0FhCF0ZF0SF0OF1PF1AF1

RET: .COM programı DOS'a döner. IP 0100h'den komut uzunluklarına göre 0110h'ye ilerlemişti; RET, yığındaki 0000h'yi IP'ye alır.

org 100h
mov ax, 7FF0h
add ax, 0010h
mov bl, 0F0h
add bl, 20h
dec bl
sub ax, 1
ret

Kod Yazma · Bayrak Yazmacı

Soru 17: Tuzak Bayrağını Kurmak

TF'yi (bit 8) doğrudan kuran bir komut yoktur. Diğer bayrakları değiştirmeden TF'yi 1 yapan kısa bir kod yazın. TF = 1 olduktan sonra her komutun ardından ne olur? IF ve DF için neden böyle bir koda gerek yoktur?

Cevabı göster
PUSHF            ; FLAGS yığına
POP AX           ; AX = FLAGS
OR AX, 0100h     ; bit 8 = TF ← 1
PUSH AX
POPF             ; FLAGS = AX

OR yalnızca bit 8'i 1 yapar, diğer bitler korunur. Silmek için AND AX, 0FEFFh kullanılır.

TF = 1 iken her komuttan sonra tip 1 kesme (INT 1) oluşur; hata ayıklayıcı programı komut komut yürütür. IF ve DF'nin kendi komutları vardır: STI/CLI ve STD/CLD.

Son

Bölüm 2.2: 8086 Yazmaçları: Çalışma Soruları
Konu anlatımı: 8086 yazmaçlar sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.