رفتن به مطلب

ارسال های توصیه شده

به نام خدا

براي ياد گرفتن اسمبلي بايد با مبناهاي عدد نويسي ، ساختمان داخلي كامپيوترو برنامه نويسي آشنا باشيم .

براي شروع ابتدا نگاهي به حافظه ميكنيم :

 

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

 

هر كامپيوتر مبتني بر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

قبل از توضيح اين ثبات بايد در باره پشته صحبت كنيم . پشته يا Stack (نميدونم درست نوشتمش يا نه ) محلي است كه برنامه مقادير ذخيره شده ثباتهاي ديگر را در آن قرار مي دهد . قانوني پشته در اين است كه هر چيز كه اول وارد آن گردد آخر سر خارج مي شود.The 1st input is the last one come out

خوب معلوم است كه اين ثبات شماره پشته را در خود نگه مي دارد.

براي روشن تر شدن قضيه و چگونه استفاده از پشته يه مثال ميزنم . فرض كنيم يك MsgBox بايد نمايش داده شود .

در اين حالت مكان يا آدرس جايي كه رشته مورد نمايش در حاقظه قرار دارد در ثباتي مثل Eax قرار داده مي شود يعني

1- Mov eax,00450F1C eax آدرس رشته مورد نظر در خودش قرار ميده

حالا اين ادرس ذخيره ميشه :

2-Push eax در پشته قرار دادن اين آدرس

متغير رو صفر ميكنه :

Xor eax,eax صفر كردن متغير يا ثبات براي فرا خواني تابع

صدا زدن تابع :

[jmp dword ptr [004121F0

برنامه به محلي كه رويه Messageboxa توسط برنامه مورد مثال فرا خواني مي شود ارسال مي گردد.

( دستوارت بعدا توضيح داده مي شود).

همانطور كه ديده ميشه براي انتقال متغير به تابع سه راه حل وجود داره

استفاده از ثباتها ويا تركيبي از اونها

استفاده از پشته

استفاده هم از پشته هم از ثباتها

توي مثال بالا هم از از پشته هم از eax استفاده شد

 

ثبات( 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 تاي و چند دستور آموزش داده مي شود.

 

منبع:http://forum.codecorona.com/

لینک به دیدگاه

به نام خدا

 

با سلام

 

فكر كنم امروز نوبت رسيدن به حساب عدد ها باشه؟ نه

 

كلاس رسمي است.

 

ما معمولا اعداد را بر پايه ده نشان مي دهيم . يعني اعداد پايه ده. زيرا بعد از شمردن از 0 تا عدد 9 ، اعداد دو رقمي شده و يا به عبارت ديگر يكي به دهگان عدد اضافه مي شود .بطور مثال عدد 128 را در نظر بگيريد. اين عدد يعني

 

128=8*10^0+2*10^1+1*10^2

 

همانطور متوجه شديد رتبه دهگان و صدگان و هزارگان در واقعه معرف توان ده در رابطه بالا مي باشد.بعلت استفاده 10 به عنوان پايه توان اين مبنا را ده دهي مي گويند.

اعداد در پايه هاي ديگر هم داراي رابطه اي شبيه رابطه بالا مي باشند مثلا رابطه عدد 128 در پايه x بصورت زير نوشته مي گردد:

 

128(x)=8*x^0+ 2*x^1 +1*x^2

 

بعد از آشنايي به پايه اعداد و پايه هاي ديگر بصورت اجمالي حال به بررسي مبناهايي پرداخته مي شود كه در كامپيوتر كاربرد بسيار دارد.

 

پايه دو دوبي: ( Binary)

 

همانطور كه از اسم اين پايه معلوم است مبنا اعداد در اين پايه دو بوده و اعداد تشكيل دهنده اين مبنا عبارتند از 0،1(اعداد كوچكتر از پايه با انضمام 0 )يك عدد در اين مبنا بصورت مينيمم 1 بيت را مورد استفاده قرار مي دهد.2^0=1 ماكزيمم عدد تشكيل دهنده

 

پايه هشت هشتي يا اكتال

 

شبيه پايه دو بوده ولي اعداد بكار رفته در آن عبارت است از: 0،1،2،3،4،5،6،7. هر عدد در اين مبنا حداقل 3 بيت مورد مصرف قرار

مي دهد

2^0+2^1+2^2=7

( هر كدام از جواب به توان رساندن يك بيت را اشغال مي نماييد )

 

پايه هگزا دسيمال (Hex)

 

اعداد بكار رفته در آن عبارت است از:F،E،D،C،B،A،9،8، 0،1،2،3،4،5،6،7. كه در آن A معرف 10و B معرف 11 و ... E معرف 15

مي باشد هر عدد در اين مبنا حداقل 4 بيت مورد مصرف قرار مي دهد

2^0+2^1+2^2+2^3=15

 

چگونگي تبديل پايه هاي ديگر به ده دهي:

 

براي تبديل هر عدد در مبناي x به مبناي ده دهي از روش زير استفاده مي كنيم: ( فرض كنيد عدد ما در مبنا x برابر QWER مي باشد )

 

QWER(x)=R*x^0+E*x^1+W*x^2+Q*x^3+….

 

حاصل جمع ما همان عدد در پايه ده دهي (مثلا TYUIO) يعني

 

TYUIO(10)=QWER(x)

 

حال مي رسيم به تبديل اعداد پايه 10 به پايه هاي ديگر

 

براي اين كار از روش تقسيمهاي متوالي استفاده مي نماييم عدد را بر پايه مورد نظر ( x ) تقسيم نموده .باقي مانده را در بجاي اولين عدد معادل قرار مي دهيم حال خارج قسمت را بر x تقسيم نموده و باقي مانده را در كنار باقي مانده قبلي در سمت چپ آن قرار مي دهيم آنقدر اين كار را انجام داده تا خارج قسمت از x كمتر گردد .حال آخرين خارج قسمت را نيز دز سمت چپ باقي مانده ها قرار مي دهيم ( آخرين باقيمانده را نيز قبل از اضافه كردن خارج قسمت به اعداد اضافه مي نماييم) عدد حاصله معادل عدد ده دهي در پايه x مي باشد.

الگوريتم آن عبارت است از:

 

1- عدد را بگير

2- اگر عدد كوچكتر از x است به مرحله6 بپر

3- عدد را بر x تقسيم كن باقيمانده را در سمت چپ عدد معادل كنار اعداد ديگر بنويس اگر عددي نبود آن را ياد داشت كن

4- خارج قسمت را جاي عدد بگذار

5- به مرحله 2 برو

6- عدد را به سمت چپ اعداد اضافه كن

7- نمايش رشته

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...