8086 Workshop

Assembly emulator and Logic Design notes
Ready

Code

Tap a line number to set a breakpoint

Screen

80 × 25 text mode

Memory

DS:
IP is herelast writtenvariable

Registers

hex · decimal

Flags

Variables

Stack

SS:SP and above

Help

How to use it

Run all executes the whole program at once and prints all of its output together. Line by line executes instructions one at a time at the chosen speed, so you can watch which line is running. Step executes a single instruction and highlights the registers and flags it changed. Reset takes the program back to its first instruction.

Tap a line number to set a red dot (breakpoint). The program pauses when it reaches that line; continue from there with Step.

When the program waits for keyboard input, the status shows "Waiting for key". Type in the box under the screen and press Enter.

Your code is saved in this browser. After loading an example, pick My code in the menu to get it back.

Supported instructions

  • Data transfer: MOV, XCHG, LEA, PUSH, POP, PUSHF, POPF, LAHF, SAHF, XLAT, CBW, CWD
  • Arithmetic: ADD, ADC, SUB, SBB, INC, DEC, NEG, CMP, MUL, IMUL, DIV, IDIV, DAA, DAS, AAA, AAS
  • Logic and shifts: AND, OR, XOR, NOT, TEST, SHL/SAL, SHR, SAR, ROL, ROR, RCL, RCR
  • Jumps: JMP, CALL, RET, LOOP, LOOPE, LOOPNE, JCXZ and every conditional jump (JE, JNE, JA, JB, JG, JL, JC, JZ…)
  • Strings: MOVSB/W, LODSB/W, STOSB/W, CMPSB/W, SCASB/W with REP/REPE/REPNE prefixes
  • Flags: CLC, STC, CMC, CLD, STD, CLI, STI · Other: NOP, HLT, INT

Interrupts (INT)

21h / AH=01hRead a key and echo it → AL
21h / AH=02hPrint the character in DL
21h / AH=07h, 08hRead a key without echo → AL
21h / AH=09hPrint the $-terminated string at DS:DX
21h / AH=0AhRead a line (buffer at DS:DX)
21h / AH=2Ah, 2ChDate, time
21h / AH=4ChExit the program
10h / AH=00h, 02h, 0EhClear screen, move cursor, print character
16h / AH=00h, 01hWait for key, check for key
20hExit the program

Syntax

  • Numbers: 25, 0FFh, 0x1F, 1010b, character 'A'
  • Data: msg db 'Hello$', num dw 1234, arr db 10 dup(0), count equ 8
  • Memory: [bx], [bx+si+2], arr[si], byte ptr [di], and offset msg for an address
  • Both org 100h (.COM layout) and .model small / .data / .code work. All segments are 0700h, so mov ax, @data works too.
  • Code is not translated to machine code, so instruction sizes in addresses are approximate.

Nasıl kullanılır

Tümünü çalıştır programı bir anda sonuna kadar işletir ve çıktının hepsini birden yazar. Satır satır komutları seçili hızda tek tek işletir; hangi satırın çalıştığını izlersin. Adım tek bir komut işletir; o komutun değiştirdiği yazmaç ve bayraklar işaretlenir. Baştan programı ilk komuta geri alır.

Bir satır numarasına dokununca kırmızı nokta (durma noktası) çıkar. Program o satıra gelince durur, oradan Adım ile devam edebilirsin.

Program klavyeden bir şey beklerse durum "Klavye bekleniyor" olur. Ekranın altındaki kutuya yaz, Enter ile gönder.

Yazdığın kod bu tarayıcıda saklanır; örnek seçtikten sonra menüdeki Benim kodum ile geri dönebilirsin.

Desteklenen komutlar

  • Taşıma: MOV, XCHG, LEA, PUSH, POP, PUSHF, POPF, LAHF, SAHF, XLAT, CBW, CWD
  • Aritmetik: ADD, ADC, SUB, SBB, INC, DEC, NEG, CMP, MUL, IMUL, DIV, IDIV, DAA, DAS, AAA, AAS
  • Mantık ve kaydırma: AND, OR, XOR, NOT, TEST, SHL/SAL, SHR, SAR, ROL, ROR, RCL, RCR
  • Atlama: JMP, CALL, RET, LOOP, LOOPE, LOOPNE, JCXZ ve tüm koşullu atlamalar (JE, JNE, JA, JB, JG, JL, JC, JZ…)
  • Metin: MOVSB/W, LODSB/W, STOSB/W, CMPSB/W, SCASB/W, REP/REPE/REPNE ön ekleri
  • Bayrak: CLC, STC, CMC, CLD, STD, CLI, STI · Diğer: NOP, HLT, INT

