13-bo‘lim

O'z virtual mashinangiz

To'liq ishlaydigan virtual protsessor - komandalar to'plami, kodlash, bajaruvchi halqa, stek va quyi dasturlar.

🕑 12 daqiqa o‘qish 📄 1 911 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Komandalar to'plami
  2. Mashina
  3. Birinchi dastur: faktorial
  4. Stek va quyi dasturlar
  5. Xulosa

Sakkizinchi bo'limda sumator qurdik, to'qqizinchida ALU, o'ninchida komanda sikli. Endi hammasini birlashtiramiz.

Bu bo'lim oxirida sizda ishlaydigan protsessor bo'ladi - o'z komandalar to'plami, registrlari, steki va quyi dasturlari bilan.

Komandalar to'plami #

Avval ISA ni belgilaymiz (11-bo'lim). Bizniki RISC uslubida: qat'iy 32 bitli komanda, yuklash-saqlash arxitekturasi.

Har komanda aynan 32 bit va to'rt maydonga bo'linadi:

Bizning komanda formatimiz AMAL a b QIYMAT 8 bit · bit 31..24 4 bit 4 bit 16 bit · bit 15..0 qaysi amal maqsad manba son yoki manzil Misol: KOPAYT r0, r1 00000111 0000 0001 0000000000000000 7 = KOPAYT r0 r1 ishlatilmaydi 0x07010000 Xotirada shu son yotadi - komanda nomi hech qayerda saqlanmaydi
Yig'ish va ajratish - bir xil formatning ikki tomoni

Faktorial dasturidagi komandalar shu formatda quyidagicha kodlanadi:

AssemblerAmal kodiKodlangan son
YUKLA r0, 110x01000001
YUKLA r1, 510x01100005
KOPAYT r0, r170x07010000
AYIR r1, r260x06120000
AGAR_EMAS 4160x10000004
CHIQAR r0220x16000000
TOXTA00x00000000

Format 10-bo'limdagi bilan bir xil g'oyada, faqat kengroq: to'rt maydon, aniq chegaralar.

Format 10-bo'limdagi bilan bir xil g'oyada, faqat kengroq: to'rt maydon, aniq chegaralar.

Nima uchun 32 bit va nima uchun bunday bo'linish?

Har maydonning kengligi nimani ifodalashi kerakligidan kelib chiqadi:

MaydonBitlarNechta qiymatNima uchun yetarli
Amal8256Bizda 23 ta amal bor
a registr416Bizda 4 ta registr
b registr416Xuddi shunday
Qiymat1665 536Xotira 256 katak

Ko'rinib turibdiki, bizda zaxira bor: amal uchun 8 bit ortiqcha. Haqiqiy loyihada bu bitlar kelajakdagi kengaytirishlar uchun qoldiriladi.

11-bo'limdagi x86 hikoyasini eslang: bir marta band qilingan bit abadiy band bo'lib qoladi. Shuning uchun format loyihalashda zaxira qoldirish - yaxshi odat.

Mashina #

Endi bajaruvchining o'zi. Butun mantiq bitta takrorlanuvchi qadamda: ol, dekodla, bajar.

Bizning virtual protsessorimiz Registrlar r0 r1 r2 r3 kk - komanda ko'rs. sk - stek ko'rs. nol, kichik - bayroq BITTA QADAM 1. OL 2. DEKODLA 3. BAJAR 23 ta amal Xotira (256 katak) dastur va ma'lumot stek - yuqoridan pastga CHAQIR / QAYT shu yerda Fon Neyman sxemasi (1-bo'lim) - endi to'liq Dastur ham, ma'lumot ham, stek ham - bitta xotirada Bu 20-bo'limda assembler qo'shilganda to'liq mashinaga aylanadi
Uch qism - va ular orasidagi harakat butun hisoblashni tashkil qiladi

Mashinaning butun holati atigi bir necha narsadan iborat:

QismNimadan iborat
Registrlar4 ta, har biri 16 bitli
Xotira256 katak
Komanda ko'rsatkichikeyingi komanda manzili
Stek ko'rsatkichistekning joriy cho'qqisi
Bayroqlarnol va kichik

Har qadamda mashina uch ish qiladi:

  1. Ko'rsatkich ko'rsatgan katakdan 32 bitli sonni oladi.
  2. Ko'rsatkichni bittaga oshiradi.
  3. Sonni maydonlarga ajratadi va amalni bajaradi.

Yigirma uchta amal beshta guruhga bo'linadi:

GuruhAmallarNima qiladi
Ma'lumot ko'chirishYUKLA, KOCHIR, OQI, YOZqiymatni joyidan joyiga
HisoblashQOSH, AYIR, KOPAYTarifmetika, bayroq qo'yadi
Bit amallariVA, YOKI, XOR, SURCH, SURO4-bo'limdagilar
O'tishSAKRA, AGAR_NOL, AGAR_EMAS, AGAR_KICHIKko'rsatkichni o'zgartiradi
Stek va chaqiruvITAR, TORT, CHAQIR, QAYTquyi dasturlar uchun
Qadamlar chegarasi nima uchun kerak

