Bölüm 3.2: Assembly

Mikroişlemciler
Assembly diliKomut satırının yapısıKomut ve direktifİşlenen türleriÖrtük işlenenlerKomut süreleriIP ve bayraklarİlk program
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Assembly'nin yeri

Assembly dilinin makine dili ve yüksek düzeyli dillerle ilişkisini açıklamak.

Satır yapısı

Etiket, komut, işlenen ve açıklamadan oluşan satırları okumak; komutu direktiften ayırmak.

İşlenenler

Yazmaç, anlık değer ve bellek işlenenlerini ve komutların örtük işlenenlerini tanımak.

Komut süresi

Yazmaç ve bellek işlenenli komutların süre farkını saat turuyla hesaplamak.

IP ve bayraklar

IP'nin nasıl ilerlediğini ve hangi komutların bayrakları değiştirdiğini izlemek.

İlk program

emu8086 ile basit bir .COM programını yazıp adım adım çalıştırmak.

Assembly Dili

Assembly Dili

  • Düşük düzeyli bir programlama dilidir: her komut, işlemcinin tek bir makine komutuna karşılık gelir.
  • Makine kodundaki sayılar yerine akılda kalıcı komut kısaltmaları (mnemonic) kullanılır: MOV, ADD, JMP…
  • Bilgisayarın yapısını (yazmaçlar, bellek, sistem yolu) bilmeyi gerektirir.
  • Bilgisayarın temel yapısını ve bir programın gerçekte nasıl çalıştığını anlamak açısından önemlidir.
  • Her işlemci ailesinin kendi assembly dili vardır; bu derste Intel 8086 ve emu8086 kullanılır.
Tek satır, üç görünüm

Assembly: MOV AX, 5

Onaltılık makine kodu: B8 05 00

CPU'nun gördüğü:
10111000 00000101 00000000

16 bitlik 0005h, bellekte düşük bayt önce (05 00) saklanır.

Assembly Dili

Assembler ve emu8086

kaynak.asmmetinAssemblerbirebir çevirirnesne / .COMmakine koduYükleyiciRAM'e yüklerEXE için araya bağlayıcı (linker) girer: .obj → .exe
AssemblerKomut kısaltmalarını ve etiketleri makine koduna, değişken adlarını adreslere çevirir. Örnek: MASM, TASM, NASM.
emu8086Editör + assembler + 8086 öykünücüsü (emulator). Yazmaçları, belleği ve bayrakları adım adım gösterir.
.COM / .EXE.COM tek kesimli, en fazla 64 KB'lık basit biçimdir (ORG 100h). .EXE çok kesimli olabilir.

Bu derste örnekler emu8086 söz dizimiyle yazılır; çoğu MASM/TASM ile de uyumludur.

Assembly Dili

Neden Assembly?

Assembly dili ile oluşturulmuş bir program:

Artıları

  • Daha az yer kaplar (gereksiz kod yok).
  • Yalnızca yapması gereken işlemleri yaptığından daha hızlıdır.
  • Yüksek düzeyli dillerin yapamadığı işlemleri yapabilir: port G/Ç, kesme işleme, bayraklara doğrudan erişim.
  • Önyükleyici, aygıt sürücüsü, gömülü sistem gibi alanlarda vazgeçilmezdir.

Eksileri

  • Taşınabilir değildir: 8086 kodu ARM'da çalışmaz.
  • Yazması, okuması ve hata ayıklaması zahmetlidir.
  • Büyük projelerde verim düşüktür; modern derleyiciler çoğu zaman yeterince hızlı kod üretir.
Uygulamada genellikle karma yaklaşım kullanılır: program yüksek düzeyli dilde, zamanlaması kritik küçük parçalar assembly ile yazılır.

Assembly Dili

Komut Satırının Yapısı

[etiket:]  komut  [hedef], [kaynak]  [; açıklama]
basla:etiketMOVkomutAXhedef,5kaynak; AX ← 5açıklama→ AX ← 5
SatırEtiketKomutİşlenenlerAçıklama
basla: MOV AX, 5 ; AX ← 5baslaMOVAX, 5; AX ← 5
INC AX—INCAX—
RET—RETyok—
  • İki işlenenli komutlarda sıra hedef, kaynaktır: MOV AX, BX → AX ← BX.
  • Assembler büyük-küçük harfe duyarsızdır: mov ax, bx ile MOV AX, BX aynıdır.
  • ; işaretinden satır sonuna kadar her şey açıklamadır ve makine koduna çevrilmez.

