معرفی زبان اسمبلی و ابزارهای مرتبط

معرفی زبان های اسمبلی و ابزارهای مرتبط

با عرض سلام و خسته نباشید خدمت کاربران گرامی وبسایت کالی بویز. در این پست قصد داریم تا اسمبلی و انواع اون رو به شما معرفی کنیم.

اسمبلی چیست؟

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

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

در حال حاضر اسمبلی سطح پایین ترین زبان موجود بعد از کد ماشین است. و البته باید بگوییم که اسمبلی در اصل یک زبان نیست از آنجایی که سینتکس های متفاوتی دارد. بخصوص برای معماری های مختلف cpu مانند IA32 (Intel Assembly 32 bit), ARM, MIPS, PowerPC و غیره…

با استفاده از زبان اسمبلی میتوانید به راحتی با سخت افزار ارتباط برقرار کنید. در معمول ترین حالت دو سخت افزار بسیار اساسی و مورد نیاز هستند. یکی RAM و دیگری خود CPU که این کدها را اجرا می کند. از RAM برای نگهداری داده ها استفاده می کنیم. هر چند در CPU حافظه های ذخیره سازی نهان بسیار کوچکی به نام ثبات وجود دارند که برای کاربردهای خاص ساخته شدند.

همینطور برای معماری Intel نیز دو سینتکس وجود دارد که یکی خود Intel است و دیگری AT&T. انتخاب هر کدام سلیقه ای است. لازم به ذکر است که ابزارهای GNU بصورت پیشفرض از سینتکس AT&T پشتیبانی می کنند.

یک نمونه کد Hello World در اسمبلی معماری IA64 با سینتکس Intel را در زیر میتوانید ببینید:

کاربردهای زبان اسمبلی

زبان اسمبلی برخلاف زبان های برنامه نویسی سطح بالا مانند سی، سی پلاس پلاس، جاوا و غیره بسیار راحت و بدون وابستگی می باشد که به محیط از پیش فراهم شده نیاز دارند. به همین دلیل زبان اسمبلی در پروسه بوت سیستم بسیار کاربرد دارد و تنها راه حل موجود است. در مرحله بوت سیستم با اسمبلی برنامه مینویسند که بتواند عملیات هایی را برای آماده سازی cpu و RAM انجام دهد مانند تعریف GDT و بردن cpu از حالت real mode 16 bit به protected mode 32 bit و در نهایت به long mode 64bit و تنظیم نحوه دسترسی به حافظه ها و غیره..

کاربرد دیگر اسمبلی زمانی است که میخواهید overhead هایی که زبان های برنامه نویسی سطح بالا تولید می کنند را حذف کنید اینکار تاثیر بسزایی در performance دارد. همینطور خیلی اوقات نمی توانید به بعضی feature های cpu دسترسی پیدا کنید و معمولا بخاطر performance بهتر است از آنها استفاده کنید. مانند دستورات مربوط کنترل virtual machine و یا استفاده مستقیم از رجیسترهای (FPU (Floating Point Unit. یا بعنوان مثال bit shift چرخشی در زبان سی وجود ندارد اما در زبان اسمبلی وجود دارد که توسط cpu خیلی سریع اجرا میشود: ROR

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

بدافزار نویس ها نیز استفاده بسزایی از اسمبلی می کنند زیرا مبهم سازی کد در زبان اسمبلی بسیار آسانتر است. در زبان اسمبل از آنجایی که ارتباط مستقیمی به زبان ماشین دارد تغییر کد بصورت runtime بسیار راحت تر می باشد که به اینکار morphism میگویند. دو مدل morphism که در بدافزارهای حرفه ای به چشم میخورند polymorphism و metamorphism هستند که برای تغییر حالت و دور ماندن از شناسایی توسط آنتی ویروس ها بکار می روند.

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

ابزارهای برنامه نویسی

برای کامپایل کردن:

  • nasm: یکی از کار‌آمدترین و ساده ترین برنامه ها برای کامپایل اسمبلی بخصوص سینتکس اینتل می باشد.
  • masm: اسمبلر مایکروسافت که تنها 16bit و 32bit را پشتیبانی می کند. برای 64bit از ML64 استفاده کنید.
  • fasm: اسمبلری ساده با پشتیبانی کامل ویندوز و لینوکس همینطور با سینتکس اضافه ساده و پرکاربرد و از این اسمبلر برای ساخت فایل های غیر اجرایی با ساختار خاص نیز استفاده بسیاری می شود.
  • gas: اسمبلر گنو بطور پیشفرض در اکثر توزیع های لینوکسی موجود می باشد و همانطور که قبلا قید شد در ابزارهای گنو از سینتکس at&t پشتیبانی می شود هرچند که معمولا از intel هم پشتیبانی میکنند ولی باید آنرا مستقیما مشخص کنید.

برای لینک کردن:

  • ld: بصورت پیشفرض در لینوکس که فایل قابل اجرا elf میسازد.
  • LINK.exe: برای ویندوز که فایل قابل اجرا exe میسازد.

چند دستور مهم در اسمبلی Intel

برای دستورات بیشتر و نحوه استفاده آنها میتوانید به manual اینتل یا سازنده معماری مورد نظر مراجعه کنید. یا از این لینک نیز میتوانید استفاده کنید که بطور خیلی خلاصه طرز کار تعدادی از دستورات اینتل x86 را توضیح داده است.

برای یادگیری اسمبلی حتما از یک آموزش معتبر و راحت استفاده کنید. امیدوارم بتوانم آموزشی مناسب در این زمینه نیز فراهم کنم که در همین وبسایت خواهم گذاشت.

امیدوارم این پست برای شما مفید واقع شده باشد.

100%
Awesome
  • Criteria

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.