Kesmeler (INT)

21h / AH=01hTuş oku, ekrana yaz → AL
21h / AH=02hDL'deki karakteri yaz
21h / AH=07h, 08hTuş oku, yazmadan → AL
21h / AH=09hDS:DX'teki $ ile biten metni yaz
21h / AH=0AhSatır oku (tampon DS:DX)
21h / AH=2Ah, 2ChTarih, saat
21h / AH=4ChProgramı bitir
10h / AH=00h, 02h, 0EhEkranı temizle, imleci taşı, karakter yaz
16h / AH=00h, 01hTuş bekle, tuş var mı
20hProgramı bitir

Yazım kuralları

  • Sayılar: 25, 0FFh, 0x1F, 1010b, karakter 'A'
  • Veri: mesaj db 'Selam$', sayi dw 1234, dizi db 10 dup(0), adet equ 8
  • Bellek: [bx], [bx+si+2], dizi[si], byte ptr [di], adres için offset mesaj
  • org 100h (.COM düzeni) ve .model small / .data / .code düzeni çalışır. Tüm segmentler 0700h'tır, mov ax, @data da çalışır.
  • Kod makine diline çevrilmez; adreslerdeki komut boyutları yaklaşıktır.

Mantıksal Tasarım ders notları

Haftalık notların ve sunumların özeti. Her konunun altında örnekler, kısa formüller ve konunun 8086'da nerede karşına çıktığı var. Hesapları aşağıdaki iki araçla kontrol edebilir, ilgili programı tek dokunuşla emülatörde çalıştırabilirsin.

Araç

Sayı çevirici

Taban dönüşümü, tümleyen, BCD, Gray, eşlik
Araç

Doğruluk tablosu ve K-haritası

En fazla 4 değişken

Yazım: x' değil, xy veya x.y VE, x+y VEYA, x^y XOR, parantez serbest. Değişkenler tek harf.

2. hafta

Sayı sistemleri ve taban dönüşümü

2.hafta.pdf · Bölüm 1 sunumu

Konumsal gösterimde her basamak, tabanın konumuna karşılık gelen kuvvetiyle çarpılıp toplanır. r tabanında basamaklar 0 ile r−1 arasındadır. Alt indis tabanı gösterir.

(a₃a₂a₁a₀.a₋₁)ᵣ = a₃·r³ + a₂·r² + a₁·r¹ + a₀·r⁰ + a₋₁·r⁻¹

İkiliden onluya(0111)₂ = 2²+2¹+2⁰ = (7)₁₀
Kesirli ikili(11010.11)₂ = 16+8+2+0.5+0.25 = 26.75
5 tabanı(4021.2)₅ = 4·5³+2·5+1+2·5⁻¹ = (511.4)₁₀
Sekizli(127.4)₈ = 64+16+7+4/8 = (87.5)₁₀
Onaltılı(B65F)₁₆ = 11·16³+6·16²+5·16+15 = (46687)₁₀
Kısa yol: 1'lerin ağırlığı(110101)₂ = 32+16+4+1 = (53)₁₀
  • Onludan r tabanına (tam kısım): sürekli r'ye böl, kalanları aşağıdan yukarı oku. 7 → 7÷2=3 k1, 3÷2=1 k1, 1÷2=0 k1 → 111.
  • Kesir kısmı: sürekli r ile çarp, tam kısımları yukarıdan aşağı oku. 0.6875 → 0.1011₂. Her kesir sonlu basamakla yazılamaz (0.1₁₀ ikilide sonsuz).
  • İkili ↔ sekizli / onaltılı: noktadan başlayarak üçerli (sekizli) ya da dörderli (onaltılı) grupla.

8086'da