Assembly Dili

Komut mu, Direktif mi?

SatırTürüBellekte ne üretir?
MOV AX, 5komutmakine kodu: B8 05 00
ORG 100hdirektifhiçbir şey; konum sayacını 0100h yapar
sayi DB 0direktif (veri tanımı)1 bayt veri: 00
k EQU 5direktifhiçbir şey; k adı 5 değerini alır
ENDdirektifhiçbir şey; kaynak burada biter
PUTC 'A'makro çağrısımakro gövdesindeki komutların kodu
Komutİşlemcinin çalışma anında yürüttüğü işlem. Her biri bir makine komutuna çevrilir.
DirektifAssembler'a verilen bilgi: nereye yerleşecek, ne kadar yer ayrılacak, adlar neyi gösterecek.
MakroDerleme anında yerine birkaç satır yazılan, adı olan metin kalıbı.

Assembly Dili

Etiketler ve Adlar

basla:  MOV CX, 3   ; kod etiketi
don:    INC AX
        LOOP don    ; don = adres
        RET
sayi    DB 7        ; veri adı
  • Kod etiketi iki nokta üst üste ile biter ve bir komutun adresini (CS içindeki bağıl konumunu) temsil eder; kendisi makine kodu üretmez.
  • Değişken adı iki noktasız yazılır; adı, türü (DB, DW…) ve adresi birlikte saklanır.
  • Ad harfle ya da alt çizgiyle başlar, rakamla başlayamaz; devamında harf, rakam ve alt çizgi olabilir.
  • Komut, yazmaç ve direktif adları (MOV, AX, DB, END…) ad olarak kullanılamaz.
  • Büyük-küçük harf ayrılmaz: don ile DON aynı etikettir; ikisini birden tanımlamak “iki kez tanımlı” hatası verir.
Ad_sayactoplam22toplamcxson-deger
Geçerli mi?evetevetrakamla başlıyoryazmaç adı− bir işleçtir

Yazmaçlarla Çalışma

İşlenen Türleri ve Örtük İşlenenler

YazmaçMOV AX, BX: değer işlemcinin içinden gelir; en hızlı tür.
Anlık değerMOV AX, 5: değer komutun baytlarının içindedir; yalnızca kaynak olabilir.
BellekMOV AX, [BX]: değer bellekten bir yol döngüsüyle okunur.
KomutYazılan işlenenÖrtük işlenen(ler)
MUL BLBLAL (çarpılan), AX (sonuç)
DIV BLBLAX (bölünen), AL (bölüm), AH (kalan)
LOOP dondonCX (sayaç)
CBW—AL → AX
PUSH AXAXSS:SP (yığın tepesi)
XLAT—AL (indis ve sonuç), BX (tablo adresi)

Örtük işlenen komutta yazılmaz ama değişir: MUL BL AH'yi de siler. Bir yazmacın değerini korumak isteyen program, kullandığı komutların örtük işlenenlerini bilmelidir.

Yazmaçlarla Çalışma · Kodu adım adım çalıştır

Kod İzleme: MUL, SHR ve LOOP'un Örtük İşlenenleri

ORG 100h
MOV AL, 12
MOV BL, 10
MUL BL         ; AX = AL × BL
MOV CL, 2
SHR AX, CL     ; sayı CL'de
MOV CX, 3      ; LOOP sayacı
don:
ADD AX, 1
LOOP don       ; CX azalır
RET
AX000ChBX000AhCX0000hCF0ZF0AX = 12 (onluk)

AL = 12, BL = 10. AH başlangıçta 0.

AX0078hBX000AhCX0000hCF0ZF?AX = 120 (onluk)örtük: AL, AX

MUL BL yalnız BL'yi yazar; çarpılan örtük olarak AL, sonuç örtük olarak AX'tir: AX = 120 = 0078h. Sonuç 8 bite sığdığı için CF = 0.

AX001EhBX000AhCX0002hCF0ZF0AX = 30 (onluk)sayı CL'de

