20-bo‘lim

Amaliy loyiha - o'z protsessoringiz

13-bo'limdagi mashinaga ikki o'tishli assembler yozish, nishonlar, xato xabarlari va butun zanjirni yopish.

🕑 8 daqiqa o‘qish 📄 1 057 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Nima qo'limizda bor
  2. Assembler
  3. Butun zanjirni sinash
  4. Xatolarni xabar qilish
  5. Xulosa
  6. Darslik yakunida

13-bo'limda virtual protsessor qurdik. Lekin dasturni unga qo'lda - har komandani alohida son qilib - yozdik.

19-bo'limda esa haqiqiy assemblerni ko'rdik. Endi o'zimiznikini yozamiz - va butun zanjir yopiladi:

assembler matni → assembler dasturi → mashina kodi → virtual protsessor → natija

Butun zanjir - yigirma bo'lim bir rasmda assembler matni YUKLA r0, 48 assembler mashina kodi 0x01000030 yukla() Mashina ol - dekodla - bajar natija [6] Har bo'g'in qaysi bo'limda qurilgan 20-bo'lim 10, 13-bo'lim 8, 9, 13-bo'lim - Mashina esa NAND elementidan (8-bo'lim) boshlab qurilgan edi Tranzistor -> NAND -> sumator -> ALU -> protsessor -> assembler -> dastur
Yigirma bo'lim - va zanjir yopildi

Nima qo'limizda bor #

13-bo'limdan bizda ikki narsa bor: 32 bitli komanda formati va uni bajaradigan mashina.

QismQayerda qurilgan
Mantiqiy elementlar va sumator8-bo'lim
Registrlar, ALU, bayroqlar9-bo'lim
Komanda sikli10-bo'lim
Komanda formati va mashina13-bo'lim

Yetishmayotgan yagona narsa - assembler. Uni shu bo'limda qo'shamiz.

Assembler #

Assembler ikki o'tishda ishlaydi - va buning aniq sababi bor.

Muammo: SAKRA halqa komandasi halqa nishoni qayerda ekanini bilishi kerak. Lekin nishon kodda keyinroq turishi mumkin.

Yechim: avval hamma nishonni topib chiqamiz, keyin komandalarni kodlaymiz.

Assembler nima uchun ikki marta o'qiydi ASSEMBLER MATNI YUKLA r0, 48 YUKLA r1, 18 halqa: SOLISH r1, r3 AGAR_NOL tugadi ^ tugadi qayerda? SAKRA halqa tugadi: TOXTA 1-O'TISH Faqat nishonlarni sanaydi Kod hali yozilmaydi "qaysi nishon qayerda?" 2-O'TISH Komandalarni kodlaydi Nishon o'rniga manzil qo'yadi endi hamma manzil ma'lum NISHONLAR JADVALI halqa → 3 tugadi → 13 1-o'tish natijasi 2-o'tishda ishlatiladi MASHINA KODI 0x01000030 ... Muammoning nomi: oldinga havola AGAR_NOL tugadi - bu komanda "tugadi" qayerdaligini bilishi kerak Lekin o'sha nishon kodda ANCHA KEYIN turibdi Yechim: avval hammasini sanab chiq, keyin kodla
Ikki o'tish - bu klassik muammoning eng sodda yechimi
Nima uchun aynan ikki o'tish?

Bu klassik muammo va uning nomi bor: oldinga havola (forward reference).

Natija
    SAKRA tugadi     ; tugadi qayerda? hali noma'lum
    ...
tugadi:              ; mana shu yerda

Yechimlar:

UsulIzoh
Ikki o'tishAvval nishonlar, keyin kod - eng sodda
Bir o'tish + tuzatishBo'sh qoldirib, oxirida to'ldirish

Birinchisi ancha tushunarli, shuning uchun o'quv assemblerlarida odatda o'sha tanlanadi.

Xuddi shu muammo haqiqiy assemblerlarda ham, bog'lovchida ham (19-bo'lim), hatto C dagi funksiya prototiplarida ham uchraydi.

Butun zanjirni sinash #

Endi haqiqiy dastur - assembler matnida yozilgan Evklid algoritmi:

Natija
; Ikki sonning eng katta umumiy bo'luvchisi (Evklid algoritmi)
    YUKLA r0, 48        ; birinchi son
    YUKLA r1, 18        ; ikkinchi son
    YUKLA r3, 0         ; taqqoslash uchun nol

halqa:
    SOLISH r1, r3       ; r1 nolmi?
    AGAR_NOL tugadi
    KOCHIR r2, r0       ; r2 = r0
ayirish:
    SOLISH r2, r1
    AGAR_KICHIK qoldiq
    AYIR r2, r1         ; r2 -= r1
    SAKRA ayirish
qoldiq:
    KOCHIR r0, r1       ; r0 = r1
    KOCHIR r1, r2       ; r1 = qoldiq
    SAKRA halqa

tugadi:
    CHIQAR r0
    TOXTA

Birinchi o'tish to'rtta nishonni topadi va ularning manzilini yozib oladi:

NishonManzil
halqa3
ayirish6
qoldiq10
tugadi13

Ikkinchi o'tish har qatorni mashina kodiga aylantiradi. Birinchi to'rttasi:

ManzilMashina kodiAssembler
00x01000030YUKLA r0, 48
10x01100012YUKLA r1, 18
20x01300000YUKLA r3, 0
30x0D130000SOLISH r1, r3

0x01000030 soniga diqqat bilan qarang:

Bo'lakQiymatMa'nosi
011YUKLA amali
00maqsad: r0
00manba ishlatilmaydi
003048yuklanadigan son

13-bo'limdagi format aynan shunday ishlaydi.

Dasturni mashinada ishga tushirsak:

