محمد حسن پزشکیان
عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

تفاوت بین زبان اسمبلی و زبان ماشین چیست؟

در این سری مطالب به بررسی یه سری نکات میپردازیم که ممکنه شما در حین خوندن ساختار سیستم عامل ، os internals و زبان اسمبلی نیاز باشه بدونیدشون ، در واقع از 0 تا 100 مباحث رو نمیگم بلکه نکات سوالات، و مباحث مهمی که ممکنه پیش بیاد رو بررسی میکنم ، در وهله اول ، فرایند تبدیل یک کد که با هر زبان برنامه نویسی دلخواه نوشته شده به فایل اجرایی برای سیستم رو میخوایم بررسی کنیم ، زبان های سطح بالا ، وقتی میخوان تبدیل شن به قطعه کدی که یه پردازنده بخواد اجراش کنه ، باید یه سری فرایند رو طی کنن ، به عکس زیر دقت کنید :

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

تفاوت بین زبان اسمبلی و زبان ماشین چیست؟

همونطور که میبینید ، سورس کد (Source Code) یا همون کدی که ما نوشتیم و متن خام هست ، حالا توسط هر زبان سطح بالایی که ما بلدیم ، وقتی میخواد اجرا شه در مرحله اول باید کامپایل بشه و تبدیل بشه به زبان اسمبلی (کامپایل یا اینترپرت یا تفسیر بسته به زبان) و بعد ، اون قطعه کد باید توسط اسمبلر تبدیل بشه به زبان ماشین یا همون 0 و 1 که برای پردازنده قابل اجرا باشه ( ما یه دسته زبان های برنامه نویسی سطح بالا داریم که در شکل معلومه ، یه دسته هم زبان برنامه نویسی سطح پایین که شامل اسمبلی و زبان ماشین میشه)

تفاوت بین زبان اسمبلی و زبان ماشین چیست؟

منتها یه نکته ای اینجا وجود داره ، اگر شما با یه دیباگر یه برنامه رو دیباگ کنید ، مثلا مثلا Immunity ، در پنل Disassembler برنامه متوجه میشید که ما کد به زبان ماشین و کد به زبان اسمبلی برنامه رو باهم داریم :

تفاوت بین زبان اسمبلی و زبان ماشین چیست؟

ستون اول که Memory Address Location هست که کاری باهاش نداریم ، ستون دوم opcode یا همون کد به زبان ماشین برنامه هست (که در این مقاله توضیح دادم ولی فعلا اینطوری در نظر بگیرید که همون ماشین کده) و ستون سوم هم ما دستورالعمل های زبان اسمبلی رو داریم ، الان براتون سوال پیش میاد که مگه نگفتی زبان ماشین به شکل باینری یا مبنای 2 عه یا همون 0 و 1 ، پس این که مبنای 16 عه ! چی شد؟

زبان ماشین یا Machine Code یا Machine Language همون کد 0 و 1 برنامه هست ، یعنی همون کدای سورس کد شماست ولی به شکل باینری با مبنای 2 و آماده برای پردازش در پردازنده ، منتهــــااا ما اگر بخوایم این کد هارو بخونیم ، میتونیم ؟ ما میتونیم 0 و 1 بخونیم ؟ نه .. پس میایی و اون هارو به مبنای 16 یا همون Hexadecimal تبدیل میکنیم که خوانا تر باشن و ازشون سر در بیاریم

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

ما میخوایم با 1001111010001010 کار کنیم ، خب نمیتونیم چیزی ازش بفهمیم ، مخصوصا بین کلی 0 و 1 (...01110101011101010101101010011110100010100101001000101011101011101...) ، پس چیکار میکنیم ؟ میاییم و تبدیلش میکنیم به هگزادسیمال ، منتها قبلش اول میاییم و بلاک بلاکش میکنیم (هر بلاک4تا بیته) پس میشه 1010 1000 1110 1001 حالا میاییم هر بلاک رو تبدیل میکنیم به مبنای 16 : 1001 -> 9 و 1110 ->E  و 1000->8 و 1010->A حالا اینارو مینوسیم کنار هم و میشه 9E8A که بسیار خوانا تره از یه مشت 0 و 1 ...

به صورت خلاصه و برای جمع بندی : پس متوجه شدید که زبان ماشین یا کد ماشین درواقع مبنا 2 هست منتها واسه اینکه برای ما خوانا تر باشه و بتونیم راحت تر باهاش کار کنیم ، در مبنای 16 یا همون هگزادسیمال در نظرش میگیریم

این سوالات و ابهامات وقتی خودم شروع به خوندن اسمبلی و معماری سیستم کرده بودم برام پیش آمده و به مرور این نکات رو آپدیت میکنم که دوستانی که بعد من میخوان اقدام به خوندن کنن راحت تر باشن :)

این مطالب و مفاهیم پایه ای هستن که پایه مفاهیمی هستن که شما میخواید در مهندسی معکوس ، تجزیه و تحلیل بدافزار ، یا اکسپلویت نویسی و... بدونید ، پس با دقت بخونیدشون ;)

سوالی چیزی بود در خدمتم



محمد حسن پزشکیان
محمد حسن پزشکیان

عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

کارشناس تست نفوذ سنجی ، علاقه مند به امنیت تهاجمی و رد تیمینگ | عضو انجمن بین المللی ورزش های رزمی کشور آلمان و دارای احکام بین المللی و داخلی کمربند مشکی در سبک های کیوکوشین ، هاپکیدو ، کیک بوکسینگ و چند تام قهرمانی کشوری

نظرات