ام‌میکس

**ام‌میکس**  یک معماری ریسک (کامپیوتر با مجموعه دستورالعمل کاهش‌یافته) ۶۴-بیتی است که توسط دونالد کنوث طراحی شده است. این طراحی با مشارکت های چشمگیر جان ال. هنسی (که در طراحی معماری میپس سهیم بود) و ریچارد ال. سایتس (معمار معماری آلفا) تکمیل شده است.

کنوث در مورد ام‌میکس چنین بیان کرده است:"ام‌میکس کامپیوتری است که هدف آن تشریح جنبه‌های سطح ماشینی برنامه‌نویسی است. این ماشین در کتاب‌ *[[هنر برنامه‌نویسی رایانه]]* من، جایگزین MIX شده است؛ ماشینی که در دهه ۱۹۶۰ میلادی چنین نقشی را ایفا می‌کرد… من تلاش کردم ام‌میکس را به گونه‌ای طراحی کنم که زبان ماشین آن ساده، زیبا و آسان برای یادگیری باشد. در عین حال، دقت کردم تا تمامی پیچیدگی‌های لازم برای دستیابی به عملکرد بالا در عمل را شامل شود، به طوری که ام‌میکس اصولاً قابل ساخت باشد و حتی شاید بتواند با برخی از سریع‌ترین کامپیوترهای عمومی موجود در بازار رقابت کند."کنوث طراحی ام‌میکس را در سال ۱۹۹۹ آغاز کرد و نسخه پایدار آن را در سال ۲۰۱۱ منتشر نمود. این پردازنده با شماره "۲۰۰۹" نام‌گذاری شده است و کنوث توضیح می‌دهد که این عدد، میانگین حسابی اعداد سایر معماری‌های کامپیوتری است؛ همچنین "MMIX" در اعداد رومی نیز همین عدد را نشان می‌دهد.

## معماری ام‌میکس
ام‌میکس یک معماری big-endian ۶۴-بیتی ریسک است که دارای ۲۵۶ **رجیستر ۶۴-بیتی چندمنظوره**، ۳۲ **رجیستر ۶۴-بیتی خاص‌منظوره**، دستورالعمل‌های ۳۲-بیتی با طول ثابت و یک فضای آدرس مجازی ۶۴-بیتی می‌باشد. مجموعه دستورالعمل ام‌میکس شامل ۲۵۶ اپ‌کد است که یکی از آن‌ها برای توسعه‌های آتی رزرو شده است. ام‌میکس همچنین از اعداد ممیز شناور IEEE 754 استفاده می‌کند.

### دستورالعمل‌ها
تمامی دستورالعمل‌ها یک نام اختصاری (mnemonic) مرتبط دارند. به عنوان مثال، دستورالعمل شماره ۲۰ (۳۲ دهدهی) با `ADD` مرتبط است. بیشتر دستورالعمل‌ها فرم نمادین  را دنبال می‌کنند، که در آن  نوع دستورالعمل، `X` رجیستری که برای ذخیره نتیجه استفاده می‌شود و مابقی فیلدها عملوندهای دستورالعمل را مشخص می‌کنند. هر یک از این فیلدها ۸ بیت عرض دارند. برای مثال،  به معنای "رجیستر $0 را برابر با مجموع $1 و ۳ قرار بده" است.

اکثر دستورالعمل‌ها می‌توانند مقادیر فوری (immediate values) یا محتویات رجیستر را بپذیرند؛ از این رو، یک نام اختصاری دستورالعمل ممکن است به یکی از دو اپ‌کد (opcode) مرتبط باشد.

برنامه‌های ام‌میکس معمولاً با استفاده از زبان اسمبلی MMIXAL نوشته می‌شوند. در ادامه یک برنامه ساده MMIXAL آورده شده است که رشته "سلام دنیا!" را چاپ می‌کند:

