آموزش Assembly-قسمت سوم

--- 1395/1/12 1326

آموزش Assembly-قسمت سوم

یک برنامه اسمبلی رو میتونیم به 3 قسمت تقسیم کنیم:
1- قسمت data
2- قسمت bss
3- قسمت text
Data Section
این قسمت برای مقدار دهی اولیه به داده ها و ثابت ها استفاده میشه. این داده ها مقدار و مکانشان در هنگام اجرا تغییر نمی کند. ما میتونیم تو این قسمت از مقادیر ثابت ، نام فایل ها ، یا سایز بافر و ... متنوعی استفاده کنیم. ( برای دوستان کامپیوتری data segment )
برای مشخص کردن قسمت داده از نحو زیر عمل میکنیم:

 

section.data

 

bss Section
برای اعلان  متغیر ها از این قسمت یا section استفاده میکنیم.
برای مشخص کردن قسمت داده از نحو زیر عمل میکنیم:

section.bss

text Section
از این قسمت برای نوشتن کد برنامه مون استفاده میکنیم. ( دوستانی که رشته شون کامپیوتر هس . Code Segmentرو یه نگاهی بندازن)
این قسمت باید با اعلان global _start ، شروع شود. که این اعلان به میگه که برنامه رو از کجا باید اجرا کنه ( مثل تابع main تو زبان های برنامه نویسی مانند c و یا java )
برای مشخص کردن قسمت داده از نحو زیر عمل میکنیم:

section.text
	global _start
_start:
توضیح ها ( Comment ) در زبان اسمبلی
در زبان اسمبلی comment ها با نماد ; شروع میشه . میتونه همه ی کاراکتر های قابل چاپ رو در بر بگیره حتی space .
توضیح ها یا همون comment ها میتونن تو یک خط جدا
; This program displays a message on screen
یا در همان خطی که کد رو نوشتیم نوشته بشن
add eax, ebx      ; adds ebx to eax
نکته : حتمن از comment ها توی کدها تون استفاده کنین . مخصوصن اگه میخواین برنامه رو گسترش بدین یا توی یک تیم باهم کار میکنین. و حتمن هم سعی کنید از زبان انگلیسی روان برای نوشتن توضیحات استفاده کنید.
 
جمله ها در زبان اسمبلی
در زبان اسمبلی ما در کل سه نوع  جمله داریم:
- دستور العمل های قابل اجرا شدن یا همان دستورالعمل ها ( Executable instructions )
- رهنمود های اسمبلر ( assembler directive ) یا شبه عمل (pseudo-ops)
- ماکرو ها (macro)
دستورالعمل ها به پردازنده میگه که چیکار کنه.
هر دستورالعمل شامل یک کد دستورالعمل یا همان opcode هست.
هر دستورالعمل قابل اجرا یک دستورالعمل زبان ماشین تولید میکنه.
شبه عمل ها یا همان pseudo-ops به اسمبلر درباره ی جنبه های مختلف فرایند اسمبلی میگه.
این ها دستورات غیر قابل اجرا هستند و دستورالعمل زبان ماشین تولید نمی کنند.
ماکرو ها Macro در واقع یه مکانیزمی برای جایگزینی متن هستند ( مثل همان مفهوم macro در زبان های دیگر C++)
نحو ساختار جمله ها در زبان ماشین
در زبان اسمبلی هر جمله باید در یک خط نوشته شود. هر جمله از شکل زیر تبعیت میکنه:
[label]   mnemonic   [operands]   [;comment]
مواردی که توی براکت هستند اختیاری هستند یعنی می تونیم اونهارو ننویسیم.
یک دستورالعمل پایه در اسمبلی دو قسمت داره ، اولیش نام دستورالعمل هست و دومی عملوند ها یا پارامتر های فرمان مورد نظر.
در زیر مثال هایی از دستورات اسمبلی اومده.

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

برنامه Hello world در زبان اسمبلی

وقتی که قطعه کد بالا کامپایل و اجرا می کنیم نتیجه ی زیر تولید میشه:

Hello, world!

