PDA

View Full Version : درس یک : Assembly



Best Programmer
یک شنبه 07 دی 1382, 00:41 صبح
برای یاد گرفتن اسمبلی باید با مبناهای عدد نویسی ، ساختمان داخلی کامپیوترو برنامه نویسی آشنا باشیم .
ما از Debug استفاده خواهیم کرد . (در سطح داس) اما در محیط ویندوز برای Debug کردن یک برنامه از برنامه های نظیر(SI (Soft Ice و یا trw2000 debuger و دیگر برنامه های نظیر این دو برنامه استفاده می نماییم
برای شروع ابتدا نگاهی به حافظه میکنیم :

حافظه و آدرس دهی

هر کامپیوتر مبتنی بر8086 دارای حداقل640 کیلوبایت حافظه است . این 640 کیلوبایت به قطعات 64 کیلوبایتی تقسیم شده و ما این قطعات را "قطعه " یا Segment مینامیم . هر سگمنت هم به خانه های تک بایتی دیگری تقسیم شده است.
برای بدست آوردن مقدار یک بایت مشخص از حافظه ما باید عدد مربوط به سگمنت وهمچنین شماره آن بایت در سگمنت ( که آفست نامیده میشود) را بدانیم . Offset یعنی یک آدرس در مبنای 16 که 16 بیتی است و( یا در حالت win32 یک عدد 32 بیتی می باشد. ) و مثلا اگر مقدار مورد نظر در قطعه 0030h باشد و افست آن 13C4h باشد ما باید قطعه ای که شماره آن 0030h است را بیابیم و بعد در همان قطعه افست 134C را بدست آوریم .
برای نمایش این حالت بین عدد سگمنت و آفست علامت (:) قرار میدهیم . یعنی
0030:134C در حالت داس و 0030:0000134C در حالت ویندوز. Segment:Offset
** همیشه در آدرس دهی ها از اعداد مبنای 16 استفاده میکنیم .

Registers ثباتها

رجیسترها مکان هائی ازCPU هستند که برای نگهداری داده ها (DATA) و کنترل اجرای برنامه بکار میروند . ما میتوانیم آنها را مقدار دهی کرده و یا بخوانیم و یا باتغییر محتوای آنهاCPU را مجبور به انجام یک پروسه (رویه یاProcedure ) کنیم .

دسته ای از رجیسترها که ما آنها را "ثباتهای همه کاره یا همه منظوره " میخوانیم و شامل ax,bx,cd,dx هستند در حالت داس ( حالت 2 بایتی ) ودر حالت ویندوز eax,ebx,ecx,edx ( بصورت 4 بایتی) ، برای انتقال مقادیر بین رجیستر ها وCPU بکار میروند.
در حالت ویندوز ثباتهای معروف دیگر( که هر کدام قانون خاصی دارد ) عبارتند از :
EIP
این ثبات مقدار شماره خط در حال اجرا نمایش می دهد.
ESP
قبل از توضیح این ثبات باید در باره پشته صحبت کنیم . پشته یا Steak محلی است که برنامه مقادیر ذخیره شده ثباتهای دیگر در آن قرار می گیرد . قانونی پشته در این است که هر چیز که اول وارد آن گردد آخر سر خارج می شود.The 1st input is the last one come out
خوب معلوم است که این ثبات شماره پشته را در خود نگه می دارد.
مثال فرض کنیم یک MsgBox باید نمایش داده شود . در این حالت مکان یا آدرس جایی که رشته مورد نمایش در حاقظه قرار در ثباتی مثل Eax قرار داده می شود:
Mov eax,00450F1C قرار داده می شود.eax آدرس رشته مورد نظر در
Push eax در پشته eax قرار دادن آدرس
Xor eax,eax برای فرا خوانی تابع eax صفر کردن متغیر یا ثبات
[jmp dword ptr [004121F0
برنامه به محلی که رویه Messageboxa توسط برنامه مورد مثال فرا خانی می شود ارسال می گردد.
( دستوارت بعدا توضیح داده می شود).
ثبات( EDI (Data Index
این ثبات برای نگه داری اطلاعات مورد نظر برنامه استفاده می شود. تقریبا مثل ثبات همه کاره
ثبات(ESI(Segment Index
همانند EDI

ثباتهای همه منظوره به دو نیم ثبات تک بایتی تقسیم میشوند . بایت بالائی با نمادH و بایت پائینی با نمادL نشان داده میشود . مثلا ثبات AX دارای دو نیم- ثبات AH,AL است .
در داس:
اگر AX را بصورت ABCD نمایش دهیم CD درAl و AB درAh قرار می گیرد حال اگر مقدار 1234h (h نمایینده قرار گرفتن در مد Hex می باشد) درAX قرار داده شود ( هنگامی که از حافظه برنامه مقدار دهی شود .) مقدار 12 درAl و مقدار 34 درAh قرار می گیرد.(Eax=3412)
در حالت ویندوز
این حالت بر قرار است اماEax=XXXXABCD
AB معرف Ah وCD معرف Al می باشد.
در درس بعدی اعداد پایه 16 تایی و 8 تایی و 10 تای و چند دستور آموزش داده می شود.

قبل از هر چیز برنامه های مثه Soft Ice و W32DASMو یک Hex Editor مثه Hex Workshop را تهیه کنید.( آدرس آنها را ندارم اگه داشتید بگید که تو صفحه تغییرشان بدهم ).

تمرین در سطح داس (Dos Promt یا Dos Mode) دستور Debug را زده و بعد از اجرا در خط فرمان Debug ( همان خطی که اول آن - دارد ) دستور R یا Registersرا تایپ و enter را بزنید مقدار رجیستر ها ( ثباتها ) به نمایش در می آید .
برای خروج q تایپ و Enter را بزنید.