Natija
Komandalar soni15
Bajarilgan qadamlar51
Chiqish6

48 va 18 ning eng katta umumiy bo'luvchisi haqiqatan 6.

Zanjir yopildi. Evklid algoritmi assembler matnida yozildi, nishonlar manzilga aylandi, komandalar sonlarga kodlandi va bizning protsessorimizda bajarildi.

Xatolarni xabar qilish #

Yaxshi assembler faqat ishlashi kerak emas - xatoni tushunarli aytishi ham kerak. Bizniki shunday xabarlar beradi:

Xato turiXabar
Noma'lum amal1-qator: noma'lum amal 'QOSHISH'
Noto'g'ri registr1-qator: 'r9' registr emas (r0-r3)
Topilmagan nishon1-qator: 'yoq_nishon' nishoni topilmadi
Takrorlangan nishon2-qator: 'boshi' takrorlandi

Har xabarda qator raqami bor - bu eng muhim qism. Usiz katta dasturda xatoni topish juda qiyin bo'lardi.

Xato xabari - vositaning eng muhim qismi

Kompilyator yoki assembler yozayotgan bo'lsangiz, xato xabarlariga kod yozgancha vaqt sarflang.

Yaxshi xabarda uchta narsa bo'ladi:

ElementMisol
Qayerda12-qator
Nima'r9' registr emas
To'g'risi qanday(r0-r3)

Uchinchisi ko'pincha unutiladi, lekin u eng foydali.

Rust kompilyatori aynan shu bilan mashhur bo'lgan: u nafaqat xatoni aytadi, balki tuzatishni ham taklif qiladi.

Bizning assemblerimizda tekshirilmagan joylar bor

O'quv kodi sifatida u yetarli, lekin jiddiy ishlatish uchun emas:

MuammoNima bo'ladi
YUKLA r0 (argument yetishmaydi)IndexError - tushunarsiz xato
YUKLA r0, 99999Qiymat 16 bitga sig'maydi, jimgina kesiladi
Dastur xotiradan kattaYuklashda IndexError
Nishon nomi amal bilan bir xilChalkashlik

Har biri uchun aniq tekshiruv va tushunarli xabar kerak.

Bu 12-bo'limdagi xulosaning davomi: past darajadagi vositalar hech narsani kechirmaydi, shuning uchun tekshiruvlarni o'zingiz qo'yishingiz kerak.

Amaliy topshiriqlarda shu tekshiruvlarni qo'shishni taklif qilamiz.

Amaliy topshiriq
  1. Evklid algoritmini qog'ozda 48 va 18 uchun qo'lda bajaring.
  2. 1071 va 462 uchun natijani hisoblang.
  3. Nishonlar jadvalini o'zingiz tuzib chiqing.
  4. SAKRA halqa komandasi qanday manzilga aylanishini toping.
  5. 0x01100012 sonini maydonlarga ajrating.
  6. KOCHIR r2, r0 komandasini qo'lda kodlang.
  7. Nima uchun bir o'tish yetarli emasligini tushuntiring.
  8. Bir o'tishli yechim qanday ishlashini o'z so'zingiz bilan yozing.
  9. Xato xabarida qator raqami nima uchun muhimligini ayting.
  10. Fibonachchi dasturini (13-bo'lim) assembler matnida yozib ko'ring.

Xulosa #

  • Assembler - matnni mashina kodiga aylantiradigan dastur.
  • U ikki o'tishda ishlaydi: avval nishonlar, keyin komandalar.
  • Sabab - oldinga havola: sakrash nishoni keyinroq turishi mumkin.
  • Xuddi shu muammo bog'lovchida va funksiya prototiplarida ham uchraydi.
  • Nishon - bu shunchaki manzilga berilgan nom.
  • Izohlar va bo'sh qatorlar kodlashdan oldin olib tashlanadi.
  • Xato xabarida qator raqami, sabab va to'g'ri shakl bo'lishi kerak.
  • Butun zanjir yopildi: matn → assembler → mashina kodi → protsessor.
  • Evklid algoritmi bizning mashinamizda 51 qadamda bajarildi.
  • O'quv vositasida tekshiruvlar kam - jiddiy ishlatishdan oldin ularni qo'shish shart.

Darslik yakunida #

Yigirma bo'lim oldin 0.1 + 0.2 nima uchun 0.3 bermasligi sir edi. Endi butun zanjirni ko'rasiz:

QadamBo'lim
Son bitlarga aylanadi2, 3, 5
Bitlar ustida amal bajariladi4
Amal mantiqiy elementlardan quriladi8
Element ALU ga, ALU protsessorga yig'iladi9
Komanda olinadi, dekodlanadi, bajariladi10
Komandalar to'plami ISA ni tashkil qiladi11, 12
Xotira ierarxiyasi tezlikni ta'minlaydi14, 15
Konveyer va parallellik yana tezlashtiradi16, 17
Tashqi dunyo uzilishlar orqali ulanadi18
Kod kompilyatordan o'tib mashina kodiga aylanadi19

Va o'z protsessoringizni qurdingiz - NAND elementidan boshlab, assemblergacha.

Bundan keyin qayerga borish mumkin:

  • "Operatsion tizimlar" - shu apparat ustida OT qanday ishlaydi;
  • "Kompyuter tarmoqlari" - mashinalar qanday gaplashadi;
  • "Algoritmlar va ma'lumotlar tuzilmasi" - endi Big-O ni kesh bilan birga o'qing;
  • "Zamonaviy C++" yoki "Go" - past darajaga yaqin tillar.

Kompyuter sehrli quti emas. Bu - mantiqiy elementlar, registrlar va juda ko'p qatlam. Endi ularning hammasini bilasiz.

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.