Bölüm 3: Assembly

Mikroişlemciler
Assembly diliBasit bilgisayar modeliSistem veriyoluCPU'nun içiGenel amaçlı yazmaçlarKesim yazmaçlarıFiziksel adresIP 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.

Bilgisayar modeli

CPU, bellek, G/Ç aygıtları ve sistem veriyolunun görevlerini tanımlamak.

8086 yazmaçları

Genel amaçlı, kesim ve özel amaçlı yazmaçları ve 8/16 bit ilişkisini kullanmak.

Adres hesabı

Kesim:bağıl konum çiftinden 20 bitlik fiziksel adresi hesaplamak.

IP ve bayraklar

IP'nin nasıl ilerlediğini ve bir işlemin bayrakları nasıl etkilediğ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 seviyeli 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ı (yazmaçlar, bellek, veriyolu) hakkında bilgi sahibi olmayı 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

Dil Düzeyleri

DüzeyÖrnekKim anlar?
Yüksek düzeyli dil (C)x = 5; x++; return;İnsan; derleyici makine koduna çevirir
AssemblyMOV AX, 5 · INC AX · RETİnsan; assembler (çevirici) birebir çevirir
Makine dili (onaltılık)B8 05 00 · 40 · C3CPU (ikili olarak)
Makine dili (ikili)10111000 00000101 00000000 · 01000000 · 11000011CPU
Bir C satırı çoğu zaman birçok makine komutuna dönüşür; bir assembly satırı ise (direktifler hariç) tam olarak bir makine komutudur. Bu yüzden assembly, işlemcinin “ne yaptığını” doğrudan gösterir.

Assembly Dili

Assembler ve emu8086

kaynak.asmmetinAssemblerçeviricinesne / .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özdizimiyle yazılır; çoğu MASM/TASM ile de uyumludur.

Assembly Dili

Neden Assembly?

Çevirici dili (assembly) 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]  [; yorum]
SatırEtiketKomutİşlenenlerYorum
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 yorumdur ve makine koduna çevrilmez.

Bilgisayar Modeli

Basit Bilgisayar Modeli

Bellek (RAM)program ve veriler buradaMerkezî İşlem Birimi (CPU)8086: yazmaçlar + ALU + denetimGiriş/Çıkış aygıtlarıekran, klavye, disk…Sistem veriyolu
Sistem veriyoluBilgisayarın bileşenlerini birbirine bağlar.
CPUBilgisayarın kalbi; hesaplamaların çoğu CPU içinde yapılır.
RAMProgramların yürütülmek üzere yüklendiği alan: komutlar ve veriler.
G/Ç aygıtlarıKullanıcıyla ve dış dünyayla iletişim.

Bilgisayar Modeli

Sistem Veriyolu

CPU8086Bellek12345h: 3ChAdres veriyolu · 20 hat (A0–A19)Veri veriyolu · 16 hat (D0–D15)Denetim veriyolu · RD, WR, M/IO…
Adres veriyoluCPU'dan belleğe/G/Ç'ye tek yönlü. 8086'da 20 hat → 220 = 1 MB adreslenebilir bellek.
Veri veriyoluÇift yönlü. 8086'da 16 hat → tek seferde 1 bayt ya da 1 sözcük (word) aktarılır.
Denetim veriyoluİşlemin türünü bildirir: okuma (RD), yazma (WR), bellek mi G/Ç mı (M/IO), saat, kesme…

8086'da adres ve veri hatları aynı uçlardan zaman paylaşımlı geçer (AD0–AD15); ayrıntılar “8086 Pinler” bölümündedir.

Bilgisayar Modeli

Bellekten Okuma Adım Adım

CPU8086Bellek12345h: 3ChAdres veriyolu · 20 hat (A0–A19)Veri veriyolu · 16 hat (D0–D15)Denetim veriyolu · RD, WR, M/IO…

Komut: MOV AL, [12345h fiziksel adresi]. CPU'nun bir bayta ihtiyacı var; veri bellekte.

CPU8086Bellek12345h: 3ChAdres veriyolu · 20 hat (A0–A19)Veri veriyolu · 16 hat (D0–D15)Denetim veriyolu · RD, WR, M/IO…12345h

1. CPU, okunacak adresi adres veriyoluna koyar: 12345h.

CPU8086Bellek12345h: 3ChAdres veriyolu · 20 hat (A0–A19)Veri veriyolu · 16 hat (D0–D15)Denetim veriyolu · RD, WR, M/IO…RD, M

2. Denetim veriyolu: “bellekten oku” (RD etkin, M/IO = bellek).

CPU8086Bellek12345h: 3ChAdres veriyolu · 20 hat (A0–A19)Veri veriyolu · 16 hat (D0–D15)Denetim veriyolu · RD, WR, M/IO…3Ch

3. Bellek, 12345h'deki baytı (3Ch) veri veriyoluna koyar.

CPU8086AL = 3ChBellek12345h: 3ChAdres veriyolu · 20 hat (A0–A19)Veri veriyolu · 16 hat (D0–D15)Denetim veriyolu · RD, WR, M/IO…

4. CPU veriyi alır ve hedef yazmaca yazar: AL = 3Ch. 8086'da bu bir veriyolu çevrimidir (4 saat periyodu: T1–T4).

Yazma çevriminde 3. adımda veriyi CPU koyar ve WR sinyali etkin olur.

Bilgisayar Modeli

Getir – Çöz – Yürüt

1. Getir (fetch)CS:IP'deki komut baytları okunur2. Çöz (decode)komut ve işlenenler belirlenir3. Yürüt (execute)ALU / yazmaç / bellek işlemiIP komut uzunluğu kadar ilerler

Getir: CPU, CS:IP adresindeki komut baytlarını bellekten okur ve IP'yi komut uzunluğu kadar artırır.

1. Getir (fetch)CS:IP'deki komut baytları okunur2. Çöz (decode)komut ve işlenenler belirlenir3. Yürüt (execute)ALU / yazmaç / bellek işlemiIP komut uzunluğu kadar ilerler

Çöz: İşlem kodu (opcode) çözülür: hangi işlem, hangi yazmaç/bellek işlenenleri?

1. Getir (fetch)CS:IP'deki komut baytları okunur2. Çöz (decode)komut ve işlenenler belirlenir3. Yürüt (execute)ALU / yazmaç / bellek işlemiIP komut uzunluğu kadar ilerler

Yürüt: İşlem yapılır, sonuç yazılır, bayraklar güncellenir. Ardından döngü bir sonraki komutla tekrar başlar.

8086'da BIU (veriyolu arabirim birimi) komutları önceden getirip 6 baytlık komut kuyruğuna koyar; EU (yürütme birimi) bu sırada önceki komutu yürütür. Bu basit bir boru hattıdır (pipelining).

CPU'nun İçi

CPU'nun İçinde

AXAHALBXBHBLCXCHCLDXDHDLgenel amaçlı (16 = 8 + 8 bit)CSIPSSSPBPSIDIDSESkesim / işaretçi-indisAritmetik ve Mantık Birimi(ALU)Bayrak yazmacı (FLAGS)CFPFAFZFSFTFIFDFOF150OF taşmaDF yönIF kesmeTF tuzak/adımSF işaretZF sıfırAF yardımcı eldePF eşlikCF elde9 bayrak kullanılır; diğer 7 bit ayrılmıştır

Mavi: genel amaçlı · kırmızı: kesim yazmaçları · yeşil: işaretçi/indis yazmaçları. Köşeli çizgiler birlikte çalışan çiftleri gösterir (CS:IP, SS:SP/BP, DS:SI/DI).

Genel Amaçlı Yazmaçlar

Genel Amaçlı Yazmaçlar

  • 8086 CPU'da 8 adet genel amaçlı yazmaç vardır: AX, BX, CX, DX, SI, DI, BP, SP.
  • Her yazmacın bir adı ve tipik bir görevi vardır; ana amaç bir sayıyı (değişkeni) geçici olarak saklamaktır.
  • Hepsi 16 bittir. AX, BX, CX, DX ikişer adet 8 bitlik yazmaçtan oluşur (üst: H, alt: L).
  • CPU'nun içinde bulundukları için bellekten çok daha hızlıdır.
10010213141506070809010011112113014015AH = 00110000b = 30hAL = 00111001b = 39hAX = 0011000000111001b = 3039h = 12345 (onlu)

Genel Amaçlı Yazmaçlar

Yazmaçların Görevleri

YazmaçAdıTipik kullanımı
AX (AH, AL)Birikeç (Accumulator)Aritmetik işlemler; MUL/DIV'in örtük işleneni; IN/OUT ile port verisi
BX (BH, BL)Taban (Base)Bellek adreslemede taban adres: [BX]
CX (CH, CL)Sayaç (Count)LOOP ve REP için sayaç; kaydırmalarda sayı CL'de
DX (DH, DL)Veri (Data)MUL/DIV'de sonucun üst yarısı; G/Ç port adresi
SIKaynak indis (Source Index)Dizi/dizgi işlemlerinde kaynak adresi
DIHedef indis (Destination Index)Dizi/dizgi işlemlerinde hedef adresi
BPTaban işaretçisi (Base Pointer)Yığındaki parametre ve yerel değişkenlere erişim
SPYığın işaretçisi (Stack Pointer)Yığının tepesi; PUSH/POP/CALL/RET otomatik değiştirir

SI, DI, BP, SP'nin 8 bitlik yarıları yoktur. SP'yi genel amaçlı değişken gibi kullanmak yığını bozar.

Genel Amaçlı Yazmaçlar · Kodu adım adım çalıştır

Kod İzleme: AX, AH ve AL

AX0000AHALBayraklarZF=0SF=0PF=0AF=0CF=0

Başlangıç: AX = 0000h. ORG 100h makine koduna çevrilmez.

AX3039AHALBayraklarZF=0SF=0PF=0AF=0CF=0

MOV AX, 3039h: 16 bitin tamamı yazılır → AH = 30h, AL = 39h.

AX30FFAHALBayraklarZF=0SF=0PF=0AF=0CF=0

MOV AL, 0FFh: yalnızca alt bayt değişir → AX = 30FFh.

AX12FFAHALBayraklarZF=0SF=0PF=0AF=0CF=0

MOV AH, 12h: yalnızca üst bayt değişir → AX = 12FFh. MOV bayrakları etkilemez.

AX1200AHALBayraklarZF=1SF=0PF=1AF=1CF=0

INC AL: FFh + 1 = 00h (8 bit). Elde AH'ye geçmez: AX = 1200h. ZF = 1; INC, CF'yi değiştirmez.

ORG 100h
MOV AX, 3039h   ; AX = 3039h
MOV AL, 0FFh    ; yalnızca AL
MOV AH, 12h     ; yalnızca AH
INC AL          ; FFh + 1
RET

Genel Amaçlı Yazmaçlar

AX Yazmacı Oyun Alanı

AX'e bir değer yazın; üst ve alt baytları, ikili gösterimi ve onlu karşılıkları görün.

  • AH ve AL ayrı yazmaçlar gibi kullanılabilir, ama aynı 16 bitin parçalarıdır.
  • İşaretli yorumda bit 15 işaret bitidir (ikiye tümleyen).
  • BX/BH/BL, CX/CH/CL, DX/DH/DL aynı şekilde çalışır.
h

Genel Amaçlı Yazmaçlar

Yazmaç mı, Bellek mi?

Yazmaç
  • CPU'nun içindedir; erişim için veriyolu çevrimi 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 veriyolu çevrimi (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.
İ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.

Kesim Yazmaçları

Kesim Yazmaçları

Bellekteki erişilebilir blokları (kesim, segment) işaret etmek için kullanılır. Dört kesim yazmacı vardır:

CS · Code SegmentGeçerli programın (komutların) bulunduğu kesim. IP ile birlikte çalışır.
DS · Data SegmentDeğişkenlerin tanımlandığı kesim. Bellek işlenenlerinin varsayılanı.
ES · Extra SegmentKullanımı programcıya bağlı ek kesim; dizgi komutlarında hedef (ES:DI).
SS · Stack SegmentYığını içeren kesim. SP ve BP ile birlikte çalışır.
Neden kesim? 8086'nın yazmaçları 16 bittir (en fazla 64 KB adresler) ama adres veriyolu 20 bittir (1 MB). İki 16 bitlik değer birleştirilerek 20 bitlik adres elde edilir.

Kesim Yazmaçları

1 MB Bellek ve 64 KB Kesimler

00000hFFFFFhCS = DS = 0700h64 KB pencere07000hSS = 2000hyığın20000hES = B800hmetin ekranıB8000hkesim başlangıcı = kesim × 10hboyut: en fazla 64 KB (10000h)başlangıç 16'nın katıdır (paragraf)kesimler örtüşebilir ya daaynı bloğu gösterebilir1 MB bellek

Kesim Yazmaçları

Fiziksel Adres Hesabı

DS1230

Fiziksel adresi 12345h olan bayta erişmek için örneğin DS = 1230h ve SI = 0045h atanır.

DS1230× 10h12300sola 4 bit (1 onaltılık hane) kaydır

Kesim değeri 10h (16) ile çarpılır: onaltılıkta sağa bir 0 eklemek, ikilide 4 bit sola kaydırmaktır → 12300h.

DS1230× 10h12300sola 4 bit (1 onaltılık hane) kaydır+ SI0045

Bağıl konum (offset) eklenmek üzere hizalanır: 0045h.

DS1230× 10h12300sola 4 bit (1 onaltılık hane) kaydır+ SI0045=1234520 bitlik fiziksel adres

12300h + 0045h = 12345h. Gösterim: 1230:0045 (kesim:bağıl konum).

Kesim Yazmaçları

Aynı Adres, Farklı Çiftler

Kesim:Bağıl konumHesapFiziksel
1230:004512300 + 004512345h
1234:000512340 + 000512345h
1200:034512000 + 034512345h
1000:234510000 + 234512345h
0235:FFF502350 + FFF512345h
  • Kesimler 16 baytta bir başlar, 64 KB uzunluktadır → örtüşürler.
  • Bu nedenle bir fiziksel adrese 4096'ya kadar farklı kesim:bağıl konum çifti karşılık gelebilir.
  • Normalize biçimde bağıl konum 0–Fh arasıdır: 1234:0005.
  • Toplam 20 biti aşarsa 8086'da adres başa sarar: FFFF:0010 → 00000h.

Kesim Yazmaçları

Fiziksel Adres Hesaplayıcı

h : h

Onaltılık en fazla 4 hane girin. Hesap: fiziksel = kesim × 10h + bağıl konum (20 bit).

Kesim Yazmaçları

Varsayılan Kesim Eşleşmeleri

Bağıl konumu verenVarsayılan kesim
IP (sıradaki komut)CS
SP (yığın tepesi)SS
BP içeren adreslemeSS
BX, SI, DI, sabit adresDS
Dizgi komutlarında DIES
  • Kesim ve genel amaçlı yazmaçlar birlikte kullanılarak bellekteki herhangi bir değere erişilir.
  • Köşeli parantez içinde yazmaçlardan hesaplanan bağıl konuma etkin adres (EA) denir; fiziksel adres = kesim × 10h + EA.
  • Adreslemede yalnızca BX, SI, DI, BP kullanılabilir; [BX] geçerli, [BL], [BH], [AX] geçersiz.
  • Varsayılan değiştirilebilir: MOV AL, ES:[BX] (kesim önekli erişim).

Özel Amaçlı Yazmaçlar

Özel Amaçlı Yazmaçlar

Mikroişlemcinin belirli görevleri için ayrılmıştır; genel amaçlı yazmaçlar gibi MOV ile doğrudan erişilemez.

IP · Instruction Pointer
  • CS ile birlikte çalışır: CS:IP, getirilecek bir sonraki komutu gösterir.
  • Diğer işlemcilerde Program Counter (PC) olarak da bilinir.
  • Her komut getirildiğinde komut uzunluğu kadar artar.
  • Yalnızca JMP, CALL, RET, INT, IRET ve koşullu atlamalar değiştirir.
FLAGS · Bayrak yazmacı
  • İşlemlerden sonra CPU tarafından otomatik güncellenir.
  • Koşullu atlamalarla programın akışını (kontrolü) diğer bölümlere aktarmak için kullanılır.
  • Sonucun durumunu gösteren bitlere durum bayrakları, CPU'yu yönlendiren bitlere denetim bayrakları denir.

Not: 8086'da IP, o anda yürütülen komutu değil, sıradaki komutu gösterir (komut kuyruğu nedeniyle daha da ileride okuma yapılabilir).

Özel Amaçlı Yazmaçlar · 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

Özel Amaçlı Yazmaçlar

Bayrak Yazmacı

0CF1–2PF3–4AF5–6ZF7SF8TF9IF10DF11OF12–13–14–15–durum bayrağı (sonuçtan etkilenir)denetim bayrağı (programcı ayarlar)
BayrakBit1 olur, eğer…
CF elde (carry)0işaretsiz sonuç sığmadıysa: toplamada elde, çıkarmada ödünç
PF eşlik (parity)2sonucun alt baytında çift sayıda 1 varsa
AF yardımcı elde4bit 3'ten bit 4'e elde/ödünç olduysa (BCD işlemleri)
ZF sıfır (zero)6sonuç sıfırsa
SF işaret (sign)7sonucun en anlamlı biti 1 ise (negatif)
OF taşma (overflow)11işaretli sonuç sığmadıysa
TF, IF, DF8, 9, 10adım adım çalışma, kesmelere izin, dizgi yönü (denetim)

Özel Amaçlı Yazmaçlar

Bayraklar Nasıl Oluşur?

MOV AL, 7Fh · MOV BL, 01h · ADD AL, BL

AL0111 11117Fh+127
+ BL0000 000101h+1
= AL1000 000080hişaretsiz 128, işaretli −128
CF = 0 · bit 7'den dışarı elde çıkmadı (işaretsiz 127 + 1 = 128 sığar).
ZF = 0 · sonuç 80h sıfır değil.
SF = 1 · sonucun bit 7'si 1 → işaretli yorumda negatif.
OF = 1 · iki pozitif sayının toplamı negatif çıktı → işaretli taşma (+128, 8 bite sığmaz).
PF = 0 · 1000 0000'da bir adet 1 var (tek sayı).
AF = 1 · alt yarım bayt: Fh + 1h = 10h → bit 3'ten bit 4'e elde.

Özel Amaçlı Yazmaçlar

Bayrak Hesaplayıcı

h h

8 bitlik ADD AL, BL ya da SUB AL, BL sonrası durum bayrakları. Değerleri onaltılık girin (00–FF).

Özel Amaçlı Yazmaçlar · Kodu adım adım çalıştır

Kod İzleme: Bayraklar

AX00F0AHALBayraklarCF=0ZF=0SF=0OF=0PF=0AF=0

AL = F0h (işaretsiz 240, işaretli −16). MOV bayrakları değiştirmez.

AX0010AHALBayraklarCF=1ZF=0SF=0OF=0PF=0AF=0

F0h + 20h = 110h → AL = 10h, dışarı taşan 1 → CF = 1. İşaretli: −16 + 32 = 16 doğru → OF = 0.

AX0000AHALBayraklarCF=0ZF=1SF=0OF=0PF=1AF=0

10h − 10h = 00h → ZF = 1, PF = 1 (sıfır adet 1 çifttir), ödünç yok → CF = 0.

AX00FFAHALBayraklarCF=1ZF=0SF=1OF=0PF=1AF=1

00h − 1 = FFh: ödünç alındı → CF = 1, SF = 1 (işaretli −1), PF = 1 (sekiz adet 1), AF = 1.

AX00FFAHALBayraklarCF=1ZF=0SF=1OF=0PF=1AF=1

RET ile DOS'a dönülür. Aynı bit deseni (FFh) işaretsiz 255, işaretli −1 olarak yorumlanabilir.

MOV AL, 0F0h
ADD AL, 20h    ; F0h + 20h
SUB AL, 10h
SUB AL, 1
RET

İ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, kodu yaz, emulate; ardından single step ile her komutun yazmaçları nasıl değiştirdiğini izle.

İlk Program

Yazım Kuralları

Sayı tabanları 25 veya 25d onlu · 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.
Yorumlar ; sonrası yorumdur. 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ın ayrıntısı bir sonraki bölümde (Bellek Erişimi, MOV komutu) ele alınır.

Özet

Özet

AssemblyMakine koduyla birebir eşleşen düşük seviyeli dil; küçük ve hızlı kod, donanıma doğrudan erişim, ama taşınabilir değil.
Bilgisayar modeliCPU + RAM + G/Ç, sistem veriyolu ile bağlı: adres (20 bit), veri (16 bit), denetim.
Genel amaçlı yazmaçlarAX, BX, CX, DX (8 bitlik H/L yarılarıyla), SI, DI, BP, SP; hepsi 16 bit.
Kesim yazmaçlarıCS, DS, ES, SS; fiziksel adres = kesim × 10h + bağıl konum.
IPCS:IP sıradaki komutu gösterir; komut uzunluğu kadar ilerler.
BayraklarCF, PF, AF, ZF, SF, OF sonuca göre; TF, IF, DF denetim için.

Özet

Alıştırmalar

  1. AX = 0ABCDh iken MOV AH, 0 sonrası AX, AL ve BX değerleri nedir?
  2. DS = 2000h, BX = 1234h ise [BX] hangi fiziksel adrestir? Aynı adresi veren başka bir kesim:bağıl konum çifti yazın.
  3. Fiziksel adres B815Eh için normalize edilmiş kesim:bağıl konum nedir?
  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. 20000h + 1234h = 21234h; örneğin 2123:0004 veya 2000:1234.
  3. B815:000E (B8150h + Eh).
  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.
  • Andrew S. Tanenbaum, Modern Operating Systems, 3. baskı (bilgisayar modeli).

Son

Bölüm 3: Assembly
Sonraki bölüm: Bölüm 4: Bellek Erişimi
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.