Download presentation
Presentation is loading. Please wait.
1
فصل پنجم انشعاب و حلقه
2
فهرست مطالب فصل پنجم پرش های غیر شرطی پرش های شرطی دستورالعمل مقایسه
حلقه تکرار For در زبان اسمبلی دستورالعمل JCXZ دستورالعملهای LOOPNZ , LOOPZ دستورالعمل LEA
3
پرش های غیر شرطی JMP STATEMENT – LABEL
دستور JMP شبیه goto در پاسکال می باشد. این دستور دارای فرم زیر است : JMP STATEMENT – LABEL
4
مثال : JMP QUIT . QUIT : MOV AL , 0
به محض اجرای دستورالعمل JMP کنترل بدون هیچ قید و شرطی به دستورالعمل MOV منتقل شده و دستورالعمل MOV اجرا می گردد. JMP QUIT . QUIT : MOV AL , 0
5
اگر شرايط مختلفي وجود داشته باشد که تحت آن شرايط برنامه بايد خاتمه پيدا کند، ميتوان به يک دستور اجرايي که به وسيله برچسب quit: مشخص شده است و محل اختتام برنامه ميباشد، پرش نمود.
6
فرمهاي درون سگمنتي وقتي توليد ميشوند که مقصد در درون سگمنت جاري قرار داشته باشد، اين فرمها در بين انواع ديگر از همه رايجتر ميباشند. پرشهاي بين سگمنتي که به عبارتي به يک سگمنت کد ديگر پرش ميکنند، به ندرت مورد نياز ميباشند. ( در مدل حافظه تخت اتفاق نمی افتد) پرشهاي غيرمستقيم مقدار جابجايي خود از دستورالعمل مقصد را، از يک ثبات يا از يک کلمه در حافظه به دست ميآورند. پرشهاي درون سگمنتي نسبي، از انواع ديگر معمولتر بوده و بيشتر مورد استفاده قرار ميگيرند.
7
نکته : در زبان اسمبلی معمولا STATEMENT – LABEL را با دستورالعمل NOP استفاده می کنند دستورالعمل NOP هیچ کاری انجام نمی دهد. مثال : QUIT : NOP MOV AL , 0
8
هرکدام از اين دستورالعملهاي jump شامل يک جابجايي از مقصد نسبت به خود دستور ميباشند. اين مقدار جابجايي به آفست دستوربعدي اضافه ميشود تا آفست مقصد به دست ميآيد.
9
در زماني که پرش به قبل از دستور jmp باشد، MASM ميتواند تعيين کند که مقصد کجاست و در صورت امکان از يک مقدار جابجايي کوتاه استفاده ميکند. زماني که پرش به بعد از دستور JMP باشد، ماکرواسمبلر مقدار جابجايي دستور مقصد را نميداند و بايد تصميم بگيرد که چه مقدار فضا براي JMP قرار دهد، بنابراين فضاي جابجايي 16 بيتي را براي آن در نظر ميگيرد. اگر جابجايي، فقط به يک بايت نياز داشته باشد، به جاي بايت اضافي، دستورالعمل NOP را قرار ميدهد. اين دستور هيچ کاري انجام نميدهد و فقط يک بايت را اشغال ميکند.
10
زماني که بخواهيم به دستوري بعد از دستور JMP پرش کنيم و بدانيم که اين دستور داراي فاصله زيادي نميباشد ميتوانيم به وسيله عملوند SHORT به ماکرواسمبلر بگوييم که از مقدار جابجايي کوتاه استفاده کند. بدين ترتيب يک بايت در کد هدف صرفهجويي ميشود.
11
انواع پرش مستقیم نسبی درون سگمنت کوتاه نسبی درون سگمنتی غیر مستقیم درون سگمنتی مستقیم بین سگمنتی غیر مستقیم بین سگمنتی
12
پرشهای شرطی پرشهای شرطی به برنامه نویس این امکان را می دهد که ساختارهای IF و سایر ساختارهای کنترلی را ایجاد نماید. شکل کلی بصورت زیر می باشد: J TARGET _ STATEMENT تعیین کننده وضعیتی است که تحت آن ، پرش اجرا می شود. اگر شرط تحقق یابد، پرش صورت خواهد گرفت، در غیر این صورت دستورالعمل بعدی اجرا خواهد گردید.
13
دستورالعملهاي پرش شرطي در وضعيت فلگها، تغييري ايجاد نميکنند و فقط نسبت به وضعيت آنها عکسالعمل نشان مي دهند.
14
مثال : JZ END _ WHILE این دستورالعمل بدین معنی است که اگر فلگ ZF برابر، یک باشد کنترل به دستورالعمل با برچسب END _ WHILE منتقل می گردد در غیر این صورت کنترل به دستورالعمل بعدی می رود.
16
دستورالعمل مقایسه برای مقایسه دو مقدار از دستورالعمل CMP استفاده می گردد. شکل کلی عبارتند از : CMP OPR1 , OPR2 دستورالعمل CMP مانند دستورالعمل SUB عمل نموده ولی نتایج در جایی ذخیره نمی شود بلکه محتوی فلگ ها را تغییر می دهد.
17
همه دستورات زير مجاز هستند:
Cmp ax,356 Cmp pattern,0D3a6h cmp bh,'$' توجه داشته باشيد که يک عملوند بلاواسطه بايد دومين عملوند باشد؛ به اين دليل، دستورالعمل زير مجاز نيست Cmp 100,total ;illegal
18
راه تشخيص کوچکتر بودن يک عملوند از عملوند ديگر آن است که فلگ علامت و فلگ سرريزي را مقايسه کنيم؛ در زماني که operand_1 کوچکتر از operan_2 باشد، اين فلگها متفاوت با يکديگر هستند و زماني که operand_1 بزرگتر operand_2 باشد، اين فلگها وضعيت مشابهي خواهند داشت. برابری را با فلگ صفر چک میکنیم.
19
در بسياري از اين پرشها رابطه بين دو عملوند دستورالعمل cmp موردنظر ميباشد و نه وضعيت فلگها.
وقتي اولين عملوند در حافظه باشد، دستورات cmp به پالسهاي ساعت کمتري نسبت به دستورالعملهاي sub مربوطه نياز دارند، زيرا نيازي به ذخيره کردن نتيجه نخواهد بود.
20
براي تعيين نامساويها دوسري نام وجود دارد و اينها کدهاي ماشين متفاوتي را توليد ميکنند. يکسري از آنها بيشتر به فلگ رقم نقلي توجه دارند و بنابراين متناسب کار با اعداد بيعلامت ميباشند. مجموعه ديگر پرشهاي شرطي براي تعيين ترتيب به فلگ علامت و فلگ سرريزي توجه دارند.
21
هيچ شکل جايگزين ديگري براي دستورالعملهاي پرش شرطي جهت پرشهاي طولانيتر وجود ندارد. گاهي اوقات پرشهاي شرطي بايد با پرشهاي غيرشرطي ترکيب شوند تا به هدفهايي که در فواصل طولانيتر قرار دارند برسيم.
22
نکته : نام دستورالعمل معنی فلگها برای پرش Ja پرش در حالت بالاتر
پس از دستور CMP در صورتی که عملوندها بدون علامت در نظر گرفته شوند از دستورالعملهای پرش شرطی زیر می توان استفاده نمود : نام دستورالعمل معنی فلگها برای پرش Ja پرش در حالت بالاتر CF=0,ZF=0 Jnbe پرش در حالت پایین یا مساوی نبودن Jae پرش در حالت بالاتر یا مساوی CF=0 یا ZF=1 Jnb پرش در حالت پایین تر نبودن Jb پرش در حالت پایین تر CF=1 Jnae پرش در حالت بالاتر یا مساوی نبودن Jbe پرش در حالت پایین تر یا مساوی ZF=1 یا CF=1 Jna پرش در حالت بالاتر نبودن Je پرش در حالت مساوی ZF=1 Jne پرش در حالت مساوی نبودن
23
نکته : پس از دستور CMP در صورتیکه عملوندها با علامت در نظر گرفته شوند از دستورالعملهای پرش شرطی زیر می توان استفاده نمود : نام دستورالعمل معنی فلگها برای پرش Jg پرش در حالت بزرگتر SF=OF,ZF=0 Jnle پرش در حالت کوچکتر یا مساوی نبودن Jge پرش در حالت بزرگتر یا مساوی SF=OF Jnl پرش در حالت کوچکتر نبودن Jl پرش در حالت کوچکتر SF<>OF Jnge پرش در حالت بزرگتر یا مساوی نبودن Jle پرش در حالت کوچکتر یا مساوی 1=ZF یا SF<>OF Jng پرش در حالت بزرگتر نبودن
24
پيادهسازي حلقههاي while، until و for
While: . ;code to check Boolean expression . Body: . ;loop body Jpm While ;go check condition again End_While
25
شرط ادامه که يک عبارت بولي است در ابتدا بررسي ميگردد، چنانچه صحت داشته باشد، آنگاه بدنه حلقه اجرا ميشود و دوباره شرط ادامه بررسي ميشود. هر زماني که عبارت بولي صحت نداشته باشد، اجرا با دستورالعمل بعد از end_While ادامه پيدا ميکند. البته اگر بدنه حلقه بيش از 127 بايت طول داشته باشد هيچکدام از اين عبارتها صحيح نخواهد بود زيرا پرش نسبي خارج از محدوده مجاز خواهد بود.
26
غالباً شرط ادامه در يک حلقه While ساده نبوده و داراي دو قسمت است که به وسيله عملگرهاي بولي and يا or با يکديگر ترکيب ميشوند. در عملگر and هر دو عملوند بايد صحت داشته باشند تا کل شرط صحت داشته باشد و در عملگر or فقط زماني نتيجه عملگر or صحت ندارد که هر دو عملوند آن صحت نداشته باشد.
27
گاهي اوقات پردازش يک حلقه تا زماني که با مقادير نرمال برخورد شود، بايد ادامه پيدا کند و وقتي با مقدار خاصي برخورد ميشود، متوقف ميگردد. يک مزيت زبان اسمبلي آن است که قابليت انعطاف بيشتري در برنامهنويسي وجود دارد.
28
طرح زير ميتواند براي گرفتن دادهها از صفحه کليد به کار رود:
While واردشده از صفحه کليد برابر مقدار موردنظر نيست) value) loop . . . [بدنه حلقه] End While;
29
در ماکروي atoi چنانچه کاراکتر اسکي به عدد منفي تبديل شود فلگ علامت (SF) يک ميشود و در غير اينصورت صفر ميگردد. بدنه حلقه for، حلقهاي که به وسيله يک شمارنده کنترل ميشود، براي هر مقدار شاخص حلقه در يک محدوده معين يکبار تکرار ميشود. براي حلقهاي for در زبان اسمبلي، شاخصهاي معمولاً اعدا صحيح هستند.
30
براي مواردي مطلوبست که تعداد دفعات تکرار از قبل معلوم باشد.
For شاخص : = مقدار ابتدايي to مقدار انتهايي loop . . . {بدنه حلقه} End for: بک حلقه for به راحتي ميتواند به ساختار while ترجمه گردد.
31
يک حلقه until ميتواند به صورت زير بيان شود:
until شرط خاتمه loop . . . {بدنه حلقه} End until; بدنه حلقه حداقل يکبار اجرا شده و سپس شرط خاتمه بررسي ميشود. اگر شرط خاتمه برقرار نباشد بدنه حلقه دوباره اجرا ميشود و اگر برقرار باشد، اجرا برنامه از دستورات بعد از end until ادامه پيدا ميکند.
32
ساختارهاي حلقهاي ديگر نيز ميتوانند به زبان اسمبلي پيادهسازي گردند
ساختارهاي حلقهاي ديگر نيز ميتوانند به زبان اسمبلي پيادهسازي گردند. حلقه forever اغلب مفيد است و در هر جايي که به کار رود، هميشه داراي يک جمله خروج براي انتقال کنترل به انتهاي حلقه ميباشد، اين جمله اغلب شرطي است مثل يک دستورالعمل if .
33
Forever loop . if (respons='s') or (response = 's') then exit loop endif; end loop;
34
حلقه تکرار For در زبان اسمبلی
در حلقه تکرار FOR اغلب تعداد دفعاتی که بدنه حلقه باید اجرا شود از قبل معین می باشد. در زبان اسمبلی این تعداد را بایستی در ثبات CX قرار داد و دستورالعمل تکرار دستورالعمل LOOP می باشد. شکل کلی عبارتست از: LOOP Statement _ label
35
مثال : MOV CX , 10 LABI : _ _ LOOP LAB1 دستورالعملهای فوق باعث میشود که بدنه حلقه تکرار 10 بار اجرا گردد. هر بار که دستورالعمل LOOP اجرا می شود یک واحد از محتوی CX کم می شود. شرط خاتمه تکرار این است که تعداد ثبات CX برابر با صفر گردد.
36
شرط ادامه که يک عبارت بولي است در ابتدا بررسي ميگردد، چنانچه صحت داشته باشد، آنگاه بدنه حلقه اجرا ميشود و دوباره شرط ادامه بررسي ميشود. هر زماني که عبارت بولي صحت نداشته باشد، اجرا با دستورالعمل بعد از end_While ادامه پيدا ميکند. البته اگر بدنه حلقه بيش از 127 بايت طول داشته باشد هيچکدام از اين عبارتها صحيح نخواهد بود زيرا پرش نسبي خارج از محدوده مجاز خواهد بود.
37
غالباً شرط ادامه در يک حلقه While ساده نبوده و داراي دو قسمت است که به وسيله عملگرهاي بولي and يا or با يکديگر ترکيب ميشوند. در عملگر and هر دو عملوند بايد صحت داشته باشند تا کل شرط صحت داشته باشد و در عملگر or فقط زماني نتيجه عملگر or صحت ندارد که هر دو عملوند آن صحت نداشته باشد.
38
گاهي اوقات پردازش يک حلقه تا زماني که با مقادير نرمال برخورد شود، بايد ادامه پيدا کند و وقتي با مقدار خاصي برخورد ميشود، متوقف ميگردد. يک مزيت زبان اسمبلي آن است که قابليت انعطاف بيشتري در برنامهنويسي وجود دارد.
39
طرح زير ميتواند براي گرفتن دادهها از صفحه کليد به کار رود:
While واردشده از صفحه کليد برابر مقدار موردنظر نيست) value) loop . . . [بدنه حلقه] End While;
40
در ماکروي atoi چنانچه کاراکتر اسکي به عدد منفي تبديل شود فلگ علامت (SF) يک ميشود و در غير اينصورت صفر ميگردد. بدنه حلقه for، حلقهاي که به وسيله يک شمارنده کنترل ميشود، براي هر مقدار شاخص حلقه در يک محدوده معين يکبار تکرار ميشود. براي حلقهاي for در زبان اسمبلي، شاخصهاي معمولاً اعدا صحيح هستند.
41
براي مواردي مطلوبست که تعداد دفعات تکرار از قبل معلوم باشد.
For شاخص : = مقدار ابتدايي to مقدار انتهايي loop . . . {بدنه حلقه} End for: بک حلقه for به راحتي ميتواند به ساختار while ترجمه گردد.
42
يک حلقه until ميتواند به صورت زير بيان شود:
until شرط خاتمه loop . . . {بدنه حلقه} End until; بدنه حلقه حداقل يکبار اجرا شده و سپس شرط خاتمه بررسي ميشود. اگر شرط خاتمه برقرار نباشد بدنه حلقه دوباره اجرا ميشود و اگر برقرار باشد، اجرا برنامه از دستورات بعد از end until ادامه پيدا ميکند.
43
ساختارهاي حلقهاي ديگر نيز ميتوانند به زبان اسمبلي پيادهسازي گردند
ساختارهاي حلقهاي ديگر نيز ميتوانند به زبان اسمبلي پيادهسازي گردند. حلقه forever اغلب مفيد است و در هر جايي که به کار رود، هميشه داراي يک جمله خروج براي انتقال کنترل به انتهاي حلقه ميباشد، اين جمله اغلب شرطي است مثل يک دستورالعمل if .
44
Forever loop . if (respons='s') or (response = 's') then exit loop endif; end loop;
45
حلقههاي for در زبان اسمبلي: دستورالعمل loop داراي شکل زير ميباشد:
Loop statement_label در اين دستور statement_label، برچسب دستورالعملي است که داراي يک جابجايي کوتاه نسبت به دستور loop است. دستور loop باعث ميشود که اعمال زير صورت پذيرند: مقدار ثبات CX کاهش پيدا ميکند. اگر مقدار ثبات CX صفر باشد، آنگاه اجرا از اولين دستور بعد از دستورالعمل loop ادامه پيدا ميکند. اگر مقدار ثبات CX صفر نباشد، آنگاه پرش به آدرسي که statement_label مشخص ميکند، صورت ميگيرد.
46
for حلقه های ابتدای شروع حلقه اندیس حلقه مقدار دهی شده
دستور مقایسه در ابتدای حلقه اندیس را با مقدار انتهایی مقایسه و درصورت رسیدن به مقدار نهایی به دستورالعما انتهایی پرش میکند در داخل حلقه اندیس افزایش یا کاهش می یابد یک پرش غیر شرطی به ابتدای حلقه
47
دستورالعمل loop به دو بايت کد هدف نياز دارد، بايت اول، بايت کد عمل است و دومين بايت مقدار جابجايي به دستورالعمل مقصد ميباشد. دستور Loop وضعيت هيچ فلگي را تغيير نخواهد داد. دراين دستورالعملها هيچ ثبات ديگري نميتواند به جاي CX به کار برود. در عمل اين به آن معني است که وقتي دستورالعمل LOOP به کار ميرود، ثبات CX نميتواند به منظورهاي ديگر به کار برده شود.
48
دستورالعمل JCXZ دستورالعمل JCXZ یک نوع پرش می باشد. منتهی پرش روی فلگی انجام نمی شود بلکه چنانچه ثبات CX برابر با صفر باشد پرش انجام می شود.شکل کلی بصورت زیر می باشد : اين دستور همانند دستورالعملهاي پرشي ديگر به دو بايت کد هدف نياز دارد و بر روي فلگها هيچ اثري نميگذارد. JCXZ Statement _ label
49
مثال : MOV CX , 50 LABI: . . DEC CX JCXZ LABEND JMP LABI LABEND: دستورالعملهای فوق باعث میشود که بدنه دستورالعمل تکرار 50 بار اجرا گردد.
50
از آنجايي که دستورالعمل dec فلگ صفر (ZF) را يک يا صفر ميکند، دستورالعمل پرش شرطي زير که کمي سريعتر ميباشد، ميتواند به جاي دستورالعمل JCXZ به کار برود.
51
دستورالعملهای LOOPNZ , LOOPZ
دستورالعملهای LOOPNZ , LOOPZ شبیه دستورالعمل LOOP بوده با این تفاوت که این دو دستورالعمل بعد از دستورالعمل CMP در بدنه تکرار استفاده می گردند. شکل کلی عبارتند از: LOOPZ Statement _ label LOOPNZ Statement _ label
52
LOOPNZ چنانچه مقدار جدید در ثبات CX صفر نباشد و فلگ صفر برابر صفر باشد، دستورالعمل LOOPNZ به دستورالعملی که در Statement _ labelقرار دارد پرش می کند.
53
چنانچه مقدار جدید در ثبات CX صفر باشد
LOOPZ چنانچه مقدار جدید در ثبات CX صفر باشد و فلگ صفر، یک باشد، دستورالعمل LOOPZ به دستورالعملی که در Statement _ labelقرار دارد، پرش می کند.
54
مثال : MOV CX , 10 FOR : . CMP BX , 0 LOOPNZ FOR
55
آرايهها Lea destination,source نام lea يعني «آدرس مؤثر را بار کن» ميباشد. Destination بايد يک ثبات عمومي 16 بيتي بوده و source هرگونه رجوعي به حافظه است. آدرس source در ثبات بار ميشود.
56
دستورالعمل lea نسبت به mov قابليت انعطاف بيشتري را با توجه به نوع عملوند منبع در اختيار ميگذارد.
با استفاده از آدرسدهي غيرمستقيم ثبات ميتوان به صورت تصادفي دسترسي پيدا نمود.
57
به طور مثال، عبارت array [count] را به مجموع اضافه کن» ميتواند به ترتيب زير پيادهسازي شود، البته با اين فرض که ثبات CX به عنوان شمارنده و ثبات AX بعنوان مجموع به کار برود: Mov dx,cx ;count Dec dx ;count-1 Add dx,dx ;2*(count-1) Lea bx,nbr_array ;starting address of array Add bx,dx ;address of nbr_array [count] Add ax,[bx] ;add array [count] to sum تکنيک به کار رفته در اينجا آن است که تعداد بايتهاي قبل از عنصر موردنظر را جمع کرده و اين عدد را به آدرس شروع آرايه اضافه کرد.
58
آرايه ها در زبان اسمبلی رجیسترهای زیر برای عملیات آرایه ای در نظر گرفته شده اند SI , DI , BP ذخیره سازی آرایه ها با دستور dup در برنامه اسمبلر و با دستور DW در سگمنت داده صورت میگیرد
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.