برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

اسمبلی یاد بگیریم - 9

دستورالعمل LOOP

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


حلقه مورد نظر بین دستور loop و یک برچسب انجام میشود . برچسب ، در ابتدای حلقه
و دستور loop در انتهای آن قرار میگیرد.


MOV CX/100
LPCNT :
:
:
:
LOOP LPCNT


در بالا با mov cx/100 میخواهیم حلقه ای داشته باشیم که 100 بار انجام بشود. وقتی
به loop lpcnt میرسیم ، یکواحد از مقدار CX کاسته شده و مجددا به lpcnt پرش
میکنیم .
به همین سادگی ! .
تمرین : برنامه ای بنویسید که کاراکتر های با کد اسکی 32 تا 255 را نمایش دهد.

راهنمائی :
چون همیشه CX در حال کاهش است ، برای اینکه بتوانیم از 32 تا 255 برویم ، باید
عدد داخل CX را برابر 31=224-َ255 قرار بدهیم تا تعداد 254 حرف چاپ بشود. سپس
مقدار CX را از 255 کم کرده و داخل AL قرار میدهیم تا با تابع 0Eh ار وقفه 10h
چاپ شود . این وقفه را در برنامه 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


مثال :


1] 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


در سطر 3وَ4 مقادیر axو bxو را به پشته میفرستیم . در سطر 5و 6و مقادیر جدید به ax
bx/ میدهیم و بعد از آن یکسری دستورات دیگر هستند ... . در سطر 10 مقدار BX
از داخل Stack بیرون کشیده میشود . توجه داشته باشید که bx را بعد از ax در پشته
قرار داده ایم ولی در هنگام خارج کردن به ترتیب عکس عمل میکنیم .

بعلاوه دستور PUSHF به معنی PUSH FLAGS ، ثبات پرچم را در پشته قرار میدهد . نحوه
کار با آن هم مثل PUSH معمولی است ولی آرگومان ندارد .
مثال : PUSHF


در قسمت بعد، این مطالب را تمرین میکنیم و چند برنامه نمونه میبینیم ، حتی
یک برنامه گرافیکی با 256 رنگ مینویسیم و در آن از دستورات LOOPو PUSHو
استفاده میکنیم .

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد