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.

🕑 8 daqiqa o‘qish 📄 1 207 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Ikki falsafa
  2. Haqiqiy x86 komandalarining uzunligi
  3. Manzillash usullari
  4. Xulosa

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.

Ikki falsafa CISC murakkab komandalar add rax, [xotira] komanda XOTIRAGA tegishi mumkin uzunligi 1-15 bayt dekodlash murakkab x86-64 RISC sodda komandalar ld x1, m | add x3, x1, x2 faqat ld/sd xotiraga tegadi uzunligi doim 4 bayt dekodlash sodda va tez ARM, RISC-V Bugun chegara yo'qolgan: x86 ichkarida komandalarni mikro-amallarga bo'ladi
Bahs tugagan - haqiqiy farq endi quvvat sarfida va litsenziyada

a = b + c amalini ikki uslubda yozamiz.

CISC (x86 uslubi) - komanda xotiraga to'g'ridan-to'g'ri murojaat qila oladi:

KomandaHajmiNima qiladi
mov rax, [b]7 baytxotiradan registrga
add rax, [c]7 baytxotira bilan qo'shish
mov [a], rax7 baytregistrdan xotiraga
Jami21 bayt3 ta komanda

RISC (RISC-V uslubi) - faqat yuklash va saqlash komandalari xotiraga tegadi:

KomandaHajmiNima qiladi
ld x1, b4 baytxotiradan registrga
ld x2, c4 baytxotiradan registrga
add x3, x1, x24 baytfaqat registrlar ustida
sd x3, a4 baytregistrdan xotiraga
Jami16 bayt4 ta komanda

Farqni solishtiring:

CISCRISC
Komandalar soni34
Kod hajmi21 bayt16 bayt
Dekodlashmurakkabsodda
Xotiraga kim tegadiistalgan komandafaqat 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:

Terminal
objdump -d /bin/ls | head -40
UzunligiBaytlariKomanda
1 bayt90nop
2 bayt31 c0xor eax, eax
2 baytb0 05mov al, 5
3 bayt83 c0 01add eax, 1
3 bayt48 01 d8add rax, rbx
5 baytbb 78 56 34 12mov ebx, 0x12345678
7 bayt48 69 c3 e8 03 00 00imul rax, rbx, 1000
10 bayt48 b8 88 77 66 ...movabs rax, 0x1122...
1 baytc3ret

Eng qisqasi 1 bayt, eng uzuni 10 bayt. Bu - CISC ning asosiy belgisi.

O'zgaruvchan uzunlik nima uchun qiyin

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:

UsulYozuvMa'nosi
Bevositamov rax, 5Qiymat komandaning o'zida
Registrmov rax, rbxRegistrdan
To'g'ridan-to'g'rimov rax, [100]Aniq manzildan
Bilvositamov rax, [rbx]Registrda turgan manzildan
Indekslimov rax, [rbx+8]Manzil + siljish
Masshtablimov 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.

Bahs tugagan, lekin javob "ikkalasi ham"

1990-yillarda "RISC yoki CISC" bahsi qizg'in edi. Bugun javob aniq: chegara yo'qoldi.

Nima bo'ldiNatija
x86 ichkarida mikro-amallarga bo'linadiIchkarida RISC
ARM ga murakkab komandalar qo'shildiSof RISC emas
Ikkalasi ham konveyer va spekulyatsiya ishlatadiBir xil usullar

Bugungi haqiqiy farq boshqa joyda:

OmilTa'siri
Quvvat sarfiARM samaraliroq - telefon va noutbukda muhim
LitsenziyaARM va RISC-V ochiqroq
Dasturiy merosx86 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.

ISA o'zgarmasligi - va'da, lekin cheklov ham

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.

Amaliy topshiriq
  1. CISC va RISC yondashuvlarini jadval qilib solishtiring.
  2. Nima uchun RISC da komandalar ko'proq, lekin kod kichikroq?
  3. "Yuklash-saqlash arxitekturasi" nimani anglatishini yozing.
  4. objdump -d /bin/ls | head -40 ni bajaring.
  5. Chiqishdan eng qisqa va eng uzun komandani toping.
  6. O'zgaruvchan uzunlik dekodlashni nima uchun qiyinlashtiradi?
  7. Zamonaviy x86 bu muammoni qanday hal qilishini tushuntiring.
  8. Manzillash usullarining har biriga bittadan misol yozing.
  9. massiv[i] qanday manzillash usuliga aylanishini tushuntiring.
  10. 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/sd xotiraga tegadi.
  • Haqiqiy x86 komandalari 1 dan 15 baytgacha bo'ladi.
  • 48 prefiksi - 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.

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.