مقایسه معماری‌های مجموعه دستورالعمل‌ها

"این مقاله در حال ترجمه از ویکی انگلیسی است
لطفا حذف نشود." معماری مجموعه‌دستورالعمل‌ها (ISA) یک مدل انتزاعی از رایانه است و در واقع همان چیزی است که معمولاً به آن «معماری رایانه» می‌گویند. نسخهٔ عملی یک ISA را «پیاده‌سازی» می‌نامند یک ISA می‌تواند چندین پیاده‌سازی متفاوت داشته باشد؛ پیاده‌سازی‌هایی که ممکن است از نظر کارایی، اندازهٔ فیزیکی و هزینه و چیزهای دیگر با هم فرق کنن از آن‌جا که ISA نقش رابط میان نرم‌افزار و سخت‌افزار را داره هر نرم‌افزاری که برای یک ISA نوشته یا ترجمه شده باشند می‌تواند روی همهٔ پیاده‌سازی‌های مختلف آن ISA اجرا کنن همین ویژگی باعث شده تا سازگاری دودویی میان نسل‌های مختلف رایانه‌ها به‌سادگی امکان‌پذیر شود و خانواده‌های رایانه‌ای شکل بگیرند. این دو موضوع هم هزینهٔ رایانه‌ها را پایین آورده‌اند و هم دامنهٔ کاربرد آن‌ها را گسترده‌تر کرد.
ISA یا همون معماریِ مجموعه‌دستورهایی است که همه چیز هایی رو مشخص می‌کنه که یه برنامه‌نویس زبان ماشین باید بدونه تا بتونه با اون سیستم یا لپتاپش کار کنه اینکه چی رو تعریف میکنه بین ISAهای مختلف فرق داره ولی معمولاً مواردی مثل نوع داده‌هایی که پشتیبانی می‌شن، وضعیت‌هایی که دستگاه داره (مثل حافظهٔ اصلی و رجیسترها) و رفتار اون‌ها مدل همخوانی حافظه و روش‌های آدرس‌دهی خود مجموعه دستورهای ماشین و همین‌طور مدل ورودی/خروجی رو تعیین می‌کنن.

## نمایش داده‌ها
تو دهه‌های اولیهٔ محاسبات، کامپیوترهایی وجود داشتن که از سیستم‌های دوگانه، ده‌دهی و حتی سه‌تایی (ترنری) استفاده می‌کردن، اما امروزه کامپیوترهای مدرن تقریباً به‌طور کامل دوگانه **(باینری)** هستن.

کاراکترها معمولاً به صورت یه رشته از بیت‌ها یا ارقام رمزگذاری می‌شن، و این کار با انواع مختلف **مجموعه‌ کاراکتر** انجام می‌شه. جالب اینه که حتی توی یه شرکت هم ممکن بود هر دستگاه از یه مجموعه کاراکتر متفاوت استفاده کنه.

اعداد صحیح معمولاً با روش‌های مختلفی کدگذاری می‌شن، مثل علامت-قدر مطلق، مکمل یک، مکمل دو، جبران دودویی، مکمل نه و مکمل ده.

اعداد اعشاریِ شناور هم با روش‌های مختلفی رمزگذاری می‌شن؛ یعنی برای علامت، توان و مانتیسا هر معماری ممکنه شیوهٔ خودش رو داشته باشه. توی کامپیوترهای امروزی، قالب‌های **شناور هگزای IBM** و **IEEE 754** تقریباً جای بیشتر قالب‌های قدیمی رو گرفتن و عملاً استاندارد شده‌ان.

نشانی‌ها معمولاً یه عددِ بدون علامت هستن که از ترکیب چند چیز به‌وجود میان: یه بخشی از خودِ دستور، یه مقدار از رجیسترها و یه مقدار هم از حافظه. این‌که دقیقاً چطور ساخته می‌شن، بستگی به معماریِ پردازنده داره و توی هر معماری فرق می‌کنه.

### بیت‌ها
معماری‌های کامپیوتر معمولاً با n بیت شناخته می‌شن. توی سه‌چهارم اول قرن بیستم، n معمولاً ۱۲، ۱۸، ۲۴، ۳۰، ۳۶، ۴۸ یا ۶۰ بود. توی یک‌سوم آخر قرن بیستم، n بیشتر ۸، ۱۶ یا ۳۲ بود، و توی قرن بیست و یکم معمولاً ۱۶، ۳۲ یا ۶۴ هست، البته اندازه‌های دیگه هم بوده (مثل ۶، ۳۹، ۱۲۸).

البته این یه ساده‌سازی هست، چون معماری‌های کامپیوتر معمولاً چند اندازهٔ دادهٔ «طبیعی» دیگه هم توی مجموعه دستورها دارن، ولی نحوهپیاده‌سازی سخت‌افزاری‌شون می‌تونه کاملاً متفاوت باشه.

