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

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

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

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    [​IMG]
    دستورالعمل LOOP

    تا اینجا هروقت که میخواستیم یک حلقه ایجاد کنیم از دستورالعمل CMP و پرشهای شرطی استفاده میکردیم . راه ساده تری برای اجرای مکرر دستورالملها وجود دارد و آن استفاده از LOOP است . دستور LOOP به تعداد دفعاتی که با ثبات CX مشخص میکنیم حلقه ای را ایجاد میکند .


    برای ایجاد چنین حالتی ابتدا مقدار لازم را در ثبات CX قرار میدهیم . دستور Loop همیشه از مقدار CX یک واحد،یک واحد کم میکند تا به ۰ برسد . وقتی که مقدار CX برابر ۰ شد ، از حلقه خارج میشود .
    بنابراین برای ایجاد حلقه ای که ۱۰۰ بار تکرار شود، CX را برابر ۱۰۰ قرار میدهیم . MOV CX/100
    حلقه مورد نظر بین دستور loop و یک برچسب انجام میشود . برچسب ، در ابتدای حلقه و دستور loop در انتهای آن قرار میگیرد.
    MOV CX/100
    LPCNT :
    :
    :
    :
    LOOP LPCNT
    در بالا با mov cx/100 میخواهیم حلقه ای داشته باشیم که ۱۰۰ بار انجام بشود. وقتی به loop lpcnt میرسیم ، یکواحد از مقدار CX کاسته شده و مجددا به lpcnt پرش میکنیم .
    به همین سادگی ! .
    تمرین : برنامه ای بنویسید که کاراکتر های با کد اسکی ۳۲ تا ۲۵۵ را نمایش دهد.

    راهنمائی :
    چون همیشه CX در حال کاهش است ، برای اینکه بتوانیم از ۳۲ تا ۲۵۵ برویم ، باید عدد داخل CX را برابر ۳۱=۲۲۴-255 قرار بدهیم تا تعداد ۲۵۴ حرف چاپ بشود. سپس مقدار CX را از ۲۵۵ کم کرده و داخل AL قرار میدهیم تا با تابع ۰Eh ار وقفه ۱۰h چاپ شود . این وقفه را در برنامه ALLCHR.ASM توضیح دادیم .

    پشته (Stack) ، ذخیره و بازیابی ثباتها
    ما تعدادی ثبات برای نگهداری و انتقال اعداد و مقادیر داریم ولی کافی نیستند . بخصوص در DEBUG که نمیتوانیم متغیرتعریف کنیم . یا در برنامه پیش می آید بخواهیم برای یک کار خاص و بطور موقت مقدار ثبات را تغییر دهیم ،در این مواقع مقدار ثبات را در پشته ذخیره کرده و بعدا مجددا بازیابی میکنیم .
    در برنامه های EXE. پشته یا Stack یک سگمنت مستقل است و آدرس آن در ثبات
    SS (Stack Segment) قرار دارد . در برنامه های COM. پشته به آنصورت وجود ندارد و خود DOS فضای لازم را برای برنامه فراهم میکند . در هر صورت ما به اینکه پشته در کجاست کاری نداریم و به یک شکل مقادیر را به پشته فرستاده (PUSH) یا از آن خارج میکنیم (POP) .
    خاصیت مهمی که در PUSHو POPو کردن مقادیر به پشته وجود دارد اینست که همیشه اولین مقداری که به پشته فرستاده میشود، آخرین مقداری است که از پشته خوانده میشود . مثلا فرض کنید که ابتدا AX و بعد CX را به پشته میفرستیم .
    حال برای خارج کردن درست این مقادیر، ابتدا CX و بعد AX را خارج میکنیم .
    این قانون اسمبلی است و به (FILO=First In Last Out) معروف است .

    برای فرستادن مقدار یک ثبات به پشته از دستور PUSH استفاده میکنیم .
    مثلا برای قرار دادن AX مینویسیم : PUSH AX . PUSH
    نمیتواند مقدار یک نیم ثبات را در پشته قرار دهد و حتما باید یک ثبات کامل دوبایتی باشد .
    وقتی ثباتی را PUSH کردیم ، مقدار آن در Stack نگهداری میشود و میتوانیم مقدار آن را تغییر دهیم .
    پس از آن ، از دستور POP برای خارج کردن ثبات از پشته استفاده میکنیم مانند . POP AX

    مثال :
    ۱] MOV AX/0AH ; ax = 0Ah
    2] MOV BX/0BH ; bx = 0Bh
    3] PUSH AX ; push ax to stack
    4] PUSH BX ; hold bx in stack
    5] MOV AX/5 ; now ax=5
    6] MOV BX/2AH ; and bx=2Ah
    7] : ; other commands and
    8] : ; statements …
    9] POP BX ; POP bx from stack
    10] POP AX ; read ax from stack
    در سطر ۳وَ۴ مقادیر axو bxو را به پشته میفرستیم . در سطر ۵و ۶و مقادیر جدید به ax bx/ میدهیم و بعد از آن یکسری دستورات دیگر هستند … . در سطر ۱۰ مقدار BX از داخل Stack بیرون کشیده میشود . توجه داشته باشید که bx را بعد از ax در پشته قرار داده ایم ولی در هنگام خارج کردن به ترتیب عکس عمل میکنیم .
    بعلاوه دستور PUSHF به معنی PUSH FLAGS ، ثبات پرچم را در پشته قرار میدهد . نحوه کار با آن هم مثل PUSH معمولی است ولی آرگومان ندارد .

    مثال :