Bölüm 3: Assembly
Giriş
Öğrenme Çıktıları
Assembly dilinin makine dili ve yüksek düzeyli dillerle ilişkisini açıklamak.
CPU, bellek, G/Ç aygıtları ve sistem veriyolunun görevlerini tanımlamak.
Genel amaçlı, kesim ve özel amaçlı yazmaçları ve 8/16 bit ilişkisini kullanmak.
Kesim:bağıl konum çiftinden 20 bitlik fiziksel adresi hesaplamak.
IP'nin nasıl ilerlediğini ve bir işlemin bayrakları nasıl etkilediğini izlemek.
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.
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 | Örnek | Kim anlar? |
|---|---|---|
| Yüksek düzeyli dil (C) | x = 5; x++; return; | İnsan; derleyici makine koduna çevirir |
| Assembly | MOV AX, 5 · INC AX · RET | İnsan; assembler (çevirici) birebir çevirir |
| Makine dili (onaltılık) | B8 05 00 · 40 · C3 | CPU (ikili olarak) |
| Makine dili (ikili) | 10111000 00000101 00000000 · 01000000 · 11000011 | CPU |
Assembly Dili
Assembler ve emu8086
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.
Assembly Dili
Komut Satırının Yapısı
[etiket:] komut [hedef], [kaynak] [; yorum]| Satır | Etiket | Komut | İşlenenler | Yorum |
|---|---|---|---|---|
basla: MOV AX, 5 ; AX ← 5 | basla | MOV | AX, 5 | ; AX ← 5 |
INC AX | — | INC | AX | — |
RET | — | RET | yok | — |
- İ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, bxileMOV AX, BXaynıdır. ;işaretinden satır sonuna kadar her şey yorumdur ve makine koduna çevrilmez.
Bilgisayar Modeli
Basit Bilgisayar Modeli
Bilgisayar Modeli
Sistem Veriyolu
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
Komut: MOV AL, [12345h fiziksel adresi]. CPU'nun bir bayta ihtiyacı var; veri bellekte.
1. CPU, okunacak adresi adres veriyoluna koyar: 12345h.
2. Denetim veriyolu: “bellekten oku” (RD etkin, M/IO = bellek).
3. Bellek, 12345h'deki baytı (3Ch) veri veriyoluna koyar.
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
Getir: CPU, CS:IP adresindeki komut baytlarını bellekten okur ve IP'yi komut uzunluğu kadar artırır.
Çöz: İşlem kodu (opcode) çözülür: hangi işlem, hangi yazmaç/bellek işlenenleri?
Yürüt: İşlem yapılır, sonuç yazılır, bayraklar güncellenir. Ardından döngü bir sonraki komutla tekrar başlar.
CPU'nun İçi
CPU'nun İçinde
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.
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 |
SI | Kaynak indis (Source Index) | Dizi/dizgi işlemlerinde kaynak adresi |
DI | Hedef indis (Destination Index) | Dizi/dizgi işlemlerinde hedef adresi |
BP | Taban işaretçisi (Base Pointer) | Yığındaki parametre ve yerel değişkenlere erişim |
SP | Yığı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
Başlangıç: AX = 0000h. ORG 100h makine koduna çevrilmez.
MOV AX, 3039h: 16 bitin tamamı yazılır → AH = 30h, AL = 39h.
MOV AL, 0FFh: yalnızca alt bayt değişir → AX = 30FFh.
MOV AH, 12h: yalnızca üst bayt değişir → AX = 12FFh. MOV bayrakları etkilemez.
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.
Genel Amaçlı Yazmaçlar
Yazmaç mı, Bellek mi?
- 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.
- 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.
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:
Kesim Yazmaçları
1 MB Bellek ve 64 KB Kesimler
Kesim Yazmaçları
Fiziksel Adres Hesabı
Fiziksel adresi 12345h olan bayta erişmek için örneğin DS = 1230h ve SI = 0045h atanı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.
Bağıl konum (offset) eklenmek üzere hizalanır: 0045h.
12300h + 0045h = 12345h. Gösterim: 1230:0045 (kesim:bağıl konum).
Kesim Yazmaçları
Aynı Adres, Farklı Çiftler
| Kesim:Bağıl konum | Hesap | Fiziksel |
|---|---|---|
1230:0045 | 12300 + 0045 | 12345h |
1234:0005 | 12340 + 0005 | 12345h |
1200:0345 | 12000 + 0345 | 12345h |
1000:2345 | 10000 + 2345 | 12345h |
0235:FFF5 | 02350 + FFF5 | 12345h |
- 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ı
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 veren | Varsayılan kesim |
|---|---|
IP (sıradaki komut) | CS |
SP (yığın tepesi) | SS |
BP içeren adresleme | SS |
BX, SI, DI, sabit adres | DS |
Dizgi komutlarında DI | ES |
- 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.
- 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.
- İş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?
Program CS:0100h'ye yüklenir; IP = 0100h ilk komutu gösterir.
MOV AX, 5 (B8 05 00) getirilir: IP = 0103h, yürütülünce AX = 0005h.
3 bayt daha: IP = 0106h, BX = 0002h.
INC AX tek bayttır (40h): IP = 0107h, AX = 0006h.
ADD AX, BX 2 bayt: IP = 0109h, AX = 0008h.
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ı
| Bayrak | Bit | 1 olur, eğer… |
|---|---|---|
CF elde (carry) | 0 | işaretsiz sonuç sığmadıysa: toplamada elde, çıkarmada ödünç |
PF eşlik (parity) | 2 | sonucun alt baytında çift sayıda 1 varsa |
AF yardımcı elde | 4 | bit 3'ten bit 4'e elde/ödünç olduysa (BCD işlemleri) |
ZF sıfır (zero) | 6 | sonuç sıfırsa |
SF işaret (sign) | 7 | sonucun en anlamlı biti 1 ise (negatif) |
OF taşma (overflow) | 11 | işaretli sonuç sığmadıysa |
TF, IF, DF | 8, 9, 10 | adı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
| AL | 0111 1111 | 7Fh | +127 |
| + BL | 0000 0001 | 01h | +1 |
| = AL | 1000 0000 | 80h | işaretsiz 128, işaretli −128 |
Özel Amaçlı Yazmaçlar
Bayrak Hesaplayıcı
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
AL = F0h (işaretsiz 240, işaretli −16). MOV bayrakları değiştirmez.
F0h + 20h = 110h → AL = 10h, dışarı taşan 1 → CF = 1. İşaretli: −16 + 32 = 16 doğru → OF = 0.
10h − 10h = 00h → ZF = 1, PF = 1 (sıfır adet 1 çifttir), ödünç yok → CF = 0.
00h − 1 = FFh: ödünç alındı → CF = 1, SF = 1 (işaretli −1), PF = 1 (sekiz adet 1), AF = 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.
İlk Program
Yazım Kuralları
25 veya 25d onlu · 19h onaltılık · 00011001b ikili · 31o sekizli. Hepsi aynı değer: 25.0 konur: 0FFh, 0B800h. FFh yazılırsa assembler onu bir ad (etiket/değişken) sanır.'A' → ASCII kodu 41h. MOV CL, 'A' ile MOV CL, 41h aynı makine kodunu üretir.-1 8 bitte FFh, 16 bitte FFFFh olarak saklanır (ikiye tümleyen).mov, MOV, Mov aynıdır; var1 ile VAR1 aynı addır.; 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, BX | Boyutlar farklı (8 ↔ 16 bit) | MOV AL, BL veya MOV AX, BX |
MOV DS, 1234h | Kesim yazmacına sabit atanamaz | MOV AX, 1234h · MOV DS, AX |
MOV AL, [AX] | Adreslemede yalnız BX, SI, DI, BP | MOV BX, AX · MOV AL, [BX] |
MOV AL, FFh | FFh bir ad sanılır | MOV AL, 0FFh |
MOV IP, 200h | IP'ye MOV ile yazılamaz | JMP ile atla |
MOV AL, 300 | 300 > 255, 8 bite sığmaz | MOV AX, 300 |
Bu kuralların ayrıntısı bir sonraki bölümde (Bellek Erişimi, MOV komutu) ele alınır.
Özet
Özet
Özet
Alıştırmalar
- AX = 0ABCDh iken
MOV AH, 0sonrası AX, AL ve BX değerleri nedir? - DS = 2000h, BX = 1234h ise
[BX]hangi fiziksel adrestir? Aynı adresi veren başka bir kesim:bağıl konum çifti yazın. - Fiziksel adres B815Eh için normalize edilmiş kesim:bağıl konum nedir?
- AL = 80h iken
ADD AL, 80hsonrası AL, CF, ZF, SF, OF? - Program 0100h'de başlar: 3 + 2 + 1 + 4 baytlık dört komut yürütülünce IP ne olur?
MOV CX, ALveMOV ES, 0B800hneden hatalıdır? Düzeltin.
Cevaplar
- AX = 00CDh, AL = CDh; BX değişmez.
- 20000h + 1234h = 21234h; örneğin
2123:0004veya2000:1234. B815:000E(B8150h + Eh).- 80h + 80h = 100h → AL = 00h, CF = 1, ZF = 1, SF = 0, OF = 1 (−128 + −128 sığmaz).
- 0100h + 10 = 010Ah.
- Boyut uyumsuz →
MOV CL, AL(ya daMOV 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).