خیلی از معماری‌ها دستورهایی دارن که توی بعضی پیاده‌سازی‌ها، روی نصف یا دو برابر اندازهٔ مسیرهای دادهٔ اصلی پردازنده کار می‌کنن. نمونه‌هاش Z80، MC68000 و IBM System/360 هست. توی این مدل‌ها، یه دستور با اندازهٔ دوبرابر معمولاً تقریباً دو برابر سیکل ساعت طول می‌کشه (البته توی پیاده‌سازی‌های با عملکرد بالا این طور نیست).

مثلاً روی 68000، یعنی یه دستور دوبرابر اندازه، ۸ سیکل ساعت طول می‌کشه به جای ۴، و به همین دلیل می‌تونیم بگیم این تراشه یه معماری ۳۲ بیتی با پیاده‌سازی ۱۶ بیتی داره.

مجموعه دستورهای IBM System/360 هم ۳۲ بیتی هستن، ولی بعضی مدل‌ها، مثل System/360 Model 30، مسیر دادهٔ داخلی کوچکتری دارن و بعضی مدل‌ها، مثل 360/195، مسیر داده داخلی بزرگ‌تری دارن.

عرض باس دادهٔ خارجی، برای تعیین عرض معماری استفاده نمی‌شه. مثلا NS32008، NS32016 و NS32032 در واقع همون تراشهٔ ۳۲ بیتی بودن، فقط باس دادهٔ خارجی‌شون فرق داشت. یا PowerPC 604 شرکت IBM، باس ۶۴ بیتی داره ولی رجیسترهاش فقط ۳۲ بیتی هستن. پردازنده‌های System/360 و بعضی میکروپروسسورهای اولیهٔ ۳۲ بیتی، مثل Motorola 68000، آدرس‌های ۲۴ بیتی داشتن.

### ارقام
تو سه‌چهارم اول قرن بیستم، کامپیوترهای ده‌دهی (decimal) که روی **کلمه‌ها** کار می‌کردن، معمولاً کلمه‌هایی با ۱۰ رقم داشتن و یه علامت جدا هم برای هر عدد داشتند. توی اعداد صحیح همهٔ ده رقم استفاده می‌شد و توی اعداد اعشاری شناور، برای توان‌ها دو رقم در نظر گرفته می‌شد.

### اندیان
یه معماری می‌تونه از **بزرگ‌اندین** یا **کوچک‌اندین** استفاده کنه، یا هر دو، یا طوری طراحی شده باشه که بشه بینشون سوئیچ کرد.

تو پردازنده‌های **کوچک‌اندین**، بایت‌ها تو حافظه طوری چیده می‌شن که **کم‌ارزش‌ترین بایت** یه عدد چندبایتی تو **کم‌ترین نشانی حافظه** قرار بگیره.

تو معماری‌های **بزرگ‌اندین** برعکس، **پرارزش‌ترین بایت** تو **کم‌ترین نشانی حافظه** قرار می‌گیره.

معماری x86 و چند معماری ۸ بیتی **کوچک‌اندین** هستن. بیشتر معماری‌های RISC مثل SPARC، Power، PowerPC و MIPS اولشون **بزرگ‌اندین** بودن (ARM **کوچک‌اندین** بود)، اما الان خیلی از اون‌ها — از جمله ARM — طوری ساخته شدن که بشه بین این دو حالت انتخاب کرد.

مبحث **اندین بودن** فقط برای پردازنده‌هایی مطرحه که اجازه می‌دن **واحدهای کوچکتر داده** (مثل بایت‌ها) جداگانه آدرس‌دهی بشن، اونم وقتی که این واحدها از بعضی فرمت‌های داده‌ای کوچیک‌تر باشن

## قالب‌های دستورالعمل

### کدهای عملیاتی
تو بعضی معماری‌ها، هر دستور فقط یه کد عملیاتی (opcode) داره. اما تو بعضی دیگه، بعضی دستورها علاوه بر opcode، یه یا چند **اصلاح‌کننده** هم دارن.

مثلاً تو IBM System/370، بایت ۰ کد عملیاتی هست، اما وقتی بایت ۰ برابر B2 باشه، بایت ۱ دستور خاصی رو مشخص می‌کنه. مثلا B205 یعنی دستور **ذخیرهٔ ساعت (STCK)**.

تو بعضی معماری‌های مجموعه‌دستور، از یه یا چند **پیشوند کد عملیاتی** استفاده می‌کنن تا کد بعدی رو تغییر بدن یا تعداد کدهای عملیاتی موجود رو زیاد کنن.

### عملوندها

#### حالت‌های آدرس‌دهی
معماری‌ها معمولا به دستورالعمل‌ها اجازه می‌دهند که ترکیبی از حالت‌های ادرس‌دهی عملوند را نیز شامل شوند.

; مستقیم
: دستورالعمل، یک آدرس کامل را مشخص می‌کند
; فوری
: این دستورالعمل به جای یک آدرس، یک مقدار را مشخص می‌کند.
;
: این دستورالعمل، یک ثبات را برای استفاده به عنوان اندیس مشخص می‌کند. در برخی معماری‌ها، اندیس با طول عملوند مقیاس‌بندی می‌شود.
; غیرمستقیم
: این دستورالعمل، مکان یک کلمه اشاره‌گر را که عملوند را توصیف می‌کند، مشخص می‌کند و احتمالاً شامل چندین سطح از اندیس‌گذاری و غیرمستقیم‌سازی است.
;
: دستورالعمل، بیت‌های مرتبه پایین را مشخص می‌کند و یک رجیستر، بیت‌های مرتبه بالا را فراهم می‌کند.
; جابجایی پایه
: این دستورالعمل، جابجایی از یک آدرس در یک ثبات را مشخص می‌کند.
;
: یک ثبات که برای اندیس‌گذاری استفاده می‌شود، یا یک کلمه اشاره‌گر که توسط آدرس‌دهی غیرمستقیم استفاده می‌شود، به اندازه ۱، اندازه عملوند یا دلتای صریح افزایش یا کاهش می‌یابند

پردازنده‌های برداری (Vector) حالت‌های اضافه‌ای هم دارن که مخصوص **عملیات روی تک‌تک عناصر** هستن.

#### تعداد عملوندها
تعداد عملوندها یکی از عوامل اصلی ای است که می‌تواند نشان‌دهنده‌ی عملکرد مجموعه دستورالعمل‌ها باشد و  معماری سه عملوندی (۲ ورودی، ۱ خروجی) این امکان را ممکن میسازد
 الف := ب + ج
در یک دستورالعمل محاسبه شود
 B، C، A را اضافه کنید
در یک معماری کامپیوتری دو عملوندی (1 ورودی، 1 ورودی و 1 خروجی) این امکان را میسر میسازد
 الف := الف + ب
در یک دستورالعمل محاسبه شود
 اضافه کردن B، A
اما مستلزم آن است که
 الف := ب + ج
در دو دستورالعمل انجام شود
 حرکت B، A
 اضافه کردن C، A

### طول کدگذاری
همون‌طور که توی جدول پایین می‌بینی، بعضی از مجموعه‌دستورا کاملاً ساده و ثابت‌اند؛ یعنی طول کد همه‌ی دستورها یکی‌ست. بعضی دیگه اما متغیرند و هر دستور ممکنه چند بایت جور واجور بگیره. معمولاً همین RISCها هستن که سرِ ثابت دوست دارن و CISCها دل‌شان طول متغیر می‌خواهد؛ ولی استثنا هم همیشه هست

## مجموعه دستورالعمل‌ها
جدول زیر اطلاعات اولیه مربوط به مورد معماری‌های مجموعه دستورالعمل‌ها را مقایسه می‌کنه.

یادداشت‌ها:

* معمولاً تعداد ثبات‌ها توانی از دو است، مثلاً ۸، ۱۶، ۳۲. در برخی موارد، یک شبه ثباتِ سخت‌افزاری تا صفر، به عنوان "بخشی" از فایل‌های ثبات معماری‌ها، عمدتاً برای ساده‌سازی حالت‌های اندیس‌گذاری، گنجانده می‌شود. ستون "ثبات‌ها" فقط "ثبات‌های" صحیح قابل استفاده توسط دستورالعمل‌های عمومی در هر لحظه را می‌شمارد. معماری‌ها همیشه شامل ثبات‌های خاص‌منظوره مانند شمارنده برنامه (PC) هستند. این ثبات‌ها شمارش نمی‌شوند مگر اینکه ذکر شوند. توجه داشته باشید که برخی معماری‌ها، مانند SPARC، دارای پنجره‌های ثبات هستند. برای این معماری‌ها، تعداد نشان می‌دهد که چه تعداد ثبات در یک پنجره ثبات موجود است. همچنین، ثبات‌های غیر معماری برای تغییر نام ثبات شمارش نمی‌شوند.
* در ستون «نوع»، «ثبت–ثبت» مترادف با نوع رایج معماری « بارگذاری–ذخیره » است، به این معنی که هیچ دستورالعملی نمی‌تواند مستقیماً به حافظه دسترسی داشته باشد، مگر برخی موارد خاص، یعنی بارگذاری در یا ذخیره از ثبات(ها)، به استثنای دستورالعمل‌های قفل حافظه برای عملیات اتمی.
* در ستون «Endianness»، «Bi» به این معنی است که endianness قابل تنظیم است.

## همچنین ببینید

* واحد پردازش مرکزی (CPU)
* طراحی پردازنده
* مقایسه ریزمعماری‌های پردازنده
* معماری مجموعه دستورالعمل‌ها
* ریزپردازنده
* بنچمارک (محاسبات)

## یادداشت‌ها

## منابع

رده:معماری رایانه
رده:معماری‌های مجموعه دستورالعمل