فرایند Compile و Link کردن برنامه اسمبلی در NASM

برای کامپایل و لینک کردن برنامه اسمبلی در nasm مراحل زیر رو طی میکنیم :

  • قطعه کد بالا رو در یه ویرایشگر متن بنویسید مثل notpad  و اون رو با فرمت asm ذخیره کنید :

hello.asm

  • مطمئن بشین که در همون مسیری که برنامه رو ذخیره کردین هستین مثلن:

C:\assembly\hello.asm

  • برای اسمبل کردن برنامه ، دستور زیر رو در ترمینال تایپ میکنیم:

nasm -f elf hello.asm

  • اگر در برنامه خطایی وجود داشته باشه در این مرحله اسمبلر به ما اطلاع میده.
    در غیر اینصورت فایل object برنامه با نام hello.o ساخته میشه.
  • برای link کردن فایل object و ساختن فایل اجرایی با نام hello دستور زیر رو در ترمینال تایپ میکنیم:

ld -m elf_i386 -s -o

  • برنامه رو با دستور زیر اجرا میکنیم تا نتیجه رو ببینیم:

./hello

اگه همه ی کار هارو درست انجام داده باشین. Hello, World نمایش داده میشه.

برای کامپایل در محیط ویندوز هم باید یک سری تغییرات تو برنامه بدین . می تونین google کنین با هر طور دیگه که راحتین.

من پیشنهادم اینکه document های خود nasm رو از سایتش بخونین.

نکته : این برنامه صرفن جهت تست و آشنایی اولیه با nasm هست و اگه دستوراتی رو متوجه نشدین اصلن مشکلی نداره چون جلوتر مفصل راجع به اونها باهم حرف میزنیم.

نکته : من برنامه رو براتون تایپ نمی کنم و screenshot اش رو میزارم. دلیلش هم اینکه میخوام خودتون حتمن برنامه رو بنویسین. و حتمن توصیه اکید میکنم که copy و paste نکنین. حتی یک کلمه رو حتی comment ها . حتی قالب section هارو همیشه خودتون بنویسن و یکبار درست نکنین و چند بار استفاده کنین.

نکته : من تو این سری آموزش قسمت هایی که مربوط به کامپایل و لینک کردن برنامه میشه رو تو محیط لینوکس انجام میدم. و برای محیط ویندوز رو هم نمیگم. ( البته راهنمایی میکنم که چجوری پیدا کنین) این کارم هم دو دلیل داره :

  1. اینکه حتمن یکی از توضیع های لینوکس رو دانلود . نصب کنین و با محیطش آشنا بشین. (حتی اگه ازش متنفر هم باشین باید این کار رو برای درک بهتر زبان ماشین انجام بدین

       2 . دوم اینکه برین برای کامپایل کردن تو محیط ویندوز یه دوتا مقاله بخونین از این و اون بپرسین و خلاصه درگیر بشین.

رک بگم. من دیدم خیلی از افرادی رو که این کارارو نکردن و به جایی هم نرسیدن و فقط یه کپی پیست کار خوب شدن. و نمی تونن بدون اینترنت و کد های آماده دیگران برنامه تولید کنن.

این مطالب برای همه ی زبون ها صدق میکنه و باید برای موفقیتتون و Ace بودن تو برنامه نویسی اینکارارو  بکنین.

و سعی کنین در برنامه هایی که مینویسین به هر زبونی که هست java ، ruby ، C و ... از IDE استفاده نکنین و خودتون کد رو بزنین. مخصوصن افرادی که میخوان تازه شروع به برنامه نویسی کنن. از text Editor ها استفاده کنن و برنامه رو به صورت manual کامپایل کنن. ( Hard Way learning )

دیگه همین .

هرگز نباید سعی در تکرار لحظات داشت ، باید آنها را همانگونه که یک بار اتفاق افتاده اند فقط تنها به خاطر آورد !

عقاید یک دلقک  _ هاینریش بل

 

KEEP CALM AND CODE ASSEMBLY

 

قسمت بعدی قسمت قبلی