مفاهیم معماری هسته IA-32 2.0
اثربخشی یک برنامهنویس در زبان اسمبلی مستقیماً به تسلط او بر معماری پردازنده وابسته است. این بخش مرجع مفصلی برای اجزای ضروری که یک برنامهنویس اسمبلی باید درک کند، ارائه میدهد: رجیسترهای پردازنده، مدل آن برای سازماندهی حافظه و حالتهای مختلف آدرسدهی دادهها.
۲.۱ مجموعه رجیستر
رجیسترها مکانهای ذخیرهسازی حافظه داخلی پرسرعتی هستند که مستقیماً درون تراشه پردازنده قرار دارند. وظیفه اصلی آنها نگهداری عناصر داده و آدرسها در طول پردازش است که با به حداقل رساندن نیاز به دسترسی به حافظه اصلی که بسیار کندتر است، سرعت عملیات را به میزان قابل توجهی افزایش میدهد. رجیسترهای IA-32 به سه دسته اصلی سازماندهی میشوند: رجیسترهای عمومی، رجیسترهای کنترل و رجیسترهای قطعه.
۲.۱.۱ ثباتهای عمومی
ثباتهای عمومی، نیروی محرکه پردازنده هستند که برای عملیات حسابی، منطقی و سایر عملیات رایج استفاده میشوند. آنها به ثباتهای داده، اشارهگر و شاخص تقسیم میشوند.
ثبت داده ها
این چهار رجیستر ۳۲ بیتی عمدتاً برای عملیات حسابی و منطقی استفاده میشوند. میتوان به آنها در اندازه کامل ۳۲ بیتی، به صورت نیمههای ۱۶ بیتی یا به صورت اجزای ۸ بیتی مجزا دسترسی داشت.
| 32-بیتی | 16-بیتی | قطعات ۸ بیتی | نقش تخصصی |
| EAX | AX | ق / آل | اولیه باتری در دستورالعملهای ورودی/خروجی و محاسباتی استفاده میشود. |
| EBX | BX | بی اچ / بی ال | La رجیستر پایهکه میتواند در آدرسدهی اندیسگذاری شده مورد استفاده قرار گیرد. |
| ECX | CX | سی اچ / سی ال | La ثبت شمارش، برای ذخیره تعداد حلقه در عملیات تکراری استفاده میشود. |
| EDX | DX | دی اچ / دی ال | La ثبت داده، در ورودی/خروجی و برای عملیات ضرب/تقسیم بزرگ استفاده میشود. |
رجیسترهای اشارهگر
این رجیسترها در درجه اول برای نگهداری آدرسهای حافظه و مدیریت پشته برنامه استفاده میشوند.
- اشارهگر دستورالعمل (EIP/IP): آدرس آفستِ بعد دستورالعملی که قرار است درون قطعه کد اجرا شود. پردازنده از جفت CS:EIP (قطعه کد: اشارهگر دستورالعمل) برای یافتن دستورالعمل فعلی استفاده میکند.
- اشارهگر پشته (ESP/SP): مقدار آفست را در داخل پشته برنامه ارائه میدهد و به بالای پشته اشاره میکند. این مقدار با رجیستر قطعه پشته (SS) استفاده میشود و جفت SS:ESP را برای ارجاع به مکان فعلی پشته تشکیل میدهد.
- اشارهگر پایه (EBP/BP): در درجه اول به ارجاع متغیرهای پارامتری که به یک زیرروال روی پشته منتقل شدهاند، کمک میکند.
ثباتهای شاخص
این رجیسترها برای آدرسدهی اندیسگذاری شده استفاده میشوند و برای پردازش رشتهها و آرایهها ضروری هستند.
- فهرست منابع (ESI/SI): به عنوان اندیس منبع برای عملیات رشتهای استفاده میشود.
- شاخص مقصد (EDI/DI): به عنوان اندیس مقصد برای عملیات رشتهای استفاده میشود.
۲.۱.۲ ثباتها و پرچمهای کنترلی
اشارهگر دستورالعمل ۳۲ بیتی (EIP) و ثبات پرچمهای ۳۲ بیتی، ثباتهای کنترلی اصلی محسوب میشوند. ثبات پرچمها مجموعهای از پرچمهای وضعیت است که مقادیر تک بیتی هستند که نتیجه عملیات محاسباتی و مقایسهای را نشان میدهند. دستورالعملهای شرطی، وضعیت این پرچمها را برای تصمیمگیری و تغییر جریان کنترل برنامه آزمایش میکنند.
| حفظی | نام پرچم | توضیحات: |
| OF | پرچم سرریز | سرریز شدن بیت مرتبه بالا (سمت چپ) را پس از یک عملیات حسابی علامتدار نشان میدهد. |
| DF | پرچم جهت | جهت عملیات رشتهای را تعیین میکند. ۰ برای چپ به راست، ۱ برای راست به چپ. |
| IF | پرچم وقفه | وقتی روی ۱ تنظیم شود، وقفههای خارجی (مثلاً صفحه کلید) را فعال میکند. وقتی ۰ باشد، آنها غیرفعال میشوند. |
| TF | پرچم تله | به پردازنده اجازه میدهد تا برای اشکالزدایی در حالت تک مرحلهای عمل کند. |
| SF | پرچم علامت | علامت یک نتیجه حسابی را نشان میدهد. ۰ برای مثبت، ۱ برای منفی. |
| ZF | پرچم صفر | نتیجه یک عملیات را نشان میدهد. اگر نتیجه صفر باشد، روی ۱ تنظیم میشود؛ در غیر این صورت، روی ۰ تنظیم میشود. |
| AF | پرچم حمل کمکی | شامل رقم نقلی از بیت ۳ به بیت ۴ پس از عملیات حسابی است. برای محاسبات تخصصی استفاده میشود. |
| PF | پرچم برابری | نشان میدهد که آیا تعداد بیتهای تنظیمشده در کمارزشترین بایت نتیجه، زوج است یا فرد. برای تعداد زوج بیتهای تنظیمشده، روی ۱ تنظیم میشود؛ برای تعداد فرد، روی ۰ پاک میشود. |
| CF | حمل پرچم | شامل رقم نقلی (0 یا 1) از بیت مرتبه بالا (سمت چپ) پس از یک عملیات حسابی است. |
۲.۱.۳ رجیسترهای سگمنت
بخشهای حافظه، نواحی تعریفشدهای در یک برنامه هستند که شامل کد، دادهها و پشته میشوند. ثباتهای بخش، آدرسهای شروع این بخشها را ذخیره میکنند.
- CS (بخش کد): آدرس شروع قطعه کد را ذخیره میکند که شامل تمام دستورالعملهای اجرایی است.
- DS (بخش داده): آدرس شروع بخش داده را ذخیره میکند، جایی که دادهها، ثابتها و نواحی کاری ذخیره میشوند.
- SS (بخش پشته): آدرس شروع قطعه پشته را ذخیره میکند.
علاوه بر این، ثباتهای سگمنت اضافی - ES ، FS و GS - وجود دارند که سگمنتهای اضافی برای ذخیره دادهها فراهم میکنند.
برای یافتن یک دستورالعمل یا قطعه داده خاص، پردازنده از آدرسدهی Segment:Offset استفاده میکند . این روش آدرس شروع یک قطعه (ذخیره شده در یک ثبات قطعه) را با یک مقدار افست (اغلب از یک اشارهگر یا ثبات اندیس) ترکیب میکند تا آدرس دقیق حافظه فیزیکی را محاسبه کند.
۲.۲ مدل تقسیمبندی حافظه
معماری IA-32 از یک مدل حافظه قطعهبندی شده استفاده میکند که حافظه سیستم را به مجموعهای از بخشهای مستقل تقسیم میکند. هر بخش برای نگهداری نوع خاصی از اطلاعات در نظر گرفته شده است و یک رویکرد ساختاریافته برای مدیریت حافظه در یک برنامه ارائه میدهد. سه بخش اصلی عبارتند از:
- بخش داده: این بخش جایی است که عناصر داده برای برنامه ذخیره میشوند. این بخش در یک برنامه NASM با دو بخش نمایش داده میشود:
- La .داده ها بخش برای اعلان و مقداردهی اولیه دادهها یا ثابتها استفاده میشود. این ناحیه از حافظه استاتیک است و در زمان اجرا قابل گسترش نیست.
- La .bss بخش همچنین یک بخش حافظه استاتیک است اما برای رزرو فضا برای دادهها یا بافرهای مقداردهی نشده استفاده میشود. این حافظه معمولاً هنگام بارگذاری برنامه توسط سیستم عامل از صفر پر میشود.
- بخش کد: به نمایندگی از متن بخش، این یک ناحیه با اندازه ثابت در حافظه است که کدهای دستورالعمل اجرایی برنامه را ذخیره میکند.
- بخش پشته: این بخش به عنوان یک فضای ذخیرهسازی موقت برای مقادیر دادهای که به توابع و رویهها ارسال میشوند، و همچنین برای ذخیره آدرسهای برگشتی در طول فراخوانیهای تابع استفاده میشود.
۲.۳ آدرسدهی و ذخیرهسازی دادهها
پردازنده بر اساس یک چرخه پیوسته واکشی-رمزگشایی-اجرا عمل میکند :
- رفتن و آوردن: پردازنده دستورالعمل بعدی را از حافظه بازیابی میکند.
- رمزگشایی: پردازنده دستورالعملی را که باید اجرا شود، شناسایی میکند.
- اجرا کردن: پردازنده دستورالعمل را اجرا میکند.
هنگام ذخیره دادههای چند بایتی در حافظه، معماری IA-32 از یک توالی بایت معکوس استفاده میکند که به عنوان مرتبسازی بایت little-endian نیز شناخته میشود . در این روش، بایت کمارزش یک عدد در آدرس حافظه پایینتر و بایت پرارزش در آدرس حافظه بالاتر بعدی ذخیره میشود.
برای مثال، عدد هگزادسیمال ۱۶ بیتی 0725H به صورت زیر در حافظه ذخیره میشود:
- بایت کمارزش ۲۵ در آدرس حافظهی آغازین ذخیره میشود.
- بایت مرتبه بالای 07 در آدرس حافظه بعدی ذخیره میشود.
وقتی پردازنده این دادهها را از حافظه بازیابی کرده و به یک ثبات برمیگرداند، به طور خودکار ترتیب بایتها را به حالت اولیهشان برمیگرداند.
۲.۴ حالتهای آدرسدهی
حالتهای آدرسدهی، روشهای مختلفی هستند که یک دستورالعمل میتواند مکان عملوندهای خود (دادههایی که روی آنها عمل خواهد کرد) را مشخص کند. IA-32 چندین حالت برای دسترسی به دادهها ارائه میدهد.
- آدرس ثبت نام: عملوند مستقیماً درون یک ثبات پردازنده قرار دارد. این سریعترین حالت است زیرا نیازی به دسترسی به حافظه ندارد.
- درایو EAX، EBX
- آدرس دهی فوری: عملوند یک مقدار ثابت است که مستقیماً در خود دستورالعمل تعبیه شده است.
- اضافه کردن مقدار بایت، ۶۵
- آدرسدهی مستقیم حافظه: آدرس آفست عملوند مستقیماً توسط نام متغیر مشخص میشود. اسمبلر آفست را محاسبه کرده و آن را در یک جدول نماد ذخیره میکند.
- MOV BX، مقدار کلمه
- آدرسدهی مستقیم آفست: یک آدرس با استفاده از عملگرهای حسابی اصلاح میشود تا به عناصر درون یک ساختار داده مانند یک آرایه یا جدول دسترسی پیدا کند.
- MOV CL، جدول بایت[2]
- آدرسدهی غیرمستقیم حافظه: یک ثبات، آدرس حافظه عملوند را در خود نگه میدارد. این برای تکرار ساختارهای داده مانند آرایهها بسیار مفید است. نام ثبات در داخل براکتهای مربعی [] قرار میگیرد تا نشان دهد که شامل یک آدرس است، نه خود داده. یک توالی کامل استفاده شامل بارگذاری اولیه آدرس دادهها در یک ثبات پایه (مانند EBX) یا ثبات شاخص (DI، SI) و سپس استفاده از آن ثبات برای دسترسی به دادهها است.
- MY_TABLE TIMES 10 DW 0 ; یک آرایه 10 کلمهای تعریف میکند.
- MOV EBX, MY_TABLE ; آدرس مؤثر آرایه را در EBX بارگذاری کن.
- کلمه MOV [EBX]، ۱۱۰؛ برای تنظیم اولین عنصر، از طریق رجیستر به حافظه دسترسی پیدا کن
درک این معماری، پایه و اساس لازم برای ساختاردهی یک برنامه و نوشتن دستورالعملهای مؤثر را فراهم میکند.