Mashinamizda qadamlar soniga chegara qo'yilgan.

Usiz xato dastur cheksiz aylanib qolardi va uni to'xtatishning iloji bo'lmasdi - chunki bizda uzilish mexanizmi yo'q (u 18-bo'limda ko'riladi).

Haqiqiy protsessorlarda ham xuddi shu muammo bor. Yechim - taymer uzilishi: operatsion tizim dasturni majburan to'xtatib, boshqasiga navbat beradi.

Shu mexanizm bo'lmaganda, bitta cheksiz halqa butun kompyuterni muzlatib qo'yardi. 1990-yillargacha ba'zi tizimlarda aynan shunday bo'lgan.

E'tibor bering: mashinada qadamlar chegarasi bor. Usiz xato dastur cheksiz aylanib qolardi - va bizda uni to'xtatadigan uzilish mexanizmi yo'q (u 18-bo'limda).

Birinchi dastur: faktorial #

5! ni hisoblaydigan dastur to'qqiz komandadan iborat:

ManzilKomandaIzoh
0YUKLA r0, 1natija
1YUKLA r1, 5hisoblagich
2YUKLA r2, 1doimiy 1
3YUKLA r3, 0taqqoslash uchun
4KOPAYT r0, r1halqa boshi
5AYIR r1, r2hisoblagichni kamaytirish
6AGAR_EMAS 4nol emas bo'lsa - 4 ga qayt
7CHIQAR r0natijani chiqarish
8TOXTAtugadi

Mashinani ishga tushirsak, u shu 21 qadamni bosib o'tadi:

QadamKKKomandar0r1Nol
10YUKLA r0, 1100
21YUKLA r1, 5150
32YUKLA r2, 1150
43YUKLA r3, 0150
54KOPAYT r0, r1550
65AYIR r1, r2540
76AGAR_EMAS 4540
84KOPAYT r0, r12040
95AYIR r1, r22030
106AGAR_EMAS 42030
114KOPAYT r0, r16030
125AYIR r1, r26020
136AGAR_EMAS 46020
144KOPAYT r0, r112020
155AYIR r1, r212010
166AGAR_EMAS 412010
174KOPAYT r0, r112010
185AYIR r1, r212001
196AGAR_EMAS 412001
207CHIQAR r012001
218TOXTA12001

Natija: 120, ya'ni 5! = 5 × 4 × 3 × 2 × 1.

Ikki joyga alohida e'tibor bering.

8, 11, 14 va 17-qadamlarda ko'rsatkich 6 dan 4 ga qaytdi - bu halqa. r0 ustuni esa 5 → 20 → 60 → 120 bo'lib o'sib bordi.

18-qadamda r1 nolga yetdi va nol bayrog'i yondi. Shundan keyin AGAR_EMAS ishlamadi va dastur halqadan chiqdi.

Yigirma bir qadam - va faktorial hisoblandi. Bu dastur bizning mashinamizda, bizning komandalarimiz bilan ishladi.

Yigirma bir qadam - va faktorial hisoblandi. Bu dastur bizning mashinamizda, bizning komandalarimiz bilan ishladi.

Halqani qanday o'qish kerak

Dasturdagi halqa uch qismdan iborat - bu naqsh hamma joyda uchraydi:

ManzilKomandaVazifasi
4KOPAYT r0, r1Ish
5AYIR r1, r2Hisoblagichni kamaytirish
6AGAR_EMAS 4Shartni tekshirib qaytish

12-bo'limdagi haqiqiy x86 halqasi ham aynan shunday edi: add, dec, jnz.

Yuqori darajali tildagi for halqasi kompilyatordan keyin aynan shu uchlikka aylanadi.

Stek va quyi dasturlar #

Endi murakkabroq dastur - u quyi dastur chaqiradi va stekdan foydalanadi:

Bu dastur Fibonachchi ketma-ketligini hisoblaydi va har qadamda quyi dastur chaqiradi:

ManzilKomandaIzoh
0-3YUKLA ...boshlang'ich qiymatlar
4CHAQIR 20quyi dasturni chaqirish
5QOSH r0, r1keyingi sonni hisoblash
6ITAR r0stekka saqlash
7KOCHIR r0, r1siljitish
8TORT r1stekdan olish
9AYIR r2, r3hisoblagichni kamaytirish
10AGAR_EMAS 4halqaga qaytish
11TOXTAtugadi
20CHIQAR r0quyi dastur: chiqarish
21QAYTchaqirgan joyga qaytish

Natija:

Qiymat
Mashina chiqardi0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Bajarilgan qadamlar95
Stek ko'rsatkichi joyidamiha

Oxirgi qator muhim: har ITAR uchun TORT, har CHAQIR uchun QAYT bo'lgani uchun stek muvozanatda qoldi.

Bu dasturda uchta mexanizm ishladi:

