آموزش Assembly-قسمت پنجم

1395/1/12 --- 2157

ثبات ها در زبان اسمبلی ( Registers )

اکثر عملیات پردازنده شامل پردازش داده هست. این داده می تونه در حافظه ذخیره بشه و از اونجا بهش دسترسی پیدا کنیم.
اگر چه که خواندن داده ها از حافظه و ذخیره کردنشون در اون - به دلیل اینکه شامل عملیات پیچیده ی ارسال داده درخواستی از Control Bus و فرستادن اون به واحد ذخیره سازی حافظه و دریافت داده از طریق همین کانال( همین مسیر دوباره طی میشه) - سرعت پردازنده رو پایین میاره.

برای رفع این مشکل و بالا بردن سرعت پردازنده در عملیات، پردازنده شامل یکسری فضای حافظه ذخیره سازی داخلی است که به این فضا ثبات یا همون Register میگن.

ثبات ها المان های داده رو برای پردازش بدون اینکه به حافظه اصلی دسترسی داشته باشن ذخیره میکنن. البته به این نکته باید توجه داشت که تعداد ثبات ها در پردازنده ها محدود هست دلیلش هم هزینه است.

ثبات های پردازنده (  Processor Register)

در معماری IA-32 ، 10 تا 32 بیت و 6 تا 16 بیت ثبات هست. ثبات ها رو میشه به سه دسته تقسیم کرد:

    1. ثبات های عمومی ( General Registers )

    2. ثبات های کنترلی ( Control Registers )

    3 . ثبات های مربوط به سگمنت ها ( Segment Registers )

ثبات های general خودشون عمومن به 3 قسمت تقسیم میشن :

    1. ثبات های داده Data Registers

    2. ثبات های اشاره گر Pointer Registers

    3. ثبات های فهرستی Index Register

خب حالا هر کدومو با هم ببینیم چی هستن :

Data Registers

چهار عدد ثبات داده ای 32 بیتی برای اعمال محاسباتی ، منطقی و غیره استفاده میشه. این ثبات ها به سه روش میتونن استفاده بشن :

  • به عنوان یک ثبات 32 بیتی کامل : EAX , EBX, ECX, EDX
  • نیمه کم ارزش این ثبات ها به عنوان ثبات های 16 بیتی استفاده بشه: AX, BX, CX, DX
  • نیمه کم ارزش و پر ارزش هر کدوم از این ثبات های 16 بیتی استفاده بشه

آموزش اسمبلی Assembly قسمت پنجم

لازم به ذکر هست که بعضی از این ثبات های داده در عملیات حسابی کاربرد خاصی دارن.

ثبات AX که به عنوان اکومولاتور اصلی ، برای I/O و اکثر دستورالعمل های محاسباتی ازش استفاده میشه. به عنوان مثال ، در عملیات ضرب، یکی از عملوند ها با توجه با اندازش در EAX یا AX یا AL ذخیره میشه.

ثبات BX که به عنوان ثبات پایه ( Base Register ) ، که میتونه برای آدرس دهی فهرستی ازش استفاده کرد.

ثبات CX که به عنوان ثبات شمارشگر ( Count Register ) ، دو ثبات ECX , CX شمارشگر حلقه ها رو برای عملیات شامل تکرار ذخیره میکنه.

ثبات DX به عنوان ثبات داده ( Data Registers ) ، این ثبات هم برای I/O استفاده میشه. همچنین همراه با ثبات AX برای عملیات ضرب و تقسیم در مقادیر بزرگ ازشون استفاده میشه.

 

Pointer Registers

این ثبات ها ، ثبات های 32 بیتی EIP, ESP و EBP و 16 بیتی IP, SP و BP هستند. در کل ما سه دسته ثبات اشاره گر داریم :

  • Instruction Pointer - IP
    ثبات 16 بیتی IP آدرس offset دستورالعمل بعدی رو که پردازنده باید اجرا کنه رو ذخیره میکنه. اجتماع IP با ثبات CS به عنوان CS:IP ادرس کامل دستورالعمل فعلی رو در سگمنت کد به ما میده
  • Stack Pointer - SP
    ثبات 16 بیتی SP مقدار افست در stack برنامه رو برای ما فراهم میکنه. اجتماع SP و SS باهم به شکل SS:SP یه مکان فعلی داده یا آدرس در STACK  برنامه اشاره میکنه.
  • Base Pointer - BP
    این ثبات 16 بیتی به ارجاع دهی متغیر های پارامتری که به SUBROUTINE ها پاس داده میشن کمک میکنه. آدرس ثبات SS با افست در BP ترکیب میشه و مکان پارامتر رو به ما میده. BP همچنین میتونه با DI و SI به عنوان ثبات های پایه برای آدرس دهی ها خاص استفاده بشه.

