Kompyuter qanday ishlaydi
Amaliyot

Mini kompyuter simulyatori

Plata ustida haqiqiy tizim: 8 bitli protsessor, dastur xotirasi, RAM va ekran. Assembler yozing, "Qadam" bosing va har bir sonning qaysi shina bo'ylab qayerga borishini ko'ring.

Bu 7-bobdagi Fetch-Decode-Execute sikli, 6.4-bo'limdagi ISA va 12-bobdagi mashina kodi bitta jonli sxemada. Ko'k shina manzilni tashiydi, yashil shina ma'lumotni, mis rangli boshqaruv liniyalari esa "nima qilish kerak" signalini. Xotira kataklarini bosib, sonni o'zingiz yozishingiz mumkin.

Dastur (assembler)

Ctrl+Enter ham yig'adi

Boshqaruv pulti

3(10 = animatsiyasiz)
Dasturni yig'ing va "Qadam" tugmasini bosing.
Qadam = bitta bosqich (Fetch, Decode, Execute yoki Store). Buyruq = to'rttasi ketma-ket. Avto = dastur oxirigacha.
CPU · 8 bit · 4 registr takt 0 ichki ma'lumot shinasi Boshqaruv qurilmasi (CU) FETCH DECODE EXECUTE STORE — buyruq kutilmoqda IR — buyruq registri opkod Rd Rs son / manzil — Registrlar ALU A B Flaglar Z N PC 0 keyingi buyruq Takt generatori to'xtagan tezlik: 3 Hisobchi buyruqlar: 0 holat: tayyor Shinalar manzil (qayerga?) ma'lumot (nima?) boshqaruv (o'qi/yoz) Bitta buyruq = 4 takt: FETCH → DECODE → EXECUTE → STORE. Haqiqiy protsessorda sekundiga milliardlab. Dastur xotirasi (ROM) manzil ma'lumot bo'sh Ma'lumot xotirasi (RAM) 16 × 8 bit · katakni bosib qiymatni o'zgartiring manzil ma'lumot RD/WR Chiqish qurilmasi (ekran) ▸ _
Xotira [0] =0..255
manzil shinasima'lumot shinasiboshqaruv liniyasiTelefonda platani yonga surib ko'ring.

Platadagi qismlar

CU — boshqaruv qurilmasiIR dagi bitlarni o'qib, qaysi blokka qanday signal berishni hal qiladi. To'rtta LED hozirgi bosqichni ko'rsatadi.
IR — buyruq registriXotiradan olingan 16 bitli buyruq shu yerda turadi: opkod, registr raqamlari, son yoki manzil.
Registrlar R0–R3Protsessorning eng tez xotirasi. Har birida 8 ta bit-LED va o'nlik qiymat. ALU faqat shular bilan ishlaydi.
ALUQo'shadi, ayiradi, taqqoslaydi. A va B kirishlariga sonlar keladi, pastdan natija chiqadi, Z va N flaglar yonadi.
PC — buyruq hisoblagichiKeyingi buyruqning ROM dagi manzili. Har buyruqdan keyin +1, sakrashda esa yangi manzil.
ROM va RAMROM da dastur (o'qish uchun), RAM da ma'lumot (16 katak, o'qish va yozish). Ikkalasiga ham manzil shinasi orqali murojaat qilinadi.
8 bit degani: har registr va katak 0..255. Chegaradan chiqsa "aylanadi": 250 + 10 → 4, 3 − 5 → 254 (N=1). Taqqoslash ishorasiz: JL "N=1 bo'lsa", JG "Z=0 va N=0 bo'lsa" degani.

Mashqlar

Har mashq uchun o'zingiz dastur yozing, yig'ing va natijani ekranda tekshiring.

1. 10 dan 1 gacha sanash

Ekranda 10, 9, 8, … 1 chiqsin. Sikl 1 dan keyin to'xtasin.

Ko'rsatmaR0 = 10 dan boshlang. Siklda avval OUT R0, keyin DEC R0; DEC nol natija bersa Z=1 bo'ladi — demak JNE sikl 0 ga yetguncha boshiga qaytaradi. Oxirida HALT.

2. Sonni 3 ga ko'paytirish

R0 dagi sonni 3 ga ko'paytiring (7 → 21). Ko'paytirish buyrug'i yo'q!

Ko'rsatmaIkki yo'l: (a) 4-misoldagi kabi sikl bilan 3 marta qo'shish; (b) siklsiz — MOV R1, R0, so'ng ADD R0, R1 ni ikki marta. Qaysi biri kam takt sarflaydi? Hisobchiga qarang.

3. Ikki son farqining moduli

|R0 − R1| ni chiqaring: 5 va 9 uchun 4, 9 va 5 uchun ham 4.

Ko'rsatmaCMP R0, R1 dan keyin JL kichik: R0 kichik bo'lsa R1 − R0, aks holda R0 − R1. Ikki tarmoqni JMP tugadi bilan birlashtiring (3-misoldagi if/else).

4. Xotiradagi eng katta son

[0]…[4] kataklariga 5 ta son yozing (katakni bosib) va eng kattasini toping.

Ko'rsatma5-misolni asos qiling: R1 — indeks, MOV R2, [R1] navbatdagi sonni o'qiydi. R0 da hozircha eng kattasi tursin: CMP R2, R0, R2 katta bo'lsa (JG) R0 ← R2. Boshida R0 = [0].
Buyruqlar to'plami (ISA): 19 buyruq va ularning mashina kodi

Flaglar faqat ADD, SUB, INC, DEC va CMP da yangilanadi. Izohlar ; dan boshlanadi, yorliqlar nom: ko'rinishida, katta-kichik harf farqlanmaydi. Har buyruq 16 bit: oooo opkod, dd/ss registr raqamlari (R0=00 … R3=11), oxirgi 8 bit son yoki manzil; sakrashlarda registr maydonlari o'rnida shart kodi.

BuyruqMa'nosiOpkodKodlash (16 bit)
HALTDasturni to'xtatish00000000 0000 0000 0000
MOV Rd, nRd ← son n (0..255)00010001 dd00 nnnn nnnn
MOV Rd, RsRd ← Rs (nusxa)00100010 ddss 0000 0000
MOV Rd, [a]Rd ← xotira[a]00110011 dd00 aaaa aaaa
MOV [a], Rsxotira[a] ← Rs01000100 00ss aaaa aaaa
MOV Rd, [Rs]Rd ← xotira[Rs] — manzil registrda01010101 ddss 0000 0000
MOV [Rs], Rdxotira[Rs] ← Rd — manzil registrda01100110 ssdd 0000 0000
ADD Rd, RsRd ← Rd + Rs; Z, N01110111 ddss 0000 0000
ADD Rd, nRd ← Rd + n; Z, N10001000 dd00 nnnn nnnn
SUB Rd, RsRd ← Rd − Rs; Z, N10011001 ddss 0000 0000
SUB Rd, nRd ← Rd − n; Z, N10101010 dd00 nnnn nnnn
INC Rd / DEC RdRd ± 1 — ADD Rd, 1 / SUB Rd, 1 ning qisqa yozuvi1000 / 10101000 dd00 0000 0001
CMP Rd, RsRd − Rs hisoblanadi, faqat Z, N yangilanadi10111011 ddss 0000 0000
CMP Rd, nRd − n hisoblanadi, faqat Z, N yangilanadi11001100 dd00 nnnn nnnn
JMP yorliqShartsiz sakrash: PC ← manzil11011101 0000 aaaa aaaa
JE yorliqSakrash, agar Z=1 (teng)11011101 0001 aaaa aaaa
JNE yorliqSakrash, agar Z=0 (teng emas)11011101 0010 aaaa aaaa
JL yorliqSakrash, agar N=1 (kichik)11011101 0011 aaaa aaaa
JG yorliqSakrash, agar Z=0 va N=0 (katta)11011101 0100 aaaa aaaa
OUT RdRd qiymatini ekranga yuborish11101110 dd00 0000 0000