```text
LOC    #100                  % آدرس شروع برنامه را 
                                     % 0x100 قرار میدهد

Main    GETA  $255,string          % آدرس رشته را
                                     % در رجیستر 255 قرار می‌دهد

        TRAP  0,Fputs,StdOut       % رشته‌ای که رجیستر 255 به آن اشاره می‌کند را
                                     % به خروجی استاندارد می‌نویسد.

        TRAP  0,Halt,0             % فرایند را خاتمه می‌دهد.

string  BYTE  "Hello, world!",#a,0   % رشته‌ای که باید چاپ شود. #a
                                     % کاراکتر خط جدید است و 0 رشته را
                                     % به اتمام می‌رساند.
```


### رجیسترها
در یک تراشه ام‌میکس ، ۲۵۶ **رجیستر معماری چندمنظوره** (با نام‌های $0 تا $255) و ۳۲ **رجیستر معماری خاص‌منظوره** وجود دارد که به طور مستقیم قابل آدرس‌دهی هستند. رجیسترهای خاص‌منظوره را می‌توان با دستورات `GET` و `PUT` دسترسی پیدا کرد.
دو رجیستر خاص، **rL** و **rG**، تعیین می‌کنند که کدام یک از رجیسترهای عمومی، **محلی (local)** و کدام یک **سراسری (global)** هستند. تمام رجیسترهای از $0 تا $(rL − 1)، رجیسترهای محلی هستند و یک پنجره را به یک پشته داخلی از رجیسترها نمایش می‌دهند. رجیسترهای از [rL] تا $(rG − 1) "رجیسترهای حاشیه‌ای" نامیده می‌شوند؛ اگر به عنوان منبع در یک عملیات استفاده شوند، همیشه 0 را برمی‌گردانند. استفاده از یک رجیستر حاشیه‌ای به عنوان مقصد یک عملیات، باعث می‌شود که ماشین به طور خودکار rL را افزایش دهد تا آن رجیستر را شامل شود. تمام رجیسترهای [rG] تا $255، رجیسترهای سراسری نامیده می‌شوند و بخشی از پشته رجیستر نیستند.

#### پشته رجیستر محلی
پشته رجیستر محلی** به هر زیربرنامه (subroutine) به اندازه `rL` رجیستر محلی (با نام‌های $0 تا $(rL − 1)) اختصاص می‌دهد. هرگاه یک زیربرنامه فراخوانی شود، تعدادی از رجیسترهای محلی به پایین پشته رانده می‌شوند (با تغییر نقطه شروع پنجره). آرگومان‌های زیربرنامه فراخوانی شده در رجیسترهای محلی باقی‌مانده قرار می‌گیرند. هنگامی که یک زیربرنامه به پایان می‌رسد، رجیسترهای قبلاً رانده شده را از پشته بیرون می‌کشد. از آنجا که پشته داخلی تنها می‌تواند تعداد محدودی رجیستر را در خود جای دهد، ممکن است لازم باشد بخشی از پشته در حافظه ذخیره شود. این عمل با استفاده از رجیسترهای خاص **rO** و **rS** پیاده‌سازی می‌شود که کدام بخش از پشته رجیستر محلی در حافظه و کدام بخش هنوز در رجیسترهای فیزیکی محلی قرار دارد را ثبت می‌کنند. پشته رجیستر، اتصال سریع زیربرنامه را فراهم می‌کند.