MexanizmNima qiladi
CHAQIR va QAYTqaytish manzilini stekda saqlaydi
ITAR va TORTvaqtincha qiymatni stekda saqlaydi
AGAR_EMASbayroqqa qarab shartli o'tish
Nima uchun aynan stek?

CHAQIR qaytish manzilini qayerga qo'yishi kerak? Registrga qo'ysa - ikkinchi chaqiruv uni yo'q qiladi.

Stek bu muammoni tabiiy hal qiladi: har chaqiruv o'z manzilini ustiga qo'yadi, har qaytish esa eng ustidagini oladi.

Shuning uchun funksiya ichidan funksiya chaqirish mumkin - va bu rekursiya ning ham asosi.

Ayni paytda bu stekning chegarasi bor: juda chuqur rekursiya stekni to'ldirib yuboradi. Tanish "stack overflow" xatosi aynan shundan kelib chiqadi.

Bu dasturda uchta muhim mexanizm ishladi:

MexanizmNima qiladi
CHAQIRQaytish manzilini stekka saqlab, sakraydi
QAYTStekdan manzilni olib, o'sha yerga qaytadi
ITAR / TORTVaqtinchalik qiymatni saqlash

Oxirgi qatorga e'tibor bering: stek ko'rsatkichi boshlang'ich joyiga qaytdi. Bu - dastur stekni to'g'ri tozalaganining belgisi.

Stek muvozanati - eng ko'p uchraydigan xato

Har ITAR uchun TORT, har CHAQIR uchun QAYT bo'lishi shart.

Muvozanat buzilsa:

XatoOqibati
Ortiqcha ITARStek asta to'ladi va xotirani bosadi
Yetishmagan TORTQAYT noto'g'ri manzilga sakraydi
Ortiqcha TORTBegona qiymat o'qiladi

Ikkinchisi eng xavfli: dastur butunlay boshqa joyga sakraydi va nima bo'layotganini tushunish qiyin.

Aynan shu mexanizm 12-bo'limda aytilgan stekni to'ldirish hujumining asosi. Faqat u yerda qaytish manzilini xato emas, hujumchi almashtiradi.

Shuning uchun assembler yozganda stek muvozanatini har doim tekshiring - bizning misolimizdagi oxirgi qator kabi.

Bu mashina - o'quv modeli

Bizning mashinamizda haqiqiy protsessorning ko'p qismi yo'q:

Yo'q narsaNima uchun kerak
UzilishlarTashqi hodisalarga javob berish (18-bo'lim)
Xotira himoyasiJarayonlarni ajratish
Imtiyoz darajalariFoydalanuvchi va yadro rejimi
KeshTezlik (14-bo'lim)
KonveyerTezlik (16-bo'lim)
Haqiqiy kiritish-chiqarishTashqi dunyo bilan aloqa

Bu ro'yxat qisqartirilgan emas - shunchaki bizning maqsadimiz boshqa edi: komanda qanday bajarilishini ko'rsatish.

Qolgan qismlarni keyingi bo'limlarda ko'rib chiqamiz, 20-bo'limda esa shu mashinaga assembler yozamiz.

Amaliy topshiriq
  1. YUKLA r1, 5 ni YUKLA r1, 7 ga o'zgartirsak, natija qancha bo'ladi?
  2. YUKLA r1, 10 bo'lsa, 16 bitli chegara sabab nima sodir bo'ladi?
  3. QOSH r0, r1 komandasini qo'lda kodlang (amal kodi 5).
  4. 0x06120000 sonini maydonlarga ajrating.
  5. Faktorial izida halqa necha marta aylanganini sanang.
  6. Nol bayrog'i qaysi qadamda yonganini toping va sababini yozing.
  7. Fibonachchi dasturida ITAR va TORT nima uchun kerakligini tushuntiring.
  8. CHAQIR qaytish manzilini registrda saqlasa, qanday muammo chiqardi?
  9. "Stack overflow" xatosi qanday paydo bo'lishini yozing.
  10. Ikki sonning eng katta umumiy bo'luvchisini topish algoritmini yozing.

Xulosa #

  • Virtual mashina - haqiqiy protsessorning dasturiy modeli.
  • ISA ni belgilash birinchi qadam: komandalar, format, maydonlar kengligi.
  • Format loyihalashda zaxira bit qoldiring - keyin qo'shib bo'lmaydi.
  • Butun bajaruvchi mantiq bitta qadamda: ol, dekodla, bajar.
  • Halqa uch qismdan iborat: ish, hisoblagich, shartli qaytish.
  • Stek quyi dasturlarni mumkin qiladi: CHAQIR manzilni saqlaydi, QAYT tiklaydi.
  • ITAR va TORT vaqtinchalik qiymatlar uchun.
  • Stek muvozanati buzilsa, dastur kutilmagan joyga sakraydi.
  • Aynan shu mexanizm stekni to'ldirish hujumining asosi.
  • Bizning mashinamizda uzilish, kesh va himoya yo'q - ular keyingi bo'limlarda.

Keyingi bo'limda tezlikka o'tamiz: xotira ierarxiyasi va kesh.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.