پرشهای غیر شرطی
ے اگر با زبانهائی مثل Basicیا Pascalا برنامه نویسی کرده باشید حتما از دستور Goto
ے هم استفاده کرده اید . بوسیله این فرمان ، ما میتوانستیم روال اجرای برنامه را به
یک نقطه مشخص انتقال بدهیم بدون اینکه نیاز به برقراری شرط خاصی باشد .
در زبان اسمبلی هم چنین دستوری داریم : دستورالعمل JMP (مخفف JUMP) .
دستور JMP به این شکل استفاده میشود:
برچسب JMP
ے منظور از برچسب مکانی از برنامه است . در اسمبلی برای اینکه یک نقطه از برنامه
ے را علامت بزنیم ، نام برچسب مورد نظر را مینویسیم و برای اینکه اسمبلر آن را با
ے یک دستورالعمل اجرائی اشتباه نکند، کاراکتر (:) را در مقابل آن قرار میدهیم
مانند: :Start
سپس میتوانیم با دستور JMP به آنحا پرش کنیم : Start :
:
:
Jmp Start
دقت کنید که بعد از Start ی که در مقابل JMP نوشتیم علامت : قرار نداده ایم .
ے این JMP ها از نوع JUMP NERA هستند و نوعی دیگر بنام JUMP FAR هم داریم که بزودی
آن را هم یاد میگیریم .
ے مثال : برنامه ای که در مثالهای قبل نوشتیم را در نظر بگیرید . اگر ما از روی
دستورالعملهای برنامه با JMP پرشی انجام دهیم هیچکدام از آن کدها اجرا نخواهندشد:
۱] JMP Quit _
2] mov ax/0E07h
3] int 10h
4] Quit :_
5] int 20h
برنامه از روی سطرهای ۲وَ۳ پرش خواهد کرد .
ثبات پرچم (Flags)
ے ثبات پرچم یک ثبات ۱۶ بیتی است که ۱یا ۰ا بودن بیتهای آن نشانه درست یا
ے نادرست بودن یک شرط است . مثلا اگر با دستورالعمل خاصی (میخوانیم ) تست کنیم
که آیا ثبات BX مقدار ۰ را دارد ، در این صورت بیت ۶ برابر ۰ میشود و … .
از این ۱۶ بیت فقط ۹ بیت استفاده میشود که به شرح زیر هستند :
۱۶ ۱۵ ۱۴ ۱۳ ۱۲ ۱۱ ۱۰ ۹ ۸ ۷ ۶ ۵ ۴ ۳ ۲ ۱ ۰
* * * * * O D I T S Z * A * P * C
علامت * به معنای بی استفاده بودن است .
ے ۱- پرچم نقلی یا (CF) . بیت ۰ در نتیجه اجرای وقفه ها یا بعضی اعمال حسابی تغییر
میکند .
ے ۲-پرچم توازن (ZF) . بر اساس یک عمل مقایسه ای یا حسابی تغییر میکند . اگر
نتیجه یک عبارت ۰ باشد مقدار ۱ و اگر نتیجه ۱ باشد مقدار ۰ میگیرد.
ے ۳-پرچم وقفه (IF) . اگر ۰ باشد هیچ وقفه ای نمیتواند اجرا شود و اگر ۱ باشد
میتوان وقفه ها را فراخوانی کرد .
ے و … . ۶ پرچم دیگر را فعلا لازم نداریم بنا براین توضیحی برای آنها ارائه
نمیکنیم .
دستور مقایسه ای CMP
ے برای مقایسه مقادیراز دستور CMP (مخفف CoMPare) استفاده میکینم . این دستور
ے مقدار داخل یک ثبات یا متغیر را با مقداری دیگر مقایسه کره و روی ثبات های
ے CFو ZFو تاثیر میگذارد . بعد از مقایسه میتوانیم بر حسب وضعیت پرچمها پرش
لازم را انجام دهیم .
ے مثلا CMP BX/0 تست میکند که آیا مقدار BX برابر ۰ است یا نه . در صورتی که برابر
۰
باشد ،پرچم ZF برابر ۱ میشود .
با همین دستور CMP میتوانیم کوچکتر،بزرگتر و …. را هم تست کنیم .
پرشهای شرطی
برای پرشهای شرطی از دستورهای زیر درست مثل JMP استفاده میکنیم .
ے JE/JZ : اگر محتوای ZF صفر باشد جهش میکند . اگر دو مقداری که مقایسه کرده ایم
برابر باشیند پرش انجام میشود.
ے JNE/JNZ : برعکس JZو JEو هستند و اگر ZF یک باشد (بعبارتی دو مقداری که مقایسه
کردیم برابر نباشند) جهش انجام میشود.
ے JA/JNBE . اگر محتوای ثبات یا متغیری که مقایسه کرده ایم بزرگتر از عدد مورد نظر
باشد پرش انجام میدهد . مثلا :
mov bh/1
cmp bh/10
ja Dest
ے مقدار BH برابر ۱ است و در سطر دوم تست آن را با ۱۰ مقایسه میکنیم . در سطر سوم
چون BH بزرگتر از ۱ نیست ، پس پرش JA Dest انجام نمیشود .
JAE/JNB . اگر بزرگتر یا مساوی باشد ، پرش انجام میشود.
JB/JNAE: در صورتی که کوچکتر باشد پرش انجام میشود.
JBE : در صورتی که کوچکتر یا مساوی باشد پرش انجام میشود .
مثال :
ے میخواهیم برنامه ای بنویسیم که تمام کاراکترهای بین ۱۲۸ تا ۲۵۵ را
چاپ کند.
. MODEL SMALL
. CODE
ORG 100H
START :
کاراکتر ۱۲۸ برای شروع ; MOV CH/128 CHARS :
کداسکی را درAL قرار میدهیم تا چاپ شود ; MOV AL/CH
سرویس ۰Eh برای چاپ کاراکتر ; MOV AH/0EH
اینتراپت ۱۰h ; INT 10H
یکواحد به CH اضافه کن ; INC CH
مقایسه CH با ۲۵۵ ; CMP CH/255
اگر مساوی نباشد به CHARS پرش میکند ; JNZ CHARS
پایان ; INT 20H END START
ے تمام برنامه ساده و روشن است ولی در سطر آخر نکته جدیدی وجود دارد . بعد از
ے END نام برچسب Start را آورده ایم . نکته ای که در نوشتن برنامه های اسمبلی باید
ے مراعات کنیم اینست که : اگر از برچسبی در برنامه استفاده میکنیم ، اسمبلر باید
ے یک برچسب را به عنوان نقطه آغاز کدبرنامه ببیند . به همین خاطر علاوه بر برچسب
ے CHARS یک برچسب بنام Start هم در ابتدای برنامه تعریف کرده و برای اینکه
ے اسمبلر بداند مما کدام برچسب را برای انیکار اینخاب کرده ایم ، نام آن را در
مقابل END می آوریم ، یعنی END START .
ے نکته دیگر اینکه ، در اسمبلر هر چیزی که بعد از کاراکتر (;) باشد ، توضیح
ے (Comment) فرض شده و اصلا ترجمه نمیشود . (مثل REM در بیسیک و .. ) . هر comment
ے باید در یک سطر جای داده شود و اگر از این مقدار بیشتر بود میتوانیم در سطر بعد
هم یک کاراکتر (;) درج کرده و ادامه توضیحات را بعد از آن بیاوریم .
پایان یخش هفتم
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن