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)
Boshqaruv pulti
Platadagi qismlar
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'rsatma
R0 = 10 dan boshlang. Siklda avvalOUT 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'rsatma
Ikki 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'rsatma
CMP 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'rsatma
5-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.
| Buyruq | Ma'nosi | Opkod | Kodlash (16 bit) |
|---|---|---|---|
HALT | Dasturni to'xtatish | 0000 | 0000 0000 0000 0000 |
MOV Rd, n | Rd ← son n (0..255) | 0001 | 0001 dd00 nnnn nnnn |
MOV Rd, Rs | Rd ← Rs (nusxa) | 0010 | 0010 ddss 0000 0000 |
MOV Rd, [a] | Rd ← xotira[a] | 0011 | 0011 dd00 aaaa aaaa |
MOV [a], Rs | xotira[a] ← Rs | 0100 | 0100 00ss aaaa aaaa |
MOV Rd, [Rs] | Rd ← xotira[Rs] — manzil registrda | 0101 | 0101 ddss 0000 0000 |
MOV [Rs], Rd | xotira[Rs] ← Rd — manzil registrda | 0110 | 0110 ssdd 0000 0000 |
ADD Rd, Rs | Rd ← Rd + Rs; Z, N | 0111 | 0111 ddss 0000 0000 |
ADD Rd, n | Rd ← Rd + n; Z, N | 1000 | 1000 dd00 nnnn nnnn |
SUB Rd, Rs | Rd ← Rd − Rs; Z, N | 1001 | 1001 ddss 0000 0000 |
SUB Rd, n | Rd ← Rd − n; Z, N | 1010 | 1010 dd00 nnnn nnnn |
INC Rd / DEC Rd | Rd ± 1 — ADD Rd, 1 / SUB Rd, 1 ning qisqa yozuvi | 1000 / 1010 | 1000 dd00 0000 0001 |
CMP Rd, Rs | Rd − Rs hisoblanadi, faqat Z, N yangilanadi | 1011 | 1011 ddss 0000 0000 |
CMP Rd, n | Rd − n hisoblanadi, faqat Z, N yangilanadi | 1100 | 1100 dd00 nnnn nnnn |
JMP yorliq | Shartsiz sakrash: PC ← manzil | 1101 | 1101 0000 aaaa aaaa |
JE yorliq | Sakrash, agar Z=1 (teng) | 1101 | 1101 0001 aaaa aaaa |
JNE yorliq | Sakrash, agar Z=0 (teng emas) | 1101 | 1101 0010 aaaa aaaa |
JL yorliq | Sakrash, agar N=1 (kichik) | 1101 | 1101 0011 aaaa aaaa |
JG yorliq | Sakrash, agar Z=0 va N=0 (katta) | 1101 | 1101 0100 aaaa aaaa |
OUT Rd | Rd qiymatini ekranga yuborish | 1110 | 1110 dd00 0000 0000 |