Yazmaçlar 16 bitlik ikili sayılardır, emülatör bunları onaltılı gösterir: AX = 0035h = 53. Kodda 53, 35h, 110101b aynı sayıdır. "İkili yazdır" programı bir sayıyı SHL ile bit bit ekrana yazar.

PDF'i aç
3. hafta

Tümleyenler ve işaretli sayılar

3.hafta.pdf · Bölüm 1.5–1.6
  • (r−1)'e tümleyen (9'a, 1'e): her basamağı r−1'den çıkar. 9'a: 546700 → 453299. 1'e: 1011001 → 0100110 (bitleri ters çevir).
  • r'ye tümleyen (10'a, 2'ye): (r−1)'e tümleyen + 1. 10'a: 2389 → 9999−2389+1 = 7611.
  • 2'ye tümleyen kısa yolu: en sağdan ilk 1'e kadar (o 1 dahil) aynen yaz, gerisini ters çevir. 1101100 → 0010100.
  • Tümleyenle çıkarma M − N: M + (N'nin r'ye tümleyeni). Elde çıkarsa at, sonuç pozitif. Elde çıkmazsa sonuç negatif: toplamın tümleyenini al, önüne − koy.
10'a tümleyen, M ≥ N72532 − 13250 → 72532 + 86750 = 159282 → 59282
10'a tümleyen, M < N13250 − 72532 → 13250 + 27468 = 40718 → −59282
2'ye tümleyen, X − Y1010100 + 0111101 = 10010001 → 0010001 (84−67=17)
2'ye tümleyen, Y − X1000011 + 0101100 = 1101111 → −0010001

Tamsayı gösterimleri: işaretli büyüklük, işaretli 1'e tümleyen, işaretli 2'ye tümleyen. En soldaki bit işarettir (0 artı, 1 eksi). −9, 8 bitle: 10001001 / 11110110 / 11110111. n bitlik 2'ye tümleyenle aralık −2ⁿ⁻¹ … 2ⁿ⁻¹−1 (8 bit: −128…127). Sonuç bu aralığa sığmazsa taşma (overflow) olur.

8086'da

  • NEG 2'ye tümleyeni, NOT 1'e tümleyeni alır. SUB işlemcide aslında tümleyenle toplamadır.
  • CF işaretsiz elde/borç, OF işaretli taşmadır. İşaretsiz karşılaştırmada JA/JB, işaretlide JG/JL kullanılır.
PDF'i aç
Bölüm 1.7

İkili kodlar: BCD, Gray, ASCII, eşlik

Bölüm 1 sunumu
  • BCD: her onlu basamak ayrı 4 bitle yazılır: 84 → 1000 0100. BCD ikili sayı değildir; 0001 0101 BCD'de 15'tir.
  • BCD toplama: ikili topla; basamak 9'u geçerse ya da elde çıkarsa o basamağa 6 (0110) ekle. 4+8 = 1100 → +0110 → 1 0010 = 12.
  • Gray kodu: ardışık iki sayı arasında tek bit değişir. G = B ⊕ (B ≫ 1). 7→8 ikilide 0111→1000 (4 bit değişir), Gray'de 0100→1100.
  • ASCII: 7 bit, 128 karakter. '0' = 30h, 'A' = 41h, 'a' = 61h; büyük-küçük harf farkı 20h (32).
  • Eşlik (parite) biti: 1'lerin sayısını çift (çift eşlik) ya da tek yapan ek bit. 0101100 için çift eşlik biti 1'dir (üç tane 1 var).

8086'da

  • DAA BCD toplamadaki "+6 düzeltmesini" otomatik yapar.
  • PF bayrağı sonucun alt baytında 1'lerin sayısı çiftse 1 olur; bu bir eşlik bitidir.
  • "Büyük harfe çevir" örneği ASCII'deki 32 farkını kullanır.
4. hafta

Bilgisayarın birimleri ve Boole cebri

4.hafta.pdf · Bölüm 2 sunumu

Klavyeden girilen her tuş 8 bitlik koda dönüşür, giriş kaydedicisinden geçerek belleğe yazılır ("JOHN" örneği). İşlem birimi kaydedicilerdeki bitler üzerinde çalışır; bellek yalnızca saklar.

