دستورالعمل 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 معمولی است ولی آرگومان ندارد . مثال :