SHR AX, CL: 1'den büyük kaydırma sayısı yalnızca CL'de verilebilir. 120 ÷ 4 = 30 → AX = 001Eh.

AX001EhBX000AhCX0003hCF0ZF0AX = 30 (onluk)

CX = 3: LOOP'un örtük sayacı. CL de CX'in parçası olduğundan önceki 2 değeri silindi.

AX001FhBX000AhCX0002hCF0ZF0AX = 31 (onluk)

1. tur: AX + 1 = 31; LOOP CX'i 1 azaltır: CX = 2, sıfır değil → don.

AX0020hBX000AhCX0001hCF0ZF0AX = 32 (onluk)

2. tur: AX + 1 = 32; LOOP CX'i 1 azaltır: CX = 1, sıfır değil → don.

AX0021hBX000AhCX0000hCF0ZF0AX = 33 (onluk)

3. tur: AX + 1 = 33; LOOP CX'i 1 azaltır: CX = 0, döngü biter.

AX0021hBX000AhCX0000hCF0ZF0AX = 33 (onluk)

RET. Programda CX hiç azaltılmadı gibi görünse de LOOP onu üç kez değiştirdi: AX = 0021h = 33.

AX, CL ve CX bu programda komutların “gizli” işlenenleriydi; yazmaçların özel görevleri bu örtük kullanımlardan gelir.

Yazmaçlarla Çalışma

Yazmaç mı, Bellek mi?

Yazmaç
  • CPU'nun içindedir; erişim için yol döngüsü gerekmez.
  • Sayısı çok azdır (8086'da 14 adet 16 bitlik yazmaç).
  • Ara sonuçlar ve sayaçlar için idealdir.
Bellek
  • CPU'nun dışındadır; her erişim en az bir yol döngüsü (8086'da 4 saat periyodu) sürer.
  • 1 MB'a kadar büyüktür.
  • Program kodu, değişkenler, diziler ve yığın buradadır.
CPUAXBXCXDX0 yol döngüsüsistem yoluher erişim ≥ 4 saat periyoduBellek (1 MB)kod · değişkenlerdiziler · yığın
İyi assembly kodu sık kullanılan değerleri yazmaçlarda tutar, belleğe yalnızca gerektiğinde gider. Örneğin bir döngü sayacını bellekte değil CX'te saklamak döngüyü hızlandırır.

14 yazmaç: 8 genel amaçlı + 4 kesim + IP + FLAGS.

Yazmaçlarla Çalışma

Komut Süreleri: Yazmaç ve Bellek

Komut (8086)Saat turu
MOV AX, BX2
MOV AX, 54
MOV AX, sayi10
MOV CX, [BX]8 + 5 = 13
ADD AX, BX3
ADD AX, sayi9 + 6 = 15
INC CX2
INC sayac (sözcük)15 + 6 = 21
  • Bellek işlenenli komutlarda süreye etkin adres hesabı (EA) eklenir: doğrudan adres 6, [BX] 5, [BX+SI] 7 tur.
  • Belleğe yazan komutlar daha uzundur: INC sayac önce okur, sonra yazar (iki yol döngüsü).
  • AX'e doğrudan adresten yükleme kısa akümülatör biçimini kullanır: 10 tur.
  • 1000 kez dönen döngüde sayaç CX'teyse artırma 1000 × 2 = 2000 saat turu, bellekteyse 1000 × 21 = 21 000 tur sürer; 5 MHz'de 0,4 ms yerine 4,2 ms.
Değerler Intel 8086 veri sayfasındaki en iyi durum süreleridir; tek adresteki sözcük erişimi ve önden getirme kuyruğunun boşalması süreyi uzatır. Oran değişmez: bellek işlenenli bir komut yazmaç işlenenli eşinden birkaç kat yavaştır.

IP ve Bayraklar · Kodu adım adım çalıştır

Kod İzleme: IP Nasıl İlerler?

B8 05 000100MOVIP = 0100hBB 02 000103MOV400106INC03 C30107ADDC30109RET

Program CS:0100h'ye yüklenir; IP = 0100h ilk komutu gösterir.

B8 05 000100MOVBB 02 000103MOVIP = 0103h400106INC03 C30107ADDC30109RET