#### رجیسترهای خاص
۳۲ رجیستر فیزیکی معماری خاص به شرح زیر هستند:
* **rB، رجیستر بوت‌استرپ (trip)**
: هنگام رخ دادن "تریپ" (tripping)، `rB` مقدار $255 را می‌گیرد و $255 مقدار `rJ` را. بدین ترتیب `rJ` در یک رجیستر  عمومی ذخیره می‌شود.
* **rD، رجیستر مقسوم**
: تقسیم عدد صحیح بدون علامت، از این رجیستر به عنوان نیمه چپ ورودی ۱۲۸ بیتی استفاده می‌کند که قرار است بر عملوند دیگر تقسیم شود.
* **rE، رجیستر اپسیلون**
: برای مقایسه‌های ممیز شناور با توجه به اپسیلون استفاده می‌شود.
* **rH، رجیستر himult**
: برای ذخیره نیمه چپ نتیجه ۱۲۸ بیتی حاصل از ضرب عدد صحیح بدون علامت استفاده می‌شود.
* **rJ، رجیستر پرش بازگشت**
: توسط دستورات PUSH برای ذخیره آدرس دستورالعمل بعدی و توسط `POP` برای بازگشت از PUSH استفاده می‌شود.
* **rM، رجیستر ماسک مالتی‌پلکس**
: توسط دستورالعمل مالتی‌پلکس استفاده می‌شود.
* **rR، رجیستر باقیمانده**
: به باقیمانده تقسیم عدد صحیح تنظیم می‌شود.
* **rBB، رجیستر بوت‌استرپ (trap)**
: هنگام رخ دادن "تله" (trapping)، `rBB` مقدار $255 را می‌گیرد و $255 مقدار `rJ` را. بدین ترتیب `rJ` در یک رجیستر عمومی ذخیره می‌شود.
* **rC، شمارنده چرخه**
: هر چرخه افزایش می‌یابد.
* **rN، شماره سریال**
: یک ثابت که این پردازنده MMIX خاص را شناسایی می‌کند.
* **rO، آفست پشته رجیستر**
: برای پیاده‌سازی پشته رجیستر استفاده می‌شود.
* **rS، اشاره‌گر پشته رجیستر**
: برای پیاده‌سازی پشته رجیستر استفاده می‌شود.
* **rI، شمارنده فاصله زمانی**
: هر چرخه کاهش می‌یابد. هنگامی که به صفر برسد، باعث وقفه می‌شود.
* **rT، رجیستر آدرس تله**
: برای ذخیره آدرس بردار تریپ استفاده می‌شود.
* **rTT، رجیستر آدرس تله پویا**
: برای ذخیره آدرس بردار تله استفاده می‌شود.
* **rK، رجیستر ماسک وقفه**
: برای فعال و غیرفعال کردن وقفه‌های خاص استفاده می‌شود.
* **rQ، رجیستر درخواست وقفه**
: برای ثبت وقفه‌ها به محض وقوع استفاده می‌شود.
* **rU، شمارنده استفاده**
: برای نگهداری تعداد دستورالعمل‌های اجرا شده استفاده می‌شود.
* **rV، رجیستر ترجمه مجازی**
: برای ترجمه آدرس‌های مجازی به آدرس‌های فیزیکی استفاده می‌شود. شامل اندازه و تعداد قطعات (segments)، مکان ریشه جدول صفحه و شماره فضای آدرس است.
* **rG، رجیستر آستانه سراسری**
: تمام ارجاعات رجیسترهای عمومی با شماره‌ای بزرگتر یا مساوی `rG` به رجیسترهای سراسری اشاره می‌کنند.
* **rL، رجیستر آستانه محلی**
: تمام ارجاعات رجیسترهای عمومی با شماره‌ای کوچکتر از `rL` به رجیسترهای محلی اشاره می‌کنند.
* **rA، رجیستر وضعیت محاسباتی**
: برای ثبت، فعال و غیرفعال کردن استثناهای محاسباتی مانند سرریز (overflow) و تقسیم بر صفر استفاده می‌شود.
* **rF، رجیستر مکان شکست**
: برای ذخیره آدرس دستورالعملی که باعث شکست شده است، استفاده می‌شود.
* **rP، رجیستر پیش‌بینی**
: توسط عملیات تبادل شرطی (CSWAP) استفاده می‌شود.
* **rW، رجیستر محل وقفه (trip)**
: هنگام تریپ کردن، برای ذخیره آدرس دستورالعمل پس از دستورالعملی که قطع شده است، استفاده می‌شود.
* **rX، رجیستر اجرا (trip)**
: هنگام تریپ کردن، برای ذخیره دستورالعملی که قطع شده است، استفاده می‌شود.
* **rY، عملوند Y (trip)**
: هنگام تریپ کردن، برای ذخیره عملوند Y دستورالعملی که قطع شده است، استفاده می‌شود.
* **rZ، عملوند Z (trip)**
: هنگام تریپ کردن، برای ذخیره عملوند Z دستورالعملی که قطع شده است، استفاده می‌شود.
* **rWW، رجیستر محل وقفه (trap)**
: هنگام تله کردن، برای ذخیره آدرس دستورالعمل پس از دستورالعملی که قطع شده است، استفاده می‌شود.
* **rXX، رجیستر اجرا (trap)**
: هنگام تله کردن، برای ذخیره دستورالعملی که قطع شده است، استفاده می‌شود.
* **rYY، عملوند Y (trap)**
: هنگام تله کردن، برای ذخیره عملوند Y دستورالعملی که قطع شده است، استفاده می‌شود.
* **rZZ، عملوند Z (trap)**
: هنگام تله کردن، برای ذخیره عملوند Z دستورالعملی که قطع شده است، استفاده می‌شود.
:
برنامه‌های ام‌میکس، همانند برنامه‌هایی که بر روی سایر CPUها اجرا می‌شوند، می‌توانند به روش‌های مختلفی قطع شوند. سخت‌افزارهای خارجی مانند تایمرها، منبع رایجی برای وقفه‌های اولویت‌بندی هستند. بسیاری از دستورالعمل‌ها در موارد استثنایی خاصی باعث وقفه می‌شوند؛ از جمله استثناهای خطای صفحه که برای پیاده‌سازی حافظه مجازی استفاده می‌شوند، و همچنین مدیریت استثنای ممیز شناور. ام‌میکس دو نوع وقفه دارد: "تریپ" (trips) و "تله" (traps). تفاوت اصلی این دو در این است که تله‌ها کنترل را به یک برنامه "مدیریت تله" در سیستم عامل (trapping) می‌فرستند، اما تریپ‌ها کنترل را به یک برنامه "مدیریت تریپ" در برنامه کاربر (tripping) می‌فرستند. کاربران همچنین می‌توانند هر مدیریت وقفه‌ای را با دستورالعمل‌های صریح وقفه نرم‌افزاری `TRIP` و `TRAP` به اجرا درآورند، که شبیه به برخی از انواع تله در سایر سیستم‌های کامپیوتری است. به ویژه، یک فراخوانی سیستمی از یک برنامه کاربر به سیستم عامل، از یک دستورالعمل `TRAP` استفاده می‌کند.

