11-bo‘lim
Komandalar to'plami (ISA)
ISA nima, RISC va CISC farqi, haqiqiy x86 komandalarining uzunligi, manzillash usullari va nima uchun ARM bugun yutmoqda.
Ushbu bo‘lim mundarijasi
Komandalar to'plami (Instruction Set Architecture, ISA) - bu protsessor tushunadigan barcha komandalar ro'yxati va ularning kodlanishi.
Bu 1-bo'limdagi "arxitektura" so'zining aniq ma'nosi: ISA - apparat va dastur o'rtasidagi shartnoma.
Ikki falsafa #
1970-yillarda xotira qimmat va kompilyatorlar zaif edi. Shuning uchun protsessorlarga murakkab, kuchli komandalar qo'yishardi - bitta komanda ko'p ish qilsin.
Bu yo'nalish keyinchalik CISC deb ataldi.
1980-yillarda savol tug'ildi: bu komandalar haqiqatan ishlatiladimi? Tadqiqotlar ko'rsatdiki, kompilyatorlar ularning ko'pini umuman ishlatmaydi.
Shunday qilib RISC paydo bo'ldi: kam sonli, sodda, bir xil uzunlikdagi komandalar.
a = b + c amalini ikki uslubda yozamiz.
CISC (x86 uslubi) - komanda xotiraga to'g'ridan-to'g'ri murojaat qila oladi:
| Komanda | Hajmi | Nima qiladi |
|---|---|---|
mov rax, [b] | 7 bayt | xotiradan registrga |
add rax, [c] | 7 bayt | xotira bilan qo'shish |
mov [a], rax | 7 bayt | registrdan xotiraga |
| Jami | 21 bayt | 3 ta komanda |
RISC (RISC-V uslubi) - faqat yuklash va saqlash komandalari xotiraga tegadi:
| Komanda | Hajmi | Nima qiladi |
|---|---|---|
ld x1, b | 4 bayt | xotiradan registrga |
ld x2, c | 4 bayt | xotiradan registrga |
add x3, x1, x2 | 4 bayt | faqat registrlar ustida |
sd x3, a | 4 bayt | registrdan xotiraga |
| Jami | 16 bayt | 4 ta komanda |
Farqni solishtiring:
| CISC | RISC | |
|---|---|---|
| Komandalar soni | 3 | 4 |
| Kod hajmi | 21 bayt | 16 bayt |
| Dekodlash | murakkab | sodda |
| Xotiraga kim tegadi | istalgan komanda | faqat ld va sd |
Oxirgi qator eng muhimi. Shuning uchun RISC ni "yuklash-saqlash arxitekturasi" deb atashadi.
Diqqat qiling: CISC kamroq komanda ishlatdi, lekin ko'proq bayt egalladi. Bu kutilmagan bo'lishi mumkin - odatda CISC ixchamroq deb o'ylashadi.
Sabab: x86 da xotira operandi bilan ishlaydigan komanda uzun kodlanadi. Qisqa x86 komandalari ham bor, lekin bu misolda emas.
Haqiqiy x86 komandalarining uzunligi #
Endi nazariyani tekshiramiz. Quyidagi jadval - haqiqiy x86-64 komandalarining kodlangan baytlari. Ularni o'zingiz ham ko'rishingiz mumkin:
objdump -d /bin/ls | head -40
| Uzunligi | Baytlari | Komanda |
|---|---|---|
| 1 bayt | 90 | nop |
| 2 bayt | 31 c0 | xor eax, eax |
| 2 bayt | b0 05 | mov al, 5 |
| 3 bayt | 83 c0 01 | add eax, 1 |
| 3 bayt | 48 01 d8 | add rax, rbx |
| 5 bayt | bb 78 56 34 12 | mov ebx, 0x12345678 |
| 7 bayt | 48 69 c3 e8 03 00 00 | imul rax, rbx, 1000 |
| 10 bayt | 48 b8 88 77 66 ... | movabs rax, 0x1122... |
| 1 bayt | c3 | ret |
Eng qisqasi 1 bayt, eng uzuni 10 bayt. Bu - CISC ning asosiy belgisi.
Protsessor xotiradan baytlarni o'qiydi. Lekin keyingi komanda qayerdan boshlanishini bilish uchun avvalgisining uzunligini bilishi kerak.
RISC da bu muammo yo'q: har komanda aynan 4 bayt, demak keyingisi har doim 4 bayt naridan boshlanadi. Protsessor bir vaqtda o'nlab komandani parallel dekodlashi mumkin.
x86 da esa uzunlikni bilish uchun komandani qisman o'qib chiqish kerak. Bu dekodlashni ancha qiyinlashtiradi.
Zamonaviy x86 protsessorlari buni shunday hal qiladi: ular murakkab komandalarni ichkarida sodda mikro-amallarga ajratadi va keyin ular ustida RISC kabi ishlaydi.
Ya'ni bugungi x86 - tashqaridan CISC, ichkaridan RISC.
Bu haqiqiy baytlar - ular protsessorga aynan shunday yetkaziladi.
E'tibor bering: nop bitta bayt, movabs esa o'n bayt.
RISC-V da har komanda aynan to'rt bayt bo'lardi.
48 prefiksi nima?Ko'p qatorlar 48 bilan boshlanadi. Bu REX prefiksi -
u "bu komanda 64 bitli registrlar bilan ishlaydi" degani.
x86 ning tarixi shunday: u 16 bitdan boshlangan, keyin 32 bitga, keyin 64 bitga kengaygan. Har kengayish eski kodlash bilan mos qolishi kerak edi.
Natijada prefikslar, maxsus holatlar va istisnolar to'planib qoldi.
RISC-V esa 2010-yilda noldan ishlab chiqilgan - shuning uchun u ancha toza. Lekin uning ortida qirq yillik dasturiy ta'minot ham yo'q.
Bu muhandislikdagi doimiy savdo: tozalik yoki moslik.
Manzillash usullari #
Komanda operandni qayerdan olishini bildiradigan usullar:
| Usul | Yozuv | Ma'nosi |
|---|---|---|
| Bevosita | mov rax, 5 | Qiymat komandaning o'zida |
| Registr | mov rax, rbx | Registrdan |
| To'g'ridan-to'g'ri | mov rax, [100] | Aniq manzildan |
| Bilvosita | mov rax, [rbx] | Registrda turgan manzildan |
| Indeksli | mov rax, [rbx+8] | Manzil + siljish |
| Masshtabli | mov rax, [rbx+rcx*8] | Massiv elementi uchun |
Oxirgisi ayniqsa qiziq: massiv[i] degan kod aynan shunga
aylanadi. *8 - element hajmi.
x86 da bu usullarning hammasi bor. RISC-V da esa faqat dastlabki uchtasi - qolganini bir necha komanda bilan yig'ish kerak.
1990-yillarda "RISC yoki CISC" bahsi qizg'in edi. Bugun javob aniq: chegara yo'qoldi.
| Nima bo'ldi | Natija |
|---|---|
| x86 ichkarida mikro-amallarga bo'linadi | Ichkarida RISC |
| ARM ga murakkab komandalar qo'shildi | Sof RISC emas |
| Ikkalasi ham konveyer va spekulyatsiya ishlatadi | Bir xil usullar |
Bugungi haqiqiy farq boshqa joyda:
| Omil | Ta'siri |
|---|---|
| Quvvat sarfi | ARM samaraliroq - telefon va noutbukda muhim |
| Litsenziya | ARM va RISC-V ochiqroq |
| Dasturiy meros | x86 da o'nlab yillik dastur bor |
Apple 2020-yilda Mac larni ARM ga o'tkazdi va bu ishladi - chunki masala komandalar to'plamida emas, butun tizim samaradorligida edi.
Eski dastur yangi protsessorda ishlashi - ISA ning asosiy qadriyati.
Lekin buning narxi bor: hech narsani olib tashlab bo'lmaydi.
x86 da bugun ham 1978-yilgi 16 bitli rejim bor. Hech kim ishlatmaydi, lekin har chipda tranzistorlar sarflanadi.
Intel 2023-yilda eski rejimlarni olib tashlashni taklif qildi (X86S loyihasi) - qirq yildan keyin.
Bu 1-bo'limdagi fon Neyman arxitekturasi bilan bir xil hikoya: dastlabki tanlov o'nlab yillarga qoladi. Shuning uchun arxitektura loyihalash - eng uzoq muddatli qaror.
- CISC va RISC yondashuvlarini jadval qilib solishtiring.
- Nima uchun RISC da komandalar ko'proq, lekin kod kichikroq?
- "Yuklash-saqlash arxitekturasi" nimani anglatishini yozing.
objdump -d /bin/ls | head -40ni bajaring.- Chiqishdan eng qisqa va eng uzun komandani toping.
- O'zgaruvchan uzunlik dekodlashni nima uchun qiyinlashtiradi?
- Zamonaviy x86 bu muammoni qanday hal qilishini tushuntiring.
- Manzillash usullarining har biriga bittadan misol yozing.
massiv[i]qanday manzillash usuliga aylanishini tushuntiring.- Telefoningiz va kompyuteringiz qaysi arxitekturada ishlashini toping.
Xulosa #
- ISA - apparat va dastur o'rtasidagi shartnoma: komandalar va ularning kodlanishi.
- CISC: kam komanda, lekin murakkab; komanda xotiraga murojaat qila oladi.
- RISC: ko'p komanda, lekin sodda va bir xil uzunlikda.
- RISC ni yuklash-saqlash arxitekturasi deyishadi: faqat
ld/sdxotiraga tegadi. - Haqiqiy x86 komandalari 1 dan 15 baytgacha bo'ladi.
48prefiksi - REX, u 64 bitli rejimni bildiradi; bu moslik merosi.- Manzillash usullari operandni qayerdan olishni belgilaydi.
massiv[i]masshtabli indeksli manzillashga aylanadi.- Bugun RISC va CISC chegarasi yo'qolgan - x86 ichkarida mikro-amallarga bo'linadi.
- ISA ni o'zgartirib bo'lmaydi: bir marta qo'shilgan komanda abadiy qoladi.
Keyingi bo'limda assembler tilida haqiqiy dastur yozamiz va uni ishga tushiramiz.
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.