1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

آموزش اسمبلی(1)

شروع موضوع توسط hector2141 ‏15/10/12 در انجمن Assembly

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    [​IMG]
    برای یاد گرفتن اسمبلی باید با مبناهای عدد نویسی ، ساختمان داخلی کامپیوتر و برنامه نویسی آشنا باشیم .
    ما برنامه هایمان را مستقیما با اسمبلر Macro Assembler خواهیم نوشت و گاها از Debug استفاده خواهیم کرد . بعلاوه چون برنامه های حجیم نخواهیم نوشت قالب اکثر برنامه های ما COM. خواهد بود .



    برای شروع ابتدا نگاهی به حافظه میکنیم :
    حافظه و آدرس دهی
    هر کامپیوتر مبتنی بر ۸۰۸۶ دارای حداقل ۶۴۰ کیلوبایت حافظه است . این ۶۴۰ کیلوبایت به قطعات ۶۴ کیلوبایتی تقسیم شده و ما این قطعات را “قطعه ” یا Segment مینامیم . هر سگمنت هم به خانه های تک بایتی دیگری تقسیم شده است .
    برای بدست آوردن مقدار یک بایت مشخص از حافظه ما باید عد مربوط به سگمنت و همچنین شماره آن بایت در سگمنت ( که آفست Offset نامیده میشود ) را بدانیم . مثلا اگر مقدار مورد نظر در قطعه ۰۰۳۰h(h( یعنی عدد در مبنای ۱۶ است ) و آفست ۱۳C4h باشد ما باید قطعه ای که شماره آن ۰۰۳۰h است را بیابیم و بعد در همان قطعه مقدار باین شماره ۱۳C4 را بخوانیم .
    برای نمایش این حالت بین عدد سگمنت و آفست علامت (:) قرار میدهیم . یعنی ابتدا عدد مربوط به قطعه را نوشته و سپس عدد آفست را می آوریم : Segment:Offset

    مثال : ۴D2F:َ۹۰۰۰ **
    همیشه در آدرس دهی ها از اعداد مبنای ۱۶ استفاده میکنیم .

    | | |
    | CConvertional | 1 Segment=64K | | | | | Memory
    | | | | | |
    | | | |
    | | | |

    ثباتها Registers :
    رجیسترها مکان هائی از CPU هستند که برای نگهداری داده ها (DATA) و کنترل اجرای برنامه بکار میروند . ما میتوانیم آنها را مقدار دهی کرده و یا بخوانیم و یا باتغییر محتوای آنها CPU را مجبور به انجام یک پروسه (رویه یا Procedure) کنیم. دسته ای از رجیسترها که ما انها را “ثباتهای همه کاره یا همه منظوره ” میخوانیم و شامل AX/BX/CX/DX هستند ، برای انتقال مقادیر بین رجیستر ها و CPU بکار میروند.
    این ثباتها را میتوانیم به هر نحوی تغییر دهیم و مقادیری را به آنهاارسال کنیم .
    ثباتهای دیگری هم که نام میبریم کاربردهای خاص خودشان را دارند و برای مقدار دهی آنها باید قواعد خاصی (که توضیح خواهیم داد) را بکار بریم .
    میکند عدد که در این ثبات وجود دارد شماره یک قطعه است و CPU برای یافتن DS : مخفف Data Segment . محل نگهداری متغییرها و ثابتهای برنامه را مشخص مقادیر لازم به آن قطعه مراجعه میکند . CS : مخفف Code Segment است و آدرس قطعه ای که برنامه در آن قرار گرفته را نشان میدهد .
    ES: این یک ثبات کمکی است و معمولا در آدرس دهی ها شماره قطعه را نگهداری
    میکند . DI

    DataIndex:Dبا DS/ESا مرتبط است و عدد آفست را نگهداری میکند .
    IP: این رجیستر معلوم میکند که برنامه در حال اجرائی که در CS قرار دارد از
    کدام بایت قطقه (یعنی کدام آفست ) شروع میشود . به همین دلیل همیشه این دو ثبات را با هم و بصورت CS:IP نشان میدهند.
    و …

    تمام رجیسترهای فوق ۱۶ بیتی (دوبایتی ) هستند و اعداد دوبایتی را نگهداری میکنند.
    ثباتهای همه منظوره به دو نیم ثبات تک بایتی تقسیم میشوند . بایت بالائی با نماد H و بایت پائینی با نماد L نشان داده میشود . مثلا ثبات AX دارای دو نیم - ثبات AH/AL است :
    | AH - 8 Bit | AL -8 Bit |

    تمرین :
    برای دیدن رجیسترها در DOS، DEBUG، را اجرا کنید و فرمان R را صادر کنید :

    D:MASM>DEBUG
    -R
    AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
    DS=17AA ES=17AA SS=17AA CS=17AA IP=0100 NV UP EI PL NZ NA PO NC
    17AA:0100 0F