## پیاده‌سازی‌های سخت‌افزاری
، هیچ پیاده‌سازی سخت‌افزاری شناخته‌شده‌ای از معماری مجموعه دستورالعمل ام‌میکس وجود ندارد. با این حال، پروژه fpgammix ام‌میکس را در وریلاگ پیاده‌سازی می‌کند، که امکان پیاده‌سازی آن را با استفاده از یک مدار مجتمع دیجیتال برنامه‌پذیر فراهم می‌سازد.

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

### شبیه‌سازها و اسمبلر

* **MMIXware** – شامل شبیه‌ساز ساده (رفتاری) MMIX-SIM دونالد کنوث، اسمبلر MMIXAL، مجموعه تست، برنامه‌های نمونه، مستندات کامل، و شبیه‌ساز معماری (پایپ‌لاین) ام‌میکس.

* **MMIXX** – یک بسته گرافیکی مبتنی بر X11 است که توسط اندرو پوچینسکی از '''اِم‌آی‌تی''' و مرکز فیزیک نظری اِم‌آی‌تی ارائه شده است. این بسته، هنگامی که با منابع MMIXware بالا ترکیب شود، ماشین مجازی ام‌میکس را با یک 'نمایشگر مجازی' ۶۴۰×۴۸۰ پیکسل و رنگ واقعی (برای یونیکس/لینوکس) تکمیل می‌کند.