آموزش اسمبلی Assembly قسمت پنجم

 

این ثبات های 32 بیتی ، ESI و EDI و 16 بیتی SI و DI برای ادرس دهی شاخص دار و بعضی مواقع هم برای اعمال جمع و تفریق ازشون استفاده میشه. دو نوع هستند:

 1.   Source Index SI
به عنوان شاخص مبدا در عملیات بر روی رشته ها ازش استفاده میشه

 2.   Destination Index DI
به عنوان شاخص مقصد در عملیات بر روی رشته ها ازش استفاده میشه

آموزش اسمبلی Assembly قسمت پنجم

 

Control Registers

ثبات 32 بیتی اشاره گر دستورالعمل و ثبات های 32 بیتی پرچم ها با هم ترکیب میشن و این ثباتها رو میسازن.

بسیاری از دستورالعمل ها مثل مقایسه ها و محاسبات ریاضی و تغییر وضعیت پرچم ها (flags ) و بعضی از دستورالعمل های شرطی مقدار این پرچم های وضعیتی رو تست میکنن برای اینکه بتونن جریان - همون جریان الکتریکی در مدار -  رو به بقیه مکان ها ببرند

پرچم های رایج بیتی عبارتند از :

  • Overflow Flag OF
    سریز رو مشخص میکنه برای بیت پرارزش
  • Direction Flag DF
    اینکه برای مقایسه رشته ها از چپ یا راست شروع بشه رو مشخص میکنه. اگر 0 باشه از چپ به راست و اگر نه از راست به چپ
  • Interrupt Flag IF
    برای مشخص کردن در نظر گرفتن وقفه ها ازش استفاده میشه
  • Trap Flag TF
    اجازه میده عملیات پردازنده پلکانی پیش بره. برای DEBUG کردن برنامه هامون ازشون استفاده میکنیم
  • Sign Flag SF
    علامت جواب بدست آمده از علیات حسابی رو به ما میگه. در بیت پرارزش تر  ذخیره میشه. اگر 1 باشه یعنی عدد منفی هست
  • Zero Flag ZF
    جواب حاصله از عملیات حسابی و یا مقایسه ای رو مشخص میکنه. اگر جواب 0 باشه این پرچم وضعیتی set میشه.
  • Auxiliary Carry Flag AF
    شامل مقدار نقلی از بیت 3 به 4 برای عملیات محاسباتی هست. وقتی set میشه که عملیات حسابی برروی یک بایت رقم نقلی از بیت 3 به 4 داشته باشد
  • Parity Flag PF
    با توجه به تعداد 1 های حاصله از عملیات set میشه. اگر تعداد زوج باشد صفر و اگر فرد باشد 1 میشود.
  • Carry Flag CF
    شامل مقدار نقلی از بیت پر ارزش تر می باشد.

آموزش اسمبلی Assembly قسمت پنجم

جدول بالا مکان پرچم هارو برای پرچم های 16 بیتی نمایش میده.

Segment Registers

همانطور که قبلن با هم دیدیم سگمنت ها مکان هایی از حافظه هستند که شامل کد، داده و stack برنامه می باشند. و سه نوع داشتند:

  • Code Segment
    ثبات 16 بیتی یا CS آدرس محل شروع سگمنت کد برنامه را مشخص میکند.
  • Data Segment
    ثبات 16 بیتی یا DS آدرس محل شروع سگمنت داده برنامه رو مشخص میکند.
  • Stack Segment
    این ثبات SS هم برای ذخیره آدرس شروع سگمنت استک استفاده میشه.

مثال کد نویسی :

به مثال زیر توجه کنید تا مفهوم استفاده از ثبات ها رو در برنامه های اسمبلی بهتر درک کنید.
این برنامه 9 عدد ستاره رو در صفحه نمایش ، نمایش میده بعلاوه ی یک پیغام ساده :

آموزش اسمبلی Assembly قسمت پنجم

برنامه رو اجرا کنین یه خروجی مثل زیر بهتون میده :

Displaying 9 stars

* * * * * * * * *