13-bo‘lim
O'z virtual mashinangiz
To'liq ishlaydigan virtual protsessor - komandalar to'plami, kodlash, bajaruvchi halqa, stek va quyi dasturlar.
Ushbu bo‘lim mundarijasi
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:
Faktorial dasturidagi komandalar shu formatda quyidagicha kodlanadi:
| Assembler | Amal kodi | Kodlangan son |
|---|---|---|
YUKLA r0, 1 | 1 | 0x01000001 |
YUKLA r1, 5 | 1 | 0x01100005 |
KOPAYT r0, r1 | 7 | 0x07010000 |
AYIR r1, r2 | 6 | 0x06120000 |
AGAR_EMAS 4 | 16 | 0x10000004 |
CHIQAR r0 | 22 | 0x16000000 |
TOXTA | 0 | 0x00000000 |
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.
Har maydonning kengligi nimani ifodalashi kerakligidan kelib chiqadi:
| Maydon | Bitlar | Nechta qiymat | Nima uchun yetarli |
|---|---|---|---|
| Amal | 8 | 256 | Bizda 23 ta amal bor |
a registr | 4 | 16 | Bizda 4 ta registr |
b registr | 4 | 16 | Xuddi shunday |
| Qiymat | 16 | 65 536 | Xotira 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.
Mashinaning butun holati atigi bir necha narsadan iborat:
| Qism | Nimadan iborat |
|---|---|
| Registrlar | 4 ta, har biri 16 bitli |
| Xotira | 256 katak |
| Komanda ko'rsatkichi | keyingi komanda manzili |
| Stek ko'rsatkichi | stekning joriy cho'qqisi |
| Bayroqlar | nol va kichik |
Har qadamda mashina uch ish qiladi:
- Ko'rsatkich ko'rsatgan katakdan 32 bitli sonni oladi.
- Ko'rsatkichni bittaga oshiradi.
- Sonni maydonlarga ajratadi va amalni bajaradi.
Yigirma uchta amal beshta guruhga bo'linadi:
| Guruh | Amallar | Nima qiladi |
|---|---|---|
| Ma'lumot ko'chirish | YUKLA, KOCHIR, OQI, YOZ | qiymatni joyidan joyiga |
| Hisoblash | QOSH, AYIR, KOPAYT | arifmetika, bayroq qo'yadi |
| Bit amallari | VA, YOKI, XOR, SURCH, SURO | 4-bo'limdagilar |
| O'tish | SAKRA, AGAR_NOL, AGAR_EMAS, AGAR_KICHIK | ko'rsatkichni o'zgartiradi |
| Stek va chaqiruv | ITAR, TORT, CHAQIR, QAYT | quyi dasturlar uchun |
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:
| Manzil | Komanda | Izoh |
|---|---|---|
| 0 | YUKLA r0, 1 | natija |
| 1 | YUKLA r1, 5 | hisoblagich |
| 2 | YUKLA r2, 1 | doimiy 1 |
| 3 | YUKLA r3, 0 | taqqoslash uchun |
| 4 | KOPAYT r0, r1 | halqa boshi |
| 5 | AYIR r1, r2 | hisoblagichni kamaytirish |
| 6 | AGAR_EMAS 4 | nol emas bo'lsa - 4 ga qayt |
| 7 | CHIQAR r0 | natijani chiqarish |
| 8 | TOXTA | tugadi |
Mashinani ishga tushirsak, u shu 21 qadamni bosib o'tadi:
| Qadam | KK | Komanda | r0 | r1 | Nol |
|---|---|---|---|---|---|
| 1 | 0 | YUKLA r0, 1 | 1 | 0 | 0 |
| 2 | 1 | YUKLA r1, 5 | 1 | 5 | 0 |
| 3 | 2 | YUKLA r2, 1 | 1 | 5 | 0 |
| 4 | 3 | YUKLA r3, 0 | 1 | 5 | 0 |
| 5 | 4 | KOPAYT r0, r1 | 5 | 5 | 0 |
| 6 | 5 | AYIR r1, r2 | 5 | 4 | 0 |
| 7 | 6 | AGAR_EMAS 4 | 5 | 4 | 0 |
| 8 | 4 | KOPAYT r0, r1 | 20 | 4 | 0 |
| 9 | 5 | AYIR r1, r2 | 20 | 3 | 0 |
| 10 | 6 | AGAR_EMAS 4 | 20 | 3 | 0 |
| 11 | 4 | KOPAYT r0, r1 | 60 | 3 | 0 |
| 12 | 5 | AYIR r1, r2 | 60 | 2 | 0 |
| 13 | 6 | AGAR_EMAS 4 | 60 | 2 | 0 |
| 14 | 4 | KOPAYT r0, r1 | 120 | 2 | 0 |
| 15 | 5 | AYIR r1, r2 | 120 | 1 | 0 |
| 16 | 6 | AGAR_EMAS 4 | 120 | 1 | 0 |
| 17 | 4 | KOPAYT r0, r1 | 120 | 1 | 0 |
| 18 | 5 | AYIR r1, r2 | 120 | 0 | 1 |
| 19 | 6 | AGAR_EMAS 4 | 120 | 0 | 1 |
| 20 | 7 | CHIQAR r0 | 120 | 0 | 1 |
| 21 | 8 | TOXTA | 120 | 0 | 1 |
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.
Dasturdagi halqa uch qismdan iborat - bu naqsh hamma joyda uchraydi:
| Manzil | Komanda | Vazifasi |
|---|---|---|
| 4 | KOPAYT r0, r1 | Ish |
| 5 | AYIR r1, r2 | Hisoblagichni kamaytirish |
| 6 | AGAR_EMAS 4 | Shartni 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:
| Manzil | Komanda | Izoh |
|---|---|---|
| 0-3 | YUKLA ... | boshlang'ich qiymatlar |
| 4 | CHAQIR 20 | quyi dasturni chaqirish |
| 5 | QOSH r0, r1 | keyingi sonni hisoblash |
| 6 | ITAR r0 | stekka saqlash |
| 7 | KOCHIR r0, r1 | siljitish |
| 8 | TORT r1 | stekdan olish |
| 9 | AYIR r2, r3 | hisoblagichni kamaytirish |
| 10 | AGAR_EMAS 4 | halqaga qaytish |
| 11 | TOXTA | tugadi |
| 20 | CHIQAR r0 | quyi dastur: chiqarish |
| 21 | QAYT | chaqirgan joyga qaytish |
Natija:
| Qiymat | |
|---|---|
| Mashina chiqardi | 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 |
| Bajarilgan qadamlar | 95 |
| Stek ko'rsatkichi joyidami | ha |
Oxirgi qator muhim: har ITAR uchun TORT, har CHAQIR
uchun QAYT bo'lgani uchun stek muvozanatda qoldi.
Bu dasturda uchta mexanizm ishladi:
| Mexanizm | Nima qiladi |
|---|---|
CHAQIR va QAYT | qaytish manzilini stekda saqlaydi |
ITAR va TORT | vaqtincha qiymatni stekda saqlaydi |
AGAR_EMAS | bayroqqa qarab shartli o'tish |
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:
| Mexanizm | Nima qiladi |
|---|---|
CHAQIR | Qaytish manzilini stekka saqlab, sakraydi |
QAYT | Stekdan manzilni olib, o'sha yerga qaytadi |
ITAR / TORT | Vaqtinchalik qiymatni saqlash |
Oxirgi qatorga e'tibor bering: stek ko'rsatkichi boshlang'ich joyiga qaytdi. Bu - dastur stekni to'g'ri tozalaganining belgisi.
Har ITAR uchun TORT, har CHAQIR uchun QAYT bo'lishi
shart.
Muvozanat buzilsa:
| Xato | Oqibati |
|---|---|
Ortiqcha ITAR | Stek asta to'ladi va xotirani bosadi |
Yetishmagan TORT | QAYT noto'g'ri manzilga sakraydi |
Ortiqcha TORT | Begona 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.
Bizning mashinamizda haqiqiy protsessorning ko'p qismi yo'q:
| Yo'q narsa | Nima uchun kerak |
|---|---|
| Uzilishlar | Tashqi hodisalarga javob berish (18-bo'lim) |
| Xotira himoyasi | Jarayonlarni ajratish |
| Imtiyoz darajalari | Foydalanuvchi va yadro rejimi |
| Kesh | Tezlik (14-bo'lim) |
| Konveyer | Tezlik (16-bo'lim) |
| Haqiqiy kiritish-chiqarish | Tashqi 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.
YUKLA r1, 5niYUKLA r1, 7ga o'zgartirsak, natija qancha bo'ladi?YUKLA r1, 10bo'lsa, 16 bitli chegara sabab nima sodir bo'ladi?QOSH r0, r1komandasini qo'lda kodlang (amal kodi 5).0x06120000sonini maydonlarga ajrating.- Faktorial izida halqa necha marta aylanganini sanang.
- Nol bayrog'i qaysi qadamda yonganini toping va sababini yozing.
- Fibonachchi dasturida
ITARvaTORTnima uchun kerakligini tushuntiring. CHAQIRqaytish manzilini registrda saqlasa, qanday muammo chiqardi?- "Stack overflow" xatosi qanday paydo bo'lishini yozing.
- 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:
CHAQIRmanzilni saqlaydi,QAYTtiklaydi. ITARvaTORTvaqtinchalik 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.