xyx·y (VE)x+y (VEYA)x⊕y (XOR)
00000
01011
10011
11110
Etkisiz elemanx + 0 = x   x · 1 = x
Tümleyenx + x' = 1   x · x' = 0
Aynı kuvvetx + x = x   x · x = x
Yutan elemanx + 1 = 1   x · 0 = 0
Çift tümleyen(x')' = x
Değişme, birleşmex+y = y+x   x+(y+z) = (x+y)+z
Dağılmax(y+z) = xy + xz   x + yz = (x+y)(x+z)
DeMorgan(x+y)' = x'y'   (xy)' = x' + y'
Yutmax + xy = x   x(x+y) = x

Dualite (eşleklik): bir ifadede + ile ·, 0 ile 1 yer değiştirirse elde edilen ifade de doğrudur. Örnek: x + xy = x ⇔ x(x + y) = x.

Sadeleştirme örnekleri: (x+y)(x+y') = x   xy + x'z + yz = xy + x'z (konsensüs)   (x+y)(x'+z)(y+z) = (x+y)(x'+z)

8086'da

AND, OR, XOR, NOT komutları bu işlemleri 8 ya da 16 bitin hepsine aynı anda uygular. xor ax, ax AX'i sıfırlar çünkü x ⊕ x = 0.

PDF'i aç
5. hafta

Boole fonksiyonları, tümleyen, minterm ve maxterm

5.hafta.pdf

Fonksiyonun tümleyeni: DeMorgan'ı uygula, yani + ile ·'yı değiştir ve her değişkenin tümleyenini al.

F₁x(x'+y) = 0 + xy = xy
F₁' = x' + y'
F₂x + x'y = (x+x')(x+y) = x + y
F₂' = x'y'
F₃(x+y)(x+y') = x
F₃' = x'
F₄xy + x'z
F₄' = (x'+y')(x+z') = x'z' + xy'
  • Minterm (mᵢ): satırda 1 olan değişken düz, 0 olan tümleyenli yazılan VE terimi. 101 → m₅ = xy'z.
  • Maxterm (Mᵢ): tersi; 0 olan düz, 1 olan tümleyenli VEYA terimi. 101 → M₅ = x' + y + z'. Mᵢ = mᵢ'.
  • Mintermlerin toplamı: F'nin 1 olduğu satırlar. f₁ = x'y'z + xy'z' + xyz = Σm(1,4,7).
  • Maxtermlerin çarpımı: F'nin 0 olduğu satırlar. f₁ = ΠM(0,2,3,5,6).
PDF'i aç
6. hafta

Karnaugh haritası

6.hafta.pdf

Boole fonksiyonlarını sadeleştirme yöntemidir. Hücreler Gray sırasıyla dizilir (00, 01, 11, 10), böylece yan yana hücreler tek bitle ayrılır ve kenarlar birbirine komşudur.

  • 1'leri 1, 2, 4, 8… büyüklüğünde dikdörtgen gruplara al; gruplar olabildiğince büyük, sayısı olabildiğince az olsun.
  • Gruplar üst üste binebilir; sağ-sol ve üst-alt kenarlar komşudur (dört köşe de bir gruptur).
  • Grupta değişmeyen değişkenler terimi verir. 2 hücre → 1 değişken düşer, 4 hücre → 2 değişken düşer.
3 değişkeny'z' + yz' = z'(y'+y) = z'
3 değişkenx'y + xy' → sadeleşmez (XOR)
4 değişkende hücrem₉ = wx'y'z, m₁₁ = wx'yz, m₁₄ = wxyz'
ÖdevF₂ = w'x' + xyz' + wy'z'
PDF'i aç
6.-7. hafta

Birleşik devreler: toplayıcı, çıkarıcı, MUX

6.-7.hafta.pdf (slaytta "10. hafta")

Birleşik (combinational) devre: çıkış yalnızca o anki girişe bağlıdır, bellek yoktur. Sıralı (sequential) devre: çıkış girişe ve devrenin durumuna (bellek) bağlıdır. n giriş 2ⁿ kombinasyon verir.

Tasarım aşamaları: problemi tanımla → giriş/çıkış sayısını belirle → doğruluk tablosunu çıkar → K-haritasıyla sadeleştir → kapılarla gerçekle.

Yarım toplayıcıS = x ⊕ y = xy' + x'y
C = xy
Tam toplayıcıS = x ⊕ y ⊕ z
C = xy + z(x ⊕ y)
Yarım çıkarıcıD = x ⊕ y
B = x'y
Tam çıkarıcıD = x ⊕ y ⊕ z
B = x'y + z(x ⊕ y)'
2×1 MUXY = S'·I₀ + S·I₁
4×1 MUXY = S₁'S₀'I₀ + S₁'S₀I₁ + S₁S₀'I₂ + S₁S₀I₃

Tam toplayıcı iki yarım toplayıcı ve bir VEYA kapısıyla kurulur. MUX ile fonksiyon gerçekleme: bir değişkeni seçme ucuna bağla, diğerlerine göre girişleri belirle. Örnek: f(x,y) = xy + x'y', S = x için I₀ = y', I₁ = y.

8086'da

ADD 16 tam toplayıcının zincirlenmesidir; en soldaki eldenin çıktığı yer CF'dir. ADC bu eldeyi bir sonraki toplamaya katar, böylece 32 bitlik sayılar toplanabilir.

PDF'i aç
10. hafta

Mandal (latch) ve flip-flop

HAFTA_10.pdf (slaytta "12. hafta")
SR mandal (NOR)S=0 R=0 → değişmez
S=0 R=1 → Q=0
S=1 R=0 → Q=1
S=1 R=1 → yasak (Q=Q'=0)
D mandalCLK=1 → Q = D
CLK=0 → Q değişmez
S ve R aynı anda 1 olamaz
JK flip-flop00 değişmez · 01 sıfırla
10 kur · 11 tümle
Q(t+1) = JQ' + K'Q
D ve T flip-flopD: Q(t+1) = D
T: Q(t+1) = T ⊕ Q

Mandal düzeye duyarlıdır (CLK 1 olduğu sürece girişi izler), flip-flop kenara duyarlıdır (yalnızca saatin yükselen kenarında değer alır). D flip-flop, master-slave bağlanmış iki D mandaldan oluşur.

8086'da

AX, BX gibi her yazmaç 16 tane D flip-flop'tur. Emülatördeki her Adım bir saat kenarı gibi düşünülebilir: yazmaçlar yalnızca o anda yeni değerini alır.

11-12. hafta

Sıralı devre analizi ve durum makineleri

HAFTA_11&12.pdf (slaytta "13. hafta")

Durum denklemi: bir sonraki durumu, şimdiki durum ve girişlerin fonksiyonu olarak verir. D flip-flop'ta durum denklemi giriş denklemiyle aynıdır. m flip-flop ve n giriş için durum tablosu 2ᵐ⁺ⁿ satırdır.

Örnek devre: A(t+1) = (A ⊕ B)x   B(t+1) = B'x   y = ABx

ABxA(t+1)B(t+1)y
000000
001010
010000
011100
100000
101110
110000
111001

Bu devre x = 1 geldikçe 00 → 01 → 10 → 11 sayar, 11 durumunda x = 1 gelince y = 1 verir ve başa döner; x = 0 her zaman 00'a götürür.

  • JK ile analiz: giriş denklemlerini bul (örnek: J_A = Bx, K_A = x' + B, J_B = x, K_B = 1), her satır için JK karakteristik tablosuyla sonraki durumu yaz.
  • T ile analiz: T_A = Bx, T_B = x → A(t+1) = Bx ⊕ A, B(t+1) = x ⊕ B. x = 1 iken 2 bitlik sayaçtır, çıkışlar y₁ = A, y₀ = B.
  • Sonlu durum makinesi (FSM): durum kaydedicisi + sonraki durum mantığı + çıkış mantığı. Moore makinesinde çıkış yalnızca duruma bağlıdır (trafik ışığı örneği: S0 yeşil/kırmızı → S1 sarı/kırmızı → S2 kırmızı/yeşil → S3 kırmızı/sarı).

8086'da

İşlemcinin kendisi büyük bir durum makinesidir: IP şimdiki durumu tutar, her komut sonraki durumu belirler. CMP + JE ile yazılan döngüler de durum geçişidir.

PDF'i aç