MOV AX, 5 (B8 05 00) getirilir: IP = 0103h, yürütülünce AX = 0005h.

B8 05 000100MOVBB 02 000103MOV400106INCIP = 0106h03 C30107ADDC30109RET

3 bayt daha: IP = 0106h, BX = 0002h.

B8 05 000100MOVBB 02 000103MOV400106INC03 C30107ADDIP = 0107hC30109RET

INC AX tek bayttır (40h): IP = 0107h, AX = 0006h.

B8 05 000100MOVBB 02 000103MOV400106INC03 C30107ADDC30109RETIP = 0109h

ADD AX, BX 2 bayt: IP = 0109h, AX = 0008h.

B8 05 000100MOVBB 02 000103MOV400106INC03 C30107ADDC30109RETIP = 0000h (PSP'ye dönüş)

RET yığından 0000h'yi çeker: IP = 0000h, SP = 0000h. PSP:0000'daki INT 20h programı bitirir.

ORG 100h
MOV AX, 5     ; 3 bayt
MOV BX, 2     ; 3 bayt
INC AX        ; 1 bayt
ADD AX, BX    ; 2 bayt
RET           ; 1 bayt

IP ve Bayraklar · Kodu adım adım çalıştır

Kod İzleme: Hangi Komut Bayrağa Dokunur?

ORG 100h
STC              ; CF = 1
MOV AL, 0FFh     ; bayraklar aynı
INC AL           ; CF'ye dokunmaz
MOV CX, 0        ; ZF aynı kalır
DEC AL
ADD AL, 1        ; CF yeni
CLC
NOT AL           ; bayraklar aynı
RET
AL00hCF1ZF0SF0AF0PF0yalnız CF

STC: CF = 1. Bayrağı doğrudan değiştiren komutlardan biri.

ALFFhCF1ZF0SF0AF0PF0bayrak yok

MOV AL, 0FFh: AL değişti, bayrakların hiçbiri değişmedi. MOV bayrak etkilemez.

AL00hCF1ZF1SF0AF1PF1CF korunur

INC AL: FFh + 1 = 00h → ZF = 1, AF = 1, PF = 1. CF hâlâ 1: INC ve DEC elde bayrağına dokunmaz.

AL00hCF1ZF1SF0AF1PF1bayrak yok

MOV CX, 0: sonuç sıfır olsa da ZF yeniden hesaplanmaz; önceki komutun ZF'si kalır.

ALFFhCF1ZF0SF1AF1PF1CF korunur

DEC AL: 00h − 1 = FFh → SF = 1, ZF = 0. CF yine 1: DEC ödünç almayı CF'ye yazmaz.

AL00hCF1ZF1SF0AF1PF1hepsi yeni

ADD AL, 1: FFh + 1 = 100h → AL = 00h. ADD bütün durum bayraklarını yeniden yazar: CF = 1 bu kez ADD'in eldesi.

AL00hCF0ZF1SF0AF1PF1yalnız CF

CLC: CF = 0.

ALFFhCF0ZF1SF0AF1PF1bayrak yok

NOT AL: AL = FFh, ama ZF hâlâ 1. NOT hiçbir bayrağı değiştirmez; sonucu sınamak için ardından TEST AL, AL ya da CMP gerekir.

MOV, NOT, XCHG, LEA, PUSH ve POP bayrakları değiştirmez; INC ve DEC CF dışındakileri değiştirir. Koşullu atlamadan hemen önce bayrağı hangi komutun ayarladığına bakılır.

İlk Program

.COM Program Şablonu

ORG 100h          ; .COM: kod 0100h'den başlar

MOV AX, 5         ; AX = 5
MOV BX, 3         ; BX = 3
ADD AX, BX        ; AX = AX + BX = 8
MOV CL, AL        ; CL = 08h

RET               ; DOS'a dön

sayi DB 0         ; değişkenler RET'ten sonra
  • ORG 100h: .COM programı kesimin 0100h adresine yüklenir; ilk 256 bayt (PSP) DOS'a aittir.
  • Komutlar yukarıdan aşağı, sırayla yürütülür.
  • RET: işletim sistemine geri döner.
  • Değişkenler kodun sonuna (RET'ten sonra) konur ki CPU onları komut sanıp yürütmesin.
  • .COM'da başlangıçta CS = DS = ES = SS, IP = 0100h, SP = FFFEh.
emu8086'da new → COM template şablonu açar; emulate programı öykünücüye yükler, single step her komuttan sonra yazmaçların nasıl değiştiğini gösterir.

İlk Program · Kodu adım adım çalıştır

Kod İzleme: .COM Programı Bellekte

ORG 100h       ; kod 0100h'den
MOV AX, 5
MOV BX, 3
ADD AX, BX     ; AX = 8
MOV CL, AL     ; CL = 08h
RET            ; DOS'a dön
sayi DB 0      ; veri
kesim 0700h0000hPSP (256 bayt)0100hMOV AX, 50103hMOV BX, 30106hADD AX, BX0108hMOV CL, AL010AhRET010Bhsayi = 00⋮FFFEhyığın: 0000hIP = 0100hSP = FFFEhCS:IPSS:SPAX0000hBX0000hCL00h

Program 0700:0100'e yüklendi. CS = DS = ES = SS = 0700h, IP = 0100h, SP = FFFEh; yığın tepesinde 0000h var.

kesim 0700h0000hPSP (256 bayt)0100hMOV AX, 50103hMOV BX, 30106hADD AX, BX0108hMOV CL, AL010AhRET010Bhsayi = 00⋮FFFEhyığın: 0000hIP = 0103hSP = FFFEhCS:IPSS:SPAX0005hBX0000hCL00h

MOV AX, 5 (3 bayt): AX = 0005h, IP = 0103h.

kesim 0700h0000hPSP (256 bayt)0100hMOV AX, 50103hMOV BX, 30106hADD AX, BX0108hMOV CL, AL010AhRET010Bhsayi = 00⋮FFFEhyığın: 0000hIP = 0106hSP = FFFEhCS:IPSS:SPAX0005hBX0003hCL00h

MOV BX, 3 (3 bayt): BX = 0003h, IP = 0106h.

kesim 0700h0000hPSP (256 bayt)0100hMOV AX, 50103hMOV BX, 30106hADD AX, BX0108hMOV CL, AL010AhRET010Bhsayi = 00⋮FFFEhyığın: 0000hIP = 0108hSP = FFFEhCS:IPSS:SPAX0008hBX0003hCL00h

ADD AX, BX (2 bayt): AX = 0008h, IP = 0108h.

kesim 0700h0000hPSP (256 bayt)0100hMOV AX, 50103hMOV BX, 30106hADD AX, BX0108hMOV CL, AL010AhRET010Bhsayi = 00⋮FFFEhyığın: 0000hIP = 010AhSP = FFFEhCS:IPSS:SPAX0008hBX0003hCL08h

MOV CL, AL (2 bayt): CL = 08h, IP = 010Ah.

kesim 0700h0000hPSP (256 bayt)0100hMOV AX, 50103hMOV BX, 30106hADD AX, BX0108hMOV CL, AL010AhRET010Bhsayi = 00⋮FFFEhyığın: 0000hIP = 0000hSP = 0000hCS:IPAX0008hBX0003hCL08h

RET yığından 0000h'yi alır: IP = 0000h, SP = 0000h. PSP:0000'daki INT 20h programı bitirir; 010Bh'deki sayi hiç yürütülmedi.

Komutlar 3, 3, 2, 2 ve 1 bayttır; IP her komutta uzunluğu kadar ilerler. Veriler RET'ten sonra durduğu için komut olarak yürütülmez.

İlk Program

Program Bellekte: Bayt Bayt

Bağıl konumBaytlarKaynak satırıNot
0100hB8 05 00MOV AX, 5B8 + yazmaç no (AX = 0); sabit little-endian
0103hBB 03 00MOV BX, 3B8 + 3 (BX)
0106h03 C3ADD AX, BXC3 = 11 000 011: yazmaç–yazmaç, AX, BX
0108h8A C8MOV CL, ALC8 = 11 001 000: CL, AL
010AhC3RETtek baytlık komut
010Bh00sayi DB 0veri; komut değil
  • .COM dosyası tam olarak bu 12 bayttır: başlık yoktur, DOS baytları 0100h'den itibaren belleğe kopyalar.
  • ORG 100h satırının karşılığında bayt yoktur; yalnızca ilk baytın konumunu belirler.
  • Aynı komutun birden çok kodlaması olabilir: ADD AX, BX için 01 D8 de geçerlidir. MASM 03 C3'ü seçer; ikisi de aynı işi yapar.
  • Bellekte komut ile veri arasında hiçbir işaret yoktur: 010Bh'deki 00, IP oraya gelseydi komut olarak çözülürdü.

İlk Program

emu8086 Öykünücü Penceresi

Loadreloadstep backsingle steprunyazmaçlar (H / L)AX00 05BX00 00CX00 00IP0103SPFFFEbellek07100B80710105071020007103BB0710403komut listesiMOV AX, 00005hMOV BX, 00003hADD AX, BXMOV CL, ALRETscreenvarsstackflags
  • single step bir komut yürütür; değişen yazmaçlar ve bellek hemen görünür.
  • step back son adımı geri alır; bir hatanın nedenine geri dönmeyi kolaylaştırır.
  • Komut listesindeki vurgulu satır sıradaki komuttur (CS:IP), az önce yürütülen değil.
  • Komut listesi sabitleri onaltılık ve 5 basamakla gösterir (00005h).
  • Ek pencereler: ekran çıktısı, değişkenler, yığın ve bayraklar.

Bellek sütunu fiziksel adresleri gösterir: 0700:0100 = 07100h. Çizim pencerenin yalnızca ana bölümlerini gösterir.

İlk Program

Yazım Kuralları

Sayı tabanları 25 veya 25d onluk · 19h onaltılık · 00011001b ikili · 31o sekizli. Hepsi aynı değer: 25.
Harfle başlayan onaltılık Başına 0 konur: 0FFh, 0B800h. FFh yazılırsa assembler onu bir ad (etiket/değişken) sanır.
Karakterler 'A' → ASCII kodu 41h. MOV CL, 'A' ile MOV CL, 41h aynı makine kodunu üretir.
İşaretli sayılar -1 8 bitte FFh, 16 bitte FFFFh olarak saklanır (ikiye tümleyen).
Büyük-küçük harf Assembler duyarsızdır: mov, MOV, Mov aynıdır; var1 ile VAR1 aynı addır.
Açıklamalar ; sonrası açıklamadır. Her satıra “ne” değil “neden” yazmak iyi alışkanlıktır.

İlk Program

Sık Yapılan Hatalar

HatalıNeden?Doğrusu
MOV AL, BXBoyutlar farklı (8 ↔ 16 bit)MOV AL, BL veya MOV AX, BX
MOV DS, 1234hKesim yazmacına sabit atanamazMOV AX, 1234h · MOV DS, AX
MOV AL, [AX]Adreslemede yalnız BX, SI, DI, BPMOV BX, AX · MOV AL, [BX]
MOV AL, FFhFFh bir ad sanılırMOV AL, 0FFh
MOV IP, 200hIP'ye MOV ile yazılamazJMP ile atla
MOV AL, 300300 > 255, 8 bite sığmazMOV AX, 300

Bu kurallar MOV komutunun işlenen kısıtlarından gelir.

İlk Program

Daha Fazla Söz Dizimi Hatası

HatalıNeden?Doğrusu
MOV CS, AXCS yalnız JMP, CALL, RET, INT ile değişiruzak atlama
MOV ES, DSkesimden kesime MOV yokMOV AX, DS · MOV ES, AX
MOV [BX], [SI]iki bellek işleneniMOV AL, [SI] · MOV [BX], AL
INC [BX]boyut belirsizINC BYTE PTR [BX]
MOV AL, [BX+BP]iki taban yazmacı birlikte olmaz[BX+SI] ya da [BP+DI]
ADD 5, AXhedef sabit olamazADD AX, 5
PUSH 580186'dan önce yokMOV AX, 5 · PUSH AX
SHL AX, 28086'da sayı yalnız 1 ya da CLMOV CL, 2 · SHL AX, CL

PUSH sabit ve SHL AX, 2 80186 ve sonrasında geçerlidir. MASM 8086 için derlerken hata verir; emu8086 kabul eder, ama bu kod gerçek bir 8086'da çalışmaz.

İlk Program

Derleme Hatası mı, Mantık Hatası mı?

Derleme (söz dizimi) hatasıAssembler bulur, satır numarasını verir, program hiç oluşmaz.
  • MOV AL, BX: boyut uyuşmazlığı
  • JMP bsla: tanımsız etiket
  • MOV AL, 300: sığmayan sabit
Mantık hatasıProgram derlenir ve çalışır, ama sonuç yanlıştır; assembler bunu bilemez.
  • RET'i unutmak: veri komut sanılır
  • İşaretli sayı için JA kullanmak
  • ADC yerine ADD: elde kaybolur
  • .EXE'de DS'yi yüklememek
Mantık hatası tek adım çalıştırmayla bulunur: her komuttan sonra beklenen yazmaç ve bayrak değeri öykünücüdeki değerle karşılaştırılır. Değerlerin ayrıldığı ilk komut, hatanın bulunduğu yerdir.

Laboratuvar · 8086 komutları adım adım

Laboratuvar: İlk Programlar

Özet

Özet

AssemblyMakine koduyla birebir eşleşen düşük düzeyli dil; küçük ve hızlı kod, donanıma doğrudan erişim, ama taşınabilir değil.
Satır yapısı[etiket:] komut hedef, kaynak ; açıklama. Direktifler (ORG, DB, EQU) makine kodu üretmez.
İşlenenlerYazmaç en hızlısıdır; anlık değer yalnız kaynak olur; bellek işleneni yol döngüsü ister. MUL, LOOP, CBW örtük işlenen kullanır.
İlk program.COM programı ORG 100h ile 0100h'den başlar; veriler RET'ten sonra durur.
IPCS:IP sıradaki komutu gösterir; komut uzunluğu kadar ilerler.
BayraklarMOV, NOT, XCHG bayrakları değiştirmez; INC ve DEC CF'ye dokunmaz; ADD hepsini yeniden yazar.

Özet

Alıştırmalar

  1. AX = 0ABCDh iken MOV AH, 0 sonrası AX, AL ve BX değerleri nedir?
  2. AX = 1234h, BL = 03h iken MUL BL sonrası AX kaçtır? AH'deki 12h'ye ne olur?
  3. 8 MHz'lik bir 8086'da 2000 kez dönen bir döngüde sayaç INC sayac (21 tur) yerine INC CX (2 tur) ile artırılırsa kaç saat turu ve kaç milisaniye kazanılır?
  4. AL = 80h iken ADD AL, 80h sonrası AL, CF, ZF, SF, OF?
  5. Program 0100h'de başlar: 3 + 2 + 1 + 4 baytlık dört komut yürütülünce IP ne olur?
  6. MOV CX, AL ve MOV ES, 0B800h neden hatalıdır? Düzeltin.
Cevaplar
  1. AX = 00CDh, AL = CDh; BX değişmez.
  2. MUL BL, AL'yi (34h = 52) BL ile çarpar: 52 × 3 = 156 = 009Ch. Sonuç bütün AX'e yazılır; AH'deki 12h silinir.
  3. 2000 × (21 − 2) = 38 000 tur; bir tur 1/8 MHz = 0,125 µs → 4,75 ms.
  4. 80h + 80h = 100h → AL = 00h, CF = 1, ZF = 1, SF = 0, OF = 1 (−128 + −128 sığmaz).
  5. 0100h + 10 = 010Ah.
  6. Boyut uyumsuz → MOV CL, AL (ya da MOV CH, 0 + MOV CL, AL); kesime sabit atanamaz → MOV AX, 0B800h · MOV ES, AX.

Özet

Kaynaklar

  • emu8086 belgeleri, 8086 assembler tutorial for beginners (bölüm 1: numbering systems, bölüm 2: memory access).
  • Intel, 8086 16-Bit HMOS Microprocessor veri sayfası.
  • Barry B. Brey, The Intel Microprocessors, 8. baskı, Pearson.
  • Muhammad Ali Mazidi, Janice G. Mazidi, The 80x86 IBM PC and Compatible Computers, Pearson.

Son

Bölüm 3.2: Assembly
Sonraki bölüm: Bölüm 4.1: Bellek Erişimi · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.