### کامپایلر
مجموعه کامپایلرهای گنو شامل یک بک‌اند ام‌میکس برای کامپایلرهای سی/سی‌پلاس‌پلاس خود است که توسط هانس-پیتر نیلسون ارائه شده و از اواخر سال ۲۰۰۱ بخشی از توزیع اصلی GCC می‌باشد. ، بک‌اند ام‌میکس در GCC همچنان به طور فعال توسط داوطلبان توسعه و نگهداری می‌شود.
* دستورالعمل‌های نصب GCC + ابزارهای ام‌میکس توسط هانس-پیتر نیلسون.
* §3.17.26. گزینه‌های ام‌میکس برای گنو GCC نسخه ۷.۲.۰ (وب‌سایت گنو GCC).
* §9.28. ویژگی‌های وابسته به ام‌میکس  برای گنو as از گنو باین‌یوتیلز نسخه ۲.۲۹، که بک‌اند اسمبلر برای گنو GCC است (وب‌سایت گنو باین‌یوتیلز).
ابزارهای فوق می‌توانند به طور نظری برای کامپایل، ساخت و راه‌اندازی (bootstrap) یک هسته سیستم‌عاملی کامل مانند فری‌بی‌اس‌دی، لینوکس یا سایر سیستم‌عامل‌های مشابه بر روی سخت‌افزار ام‌میکس استفاده شوند، در صورتی که چنین سخت‌افزاری وجود داشته باشد.

## جستارهای وابسته
*زبان برنامه‌نویسی آموزشی
* دی‌ال‌اکس
* LC-3
* کامپیوتر مرد کوچک
* میکرو سیم
* MIX
* NAR 2، یک پردازنده دیگر که توسط یک استاد برای کمک به یادگیری دانشجویان طراحی شده است.

## منابع

## برای مطالعهٔ بیشتر
* Donald E. Knuth (2005). *The Art of Computer Programming Volume 1 Fascicle 1: MMIX A RISC Computer for the New Millennium*. Addison-Wesley.  (errata)
* Martin Ruckert (2015). *MMIX Supplement, The: Supplement to The Art of Computer Programming Volumes 1, 2, 3 by Donald E. Knuth*. Addison-Wesley. 

## پیوند به بیرون

*
*صفحه MMIX دونالد کنوث – مقدمه‌ای کوتاه بر MMIX و دلایل کنوث برای استفاده از یک زبان اسمبلی فرضی در TAoCP.
*صفحه اخبار MMIX دونالد کنوث – شامل یک شبیه‌ساز متن‌باز نوشته شده در CWEB، یک راهنمای برنامه‌نویس، و برنامه‌های نمونه.
*MMIXmasters – وب‌سایتی برای داوطلبان که تمام برنامه‌های TAOCP، جلدهای ۱ تا ۳ را از MIX قدیمی به MMIX جدید تبدیل می‌کنند.
*VMMMIX  – VMMMIX یک ماشین مجازی (VM) MMIX است. این VM دارای ورودی/خروجی‌های کنسول، هارد دیسک و اترنت است. ، این VM تنها بر روی ویندوز اجرا می‌شود و از لینوکس نیز پشتیبانی می‌کند.
*پروژه مادربورد مجازی (VMB) – مجموعه‌ای از دستگاه‌های قابل اتصال که می‌توانند با یک نسخه مناسب از CPU MMIX استفاده شوند.

رده:دانلد کنوت
:en:Category:Educational abstract machines
رده:معماری‌های مجموعه دستورالعمل
رده:معرفی‌شده‌های مرتبط با رایانه در ۲۰۱۱ (میلادی)