Assembly 1

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Assembly 1 as PDF for free.

More details

  • Words: 11,781
  • Pages: 199
ASSEMBLY

: ‫روش نوشتن برنامه‬ .Dos ‫ در‬Debug ‫ دستور‬.I .Turbo Asembler ،Macro Asembler ‫ استفاده از‬.II Editor

asm. ‫ذخیره با نامی با پسوند‬ Test.asm ‫مثل‬

‫یک ویرایشگر متن‬ )asm. ( ‫تایپ برنامه‬

Compile

object

Link

.com , .exe

:‫ برنامه‬Compile Tlink ،Tasm .I .Exe2bin ،Link5 ،Masm5 .II

‫استفاده از حالت اول‬ 1.c:\ asm> tasm test ; / l / zi ‫خروجی‬ 2. c:\asm> tlink test ; /t /v ‫خروجی‬

Test.obj Test.exe Test.com

‫نکته ‪ :‬پسوند اغلب برنامه ها در ‪ windows ،.com‬است‪ .‬چون‬ ‫فایلها با پسوند ‪ ، com.‬فقط ‪ KB 64‬از حافظه را اشغال می کنند و‬ ‫باع ث م ی شون د بقی ه حافظ ه در اختیار س یستم عام ل قرار گیرد تا‬ ‫برنامه های دیگر‪ ،‬بتوانند اجرا شوند‪.‬‬ ‫; ‪ :‬درهنگام استفاده از ‪ ،tasm‬فقط فایل ‪ Compile‬می شود و حق‬ ‫استفاده از هیچ سوئیچی را نداریم و ‪........‬‬ ‫‪ : l/‬استفاده ازین سوئیچ‪ ،‬باعث می شود فایلی با پسوند ‪ bat.‬ساخته‬ ‫شود که شامل‪ :‬برنامه بصورت قبل از ‪ obj‬بطوری که درصورت‬ ‫وجود خطا‪ ،‬خط ها در زیر هر دستور مشخص می باشد‪ .‬با فهمیدن‬ ‫خط ا در فای ل اص لی ب ا پس وند ‪ asm.‬خط ا را رفع کرده و دوباره‬ ‫‪ tasm‬را اجرا می نمائیم‪.‬‬

‫‪ : zi/‬این سوئیچ باعث می شود یک سری ‪ Symbol‬هایی به فایل‬ ‫‪ obj , .exe.‬اضاف ه م ی شود ک ه هنگام اس تفاده از ‪ TD‬بتوانیم‬ ‫‪ Source‬واقع ی برنام ه خود را مشاهده م ی نماییم‪ .‬مکم ل این‬ ‫سوئیچ‪ ،‬سوئیچ ‪ v/‬در ‪ Tlink‬می باشد‪.‬‬ ‫‪ : t/‬اگر از سوئیچ استفاده کنیم در صورتی که فایل با ساختار‬ ‫‪ com‬نوشته شده باشد‪ ،‬آن را مستقیما به فایل اجرایی با توسعه‬ ‫‪ com.‬تبدیل می کند‪.‬‬ ‫‪ : v/‬این سوئیچ در فایلهای اجرایی ‪ exe.‬مورد استفاده قرار می‬ ‫گیرد‪ ،‬و نقش آن به عنوان مکمل سوئیچ ‪ zi/‬در ‪ tasm‬می باشد‪.‬‬

‫توجه‪ :‬فای ل ‪ Test‬با پسوندهای ‪ exe , .bat , .com.‬وجود‬ ‫دارد‪ .‬الویت اجرای فایل ‪ Test‬با پسوندهای ذکر شده به صورت‬ ‫زیر خواهد بود‪:‬‬ ‫‪1. test.com‬‬ ‫‪2. test.exe‬‬ ‫‪3. test.bat‬‬

‫استفاده از حالت دوم‬

‫‪1.c:\ asm> masm5 test ; / t‬‬ ‫خروجی‬

‫‪Test.obj‬‬

‫; ‪2. c:\asm> link5 test‬‬ ‫خروجی‬ ‫‪Test.exe‬‬ ‫‪3. c:\asm> exe2bin test.exe test.com‬‬ ‫در صورتی که بخواهیم فایل با ساختار ‪ com‬باشد‪.‬‬

‫توجه‪ :‬بایستی تمام نرم افزارها‪ ،‬در یک مسیر باشند و ما در همان‬ ‫مسیر کار کنیم‪.‬‬ ‫]‪C:\asm> TD [filename.exe or filename.com‬‬ ‫نکته‪ ،TD :‬فقط برای فایلهای اجرایی (‪ )com , .exe.‬است‪ .‬یعنی‬ ‫برنامه هیچ خطایی نداشته باشد و فایل نیز اجرایی باشد‪.‬‬ ‫‪Menu box‬‬

‫‪Z‬‬ ‫‪s‬‬ ‫‪p‬‬ ‫‪t‬‬ ‫‪I‬‬ ‫‪c‬‬

‫‪Ax‬‬ ‫‪bx‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪Ip‬‬ ‫‪sp‬‬

‫‪SS:‬‬ ‫‪Stack segment‬‬

‫ثباتها‬

‫‪CS: code segment‬‬

‫ثباتهای ‪Flag‬‬

‫‪DS: data segment‬‬

‫برنامه ‪ ،TD‬محیطی شبیه زبان ‪ C‬دارد‪.‬‬ ‫• کلید ‪ F9‬عمل ‪ Run‬انجام می شود‪.‬‬ ‫• کلید ‪ ،F4‬عمل اجرای برنامه‪ ،‬از ابتدای برنامه تا محل کنونی‬ ‫مکان نما را انجام میدهد‪.‬‬ ‫• کلید ‪ ،F7‬می توان برنامه را دستور به دستور اجرا کرد‪( .‬حتی‬ ‫دستورات درون روالها را نیز اجرا می کند)‪.‬‬ ‫• کلید ‪ ،F8‬عمل اجرای دستور به دستور برنامه را انجام می دهد‪.‬‬ ‫(با این تفاوت که روالها در یک ؟ اجرا می کند)‪.‬‬

‫دستور العمل از یک سری کد تشکیل شده است‪ .‬خواهیم دید که‬ ‫زبان ماشین‪ ،‬متشکل از دستورالعمل هایی است که هر کدام با یک‬ ‫کد مشخ ص م ی شوند ‪ .‬که ای ن کده ا‪ ،‬توس ط ارقام ‪ ،0,1‬ب ه واحد‬ ‫پردازشگر مرکزی ارسال می شوند‪.‬‬ ‫در ص ورتی ک ه بخواهی م برنام ه ای را ب ه زبان ماشی ن بنویسم‪،‬‬ ‫بایستی تمام دستورالعمل ها و اطلعات را به صورت کد ‪ 0,1‬به‬ ‫واح د پردازشگ ر مرکزی ارس ال کنیم‪ .‬ام ا برنام ه نویس ی ب ه این‬ ‫طریق مشکل است‪ ،‬بنابراین زبانی به نام زبان اسمبلی ابداع شد ‪.‬‬ ‫که هر یک از دستورالعمل های آن‪ ،‬معادل یک دستورعمل زبان‬ ‫ماشین می باشد‪ .‬بنابراین یک زبان سطح پایین می باشد‪.‬‬ ‫اما با استفاده از زبان اسمبلی می توان از تمامی امکانات سیستم‬ ‫استفاده کرد‪ .‬در ‪ CPU‬قسمتهایی به نام ثبات ‪ Register‬وجود دارد‪.‬‬

‫گروه بندی ثباتها‪:‬‬ ‫‪ -1‬ثباتهای عمومی‪ :‬ازاین ثباتها بیشترازثباتهای دیگردراسمبلی‬ ‫استفاده می شود و تعداد این ثباتها‪ ،‬چهارعدد می باشد که با نامهای‬ ‫‪ DX , CX , BX , AX‬قابل دستیابی می باشند‪.‬‬ ‫هریک ازاین ثباتها‪ ،‬خود به دو دسته تقسیم می شوند‪:‬‬ ‫‪Ah‬‬ ‫‪Al‬‬

‫‪AX‬‬

‫‪8 bit‬‬ ‫(‪AL )Low‬‬

‫‪8 bit‬‬ ‫(‪AH )high‬‬

‫بعضی از دستورالعملهای زبان ماشین‪ ،‬بطورخاص‪ ،‬نیاز به یکی‬ ‫ازاین ثباتها دارد‪ .‬اما در مورد بعضی از دستورالعملها‪ ،‬استفاده از‬ ‫هر یک از این ثباتها‪ ،‬تفاوتی نمی کند‪.‬‬

‫‪ :AX‬برای انجام محاسبات استفاده می شود‪( .‬ضرب و تقسیم)‬ ‫‪ :BX‬به عنوان ثبات پایه جهت آدرس دهی استفاده میشود‪.‬‬ ‫‪ :CX‬به عنوان ثبات شماره استفاده میشود‪.‬‬ ‫‪ :DX‬بیشتر برای عملیات رشته ای استفاده میشود‪.‬‬ ‫ناحیه ‪Segment‬‬ ‫هر آدرس از حافظه اصلی که قابل قسمت بر عدد ‪ 16‬باشد‪ ،‬یک‬ ‫ناحیه تلقی می شود‪ .‬برای آدرس دهی به حافظه اصلی‪ ،‬بدین ترتیب‬ ‫عمل می کنیم‪:‬‬ ‫ابتدا باید مشخص شود که این آدرس‪ ،‬در کدام ناحیه قرار دارد سپس‬ ‫مقدار تفاوت آن قسمت را با ابتدای ناحیه محاسبه کرده و آن را به‬ ‫عنوان آدرس ‪ Offset‬در نظر می گیریم‪ .‬سپس هر آدرس از حافظه‬ ‫را می توان با یک آدرس ‪ Segment‬و ‪ Offset‬مشخص نمود‪.‬‬

‫نکات‪:‬‬ ‫• هر یک از آدرسهای‪ Segment‬و‪ Offset‬حدود یک کلمه اند‪.‬‬ ‫• آدرس دهی برای یک بایت از حافظه منجصر به فرد نیست و‬ ‫بستگی به آدرس ‪ Segment‬دارد‪.‬‬ ‫• در هر ‪ Segment‬می توان از ‪ KB 64‬حافظه‪ ،‬استفاده کرد‪.‬‬ ‫• در زبان اسمبلی هر یک از عملیاتی که می خواهیم انجام دهیم‬ ‫باید در ثباتها انجام شود‪ .‬به عنوان مثال‪ ،‬اگر بخواهیم دو عدد را با‬ ‫هم جمع نماییم‪ ،‬عدد اول را به یک ثبات منتقل می کنیم‪ ،‬سپس عدد‬ ‫دوم را اضافه می کنیم‪.‬‬

‫ثباتهای ناحیه‬

‫‪Code Segment‬‬

‫‪1.CS‬‬

‫دستورات برنامه در این قطعه قرار دارند‪.‬‬ ‫نکته‪ :‬هر برنامه‪ ،‬لزوما باید یک ‪ CS‬داشته باشند‪ ،‬اما قسمتهای‬ ‫دیگر ضرورتی ندارند‪.‬‬ ‫‪Stack Segment‬‬

‫‪2. SS‬‬

‫آدرس های محلهای بازگشت در موقع فراخوانی زیر برنامه ها‪،‬‬ ‫در این ناحیه ذخیره می شوند‪.‬‬ ‫‪Data Segment‬‬

‫‪3. DS‬‬

‫اگر برنامه نیاز به تعریف متغییر داشته باشد‪،‬این ناحیه را داریم‪.‬‬

‫‪5. ES‬‬

‫‪Extra Segment‬‬

‫برای ذخیره اطلعات و دسترسی به حافظه فوقانی مثل ‪Video‬‬ ‫‪ Ram‬از این ناحیه استفاده می شود‪.‬‬ ‫مثال‪ :‬اگر ‪ ds=7FA2H‬و ‪ offset=438EH‬باشد‪ ،‬مطلوب است‬ ‫َ‪ )A‬محاسبه آدرس فیزیکی‬

‫‪ )B‬محاسبه آدرس منطقی‬

‫‪ )C‬تعیین پایین ترین و بالترین ‪ Rang‬آدرس دهی‬ ‫‪7FA2:438E)H( ( B‬‬

‫‪(A‬‬

‫‪Shiftl)ds(= 7FA20‬‬ ‫‪+ 438E‬‬ ‫(‪83DAE)H‬‬

‫ثباتهای شاخص‬ ‫در بعضی از دستورالعملهای زبان اسمبلی برای انتقال رشته ها‬ ‫و کار با حافظه از ثباتهای شاخص (‪ )di , si‬استفاده می کنیم و‬ ‫بسیار حائز اهمیت اند‪.‬‬

‫ثبات ‪)IP )Instruction Points‬‬ ‫ای ن ثبات آدرس دس تورالعمل جاری زبان ماشی ن که در حال‬ ‫اجرا می باشد را در خود ذخیره می کند‪ .‬با تغییر دادن این ثبات‬ ‫می توانیم کاری کنیم که برنامه از هر محل دیگری قابل اجرا‬ ‫باشد‪.‬‬

‫ثبات پرچم (‪ 16‬بیتی)‬ ‫هر یک از بیتهای این ثبات‪ ،‬در مواقع خاصی مقدار می گیرند‪.‬‬ ‫بعنوان مثال‪ ،‬این ثبات دارای بیتی به نام بیت ‪ 0‬می باشد که در‬ ‫صورت ‪ 0‬شدن نتیجه محاسبات‪ ،‬مقدار آن بیت‪ ،‬چک می شود‪.‬‬ ‫ضمنا دارای بیتی به نام ‪( OverFlow‬سرریز ) می باشد که در‬ ‫صورت سرریز شدن محاسبات‪ ،‬مقدار این بیت ‪ 1‬می شود‪.‬‬ ‫محتویات این بیتها‪ ،‬توسط زبان ماشین قابل تغییر هستند و توسط‬ ‫اکثر دستورات زبان اسمبلی‪ ،‬محتویات این بیتها تغییر می کند‪.‬‬

:‫شکل کلی این ثبات به صورت زیر است‬ 1 5

1 4

1 3

12

11 10 9

8

7

6 5 4 3 2 1 0

R R R R OF DF IF TF SF ZF U AF U PF U U

R = Rexrved

U = Undefined

OF = Overflow

ZF = Zero Flag

DF = Direction Flag

SF = Sign Flag

IF = Interrupt Flag

AF = Auxiliary Carry Flag

TF = Trap Flag

PF = Parity Flag

CF = Carry Flag

‫‪( :Carry Flag‬بیت انتقال) معمول‪ ،‬از محاسبات تاثیر می پذیرد‪.‬‬ ‫برای اعمال جمع و تفریق ازاین بیت‪ ،‬برای عدد انتقال (رقم نقلی)‬ ‫استفاده می گردد‪ .‬در اعمالی مانند ‪ Shift‬دادن بیتها‪ ،‬آخرین بیت‬ ‫‪ Shift‬داده شده‪ ،‬در این بیت قرار می گیرد‪.‬‬ ‫‪ :Parity Flag‬از این بیت‪ ،‬معمول برای اشکال زدایی در انتقال‬ ‫اطلعات استفاده می شود‪ .‬به عبارت دیگر‪ ،‬برای کنترل صحت‬ ‫اطلعات به کار میرود‪.‬‬ ‫‪ :Auxiliary Carry Flag‬از این بیت‪ ،‬به عنوان بیت جانشین‬ ‫بیت ‪ Carry‬استفاده می شود‪.‬‬ ‫‪ :Zero Flag‬در صورتی که نتیجه عمل محاسباتی ‪ 0‬شده باشد‪،‬‬ ‫مقدار این بیت‪ 1 ،‬می شود‪ .‬در غیر این صورت ‪ 0‬خواهد بود‪.‬‬

‫‪ :Sign Flag‬به معنی علمت و برای بررسی نتیجه عملیات محاسباتی‬ ‫بکار می رود ‪ .‬یعنی اگر نتیجه عملیات منفی باشد این بیت یا ثبات برابر‬ ‫با ‪ 1‬وگرنه ‪ 0‬می شود ‪.‬‬ ‫‪ :Trap Flag‬برای اجرای دستور به دستور برنامه‪ ،‬از این بیت استفاده‬ ‫می وشد‪ .‬اگر این بیت‪ 1 ،‬باشد‪ ،‬برنامه به صورت دستور به دستور اجرا‬ ‫می گردد‪.‬‬ ‫‪ :Interrupt Flag‬با استفاده از این بیت‪ ،‬می توانیم کاری کنیم که وقفه‬ ‫ها‪ ،‬فعال یا غیر فعال گردند‪.‬‬ ‫وقفه ها فعال‬

‫‪IF=1‬‬

‫وقفه ها غیر فعال‬

‫‪IF=0‬‬

‫‪ :Direct Flag‬از این بیت‪ ،‬معمول برای اعمال رشته ای استفاده می‬ ‫شود‪ .‬جهت مقایسه یا انتقال رشته ها را نیز مشخص می کند‪.‬‬ ‫‪Left to Right‬‬

‫‪DF=0‬‬

‫‪Right to Left‬‬

‫‪DF=1‬‬

‫‪ :Overflow‬در صورتی که عمل محاسباتی دارای سرریز باشد‪،‬‬ ‫مقدار این بیت‪ 1 ،‬در غیر این صورت ‪ 0‬خواهد بود‪.‬‬

‫ثبات ‪)SP )Stack Pointer‬‬ ‫این ثبات‪ ،‬آدرس ‪ Top‬پشته را بر می گرداند و در خود‪ ،‬ذخیره می کند‪.‬‬

‫ثبات ‪)BP )Base Pointer‬‬ ‫از این ثبات‪ ،‬بعنوان یک ثبات پایه‪( ،‬کار با ‪ )Stack‬استفاده می شود‪.‬‬

‫وقفه ‪Interrupt‬‬ ‫وقفه ها‪ ،‬برنامه های آماده شده ای هستند که با انتقال دادن مقادیری‬ ‫(عمل انتقال‪ ،‬توسط ثبات انجام می شود ) با آنها‪ ،‬می توانیم کارهای‬ ‫بخصوصی را انجام دهیم‪ .‬ضمنا مقادیر بازگشتی توسط وقفه ها نیز‬ ‫توسط ثباتها‪ ،‬باز می گردد‪ .‬یکی از راههای ارتباط بین برنامه نویس‬ ‫و وقفه ها‪ ،‬ثباتها می باشند‪.‬‬ ‫وقفه ها در ابتدای راه اندازی کامپیوتر‪ ،‬در حافظه اصلی مقیم می‬ ‫شوند و با ایجاد یک ‪( Signal‬علمت) خاص‪ ،‬به اجرا در می آیند‬ ‫هم چنین برنامه نویس می تواند از وقفه ها‪ ،‬برای اجرای دستوراتی‬ ‫خاص استفاده کند‪ .‬مثل با فضردن کلید ‪ Print Screen‬وقفه ایجاد‬ ‫می گردد که محتویات صفحه نمایش به چاپگر منتقل می شود‪ .‬و یا‬ ‫با فشردن کلیدهای ‪ Ctrl+Alt+Del‬کامپیوتر ‪ Reset‬می شود‪.‬‬

‫به طور کلی وقفه ها به دو گروه تقسیم نمود‬ ‫سخت افزاری‬

‫داخلی‬

‫نرم افزاری‬

‫خارجی‬

‫‪Bios‬‬

‫کاربر‬

‫سیستم‬

‫‪Dos‬‬

‫وقفه های نرم افزاری‪:‬‬ ‫وقفه هایی اند که در موقع فراخوانی یک برنامه زبان ماشین اجرا‬ ‫می گردند‪.‬‬

‫وقفه های سخت افزاری‪:‬‬ ‫وقفه هایی اند که در موقع فراخوانی آنها‪ ،‬یک عمل سخت افزاری‬ ‫انجام می شود‪( .‬مانند وقفه ‪)Timer‬‬

‫دستور ‪:Int‬‬ ‫این دستور‪ ،‬برای اجرا کردن یک وقفه استفاده می شود‪ .‬شکل کلی‬ ‫این دستور به صورت زیر است‪.‬‬ ‫‪Int‬‬ ‫شماره وقفه‬

‫نکته بسیار مهم‪:‬‬ ‫قبل از اینکه خواسته باشیم از دستور ‪ Int‬استفاده کنیم بایستی یک‬ ‫سری از مقادیر اولیه را به بعضی از ثباتها بدهیم‪ ،‬مخصوصا‬ ‫ثبات ‪ ah‬که شماره سرویس وقفه در آن قرار می گیرد‪.‬‬ ‫سرویس ها‬

‫وقفه‬

‫‪00‬‬ ‫‪01‬‬ ‫‪02‬‬ ‫‪03‬‬ ‫…‬

‫مثال‬

‫‪ =Ah .1‬شماره سرویس‬ ‫‪ .2‬استفاده از دستور‬

‫‪33H‬‬

‫‪ 00‬فعال کردن ‪mouse‬‬ ‫‪ 01‬نشان دادن ‪mouse‬‬ ‫‪02‬‬ ‫‪03‬‬ ‫…‬

‫(در صورت نیاز دادن مقادیر اولیه به بعضی از ثباتها)‬

‫شماره وقفه = ‪int‬‬

‫مثال‬ ‫برنامه ای بنویسید که نام خانوادگی تان را روی صفحه نمایش نشان‬ ‫دهد‪( .‬با ساختار ‪ com.‬در‪ Assembler‬نوشته شود)‬ ‫نکات‪:‬‬ ‫• وقفه ‪ ،21h‬مربوط به صفحه‬ ‫نمایش است‪.‬‬ ‫• آدرس رشته ای که قرار است‬ ‫چاپ شود در‪ dx‬قرار می گیرد‪.‬‬ ‫• سرویس ‪ 09h‬از وقفه ‪ 21h‬برای‬ ‫چاپ رشته بکار می رود‪.‬‬ ‫• بازگشت به ‪( dos‬اگر نباشد‬ ‫برنامه پس از اجرا قفل می کند)‪.‬‬

‫‪.Model Tiny,c,os-dos‬‬ ‫‪.286‬‬ ‫‪.code‬‬ ‫‪.startup‬‬ ‫‪Jmp l1‬‬ ‫’‪Str1 db “sharifi”,’$‬‬ ‫‪L1:‬‬ ‫‪mov dx,offset str1‬‬ ‫‪mov ah,09h‬‬ ‫‪int 21h‬‬ ‫‪.exit‬‬ ‫‪end‬‬

‫برنامه اشکال زدایی ‪Debug‬‬ ‫وسیله ای است برای اشکال زدایی برنامه ها و یا ایجاد کردن برنامه‬ ‫هایی به زبان ماشین و همچنین‪ ،‬اجرای وقفه ها و تغییر دادن ثباتها‬ ‫در کامپیوترهایی با سیستم عامل ‪ Dos‬یا ‪ Windows‬کار می کنند‪.‬‬ ‫برای اجرای این برنامه بایستی کلمه ‪ Debug‬را در جلوی اعلن‬ ‫سیستم عامل تایپ کنیم‪ .‬در صورتی که بخواهیم فایلی را اشکال‬ ‫زدایی نماییم‪ ،‬نام فایل را در جلوی این دستور نیز ذکر می کنیم‪.‬‬ ‫‪ Debug‬فقط برای اشکال زدایی فایلهای ‪ exe, .com.‬کاربرد دارد‪.‬‬ ‫پس از ورود به ‪ ،Debug‬خط تیره (_) پایین صفحه نشان دهنده‬ ‫آمادگی ‪ Debug‬برای دستورات می باشد‪.‬‬

‫دستورات مربوط به ‪Debug‬‬ ‫‪ :)R )Register‬با استفاده از این دستود‪ ،‬محتویات ثباتها را به‬ ‫همراه ؟ بیتهای ثبات ‪ Flag‬می توان بر روی صفحه نمایش مشاهده‬ ‫نمود‪ .‬اما اگر در جلوی این دستور‪ ،‬نام یک ثبات تایپ شود‪ ،‬ضمن‬ ‫نشان دادن محتویات آن‪ ،‬امکان دادن مقدار جدید را به ما خوهد داد‪.‬‬ ‫‪-R‬‬

‫مثال ‪1‬‬ ‫…… ‪ax = 0000 bx = 0010‬‬ ‫…… ‪ds = 4cf2‬‬ ‫مثال ‪2‬‬

‫‪-R cx‬‬ ‫مقدار فعلی ‪cx :‬‬

‫‪ :)H )Hex Arithmetic‬در صورتی که دو عدد در مبنای هگزاد‬ ‫دس یمال در جلوی دس تور ذک ر کنی م‪ ،‬مجموع و اختلف آنها را‬ ‫‪.‬‬ ‫کند‬ ‫می‬ ‫چاپ‬ ‫و‬ ‫محاسبه‬ ‫عدد دوم عدد اول ‪-H‬‬ ‫‪2B‬‬

‫‪5F‬‬

‫‪-H‬‬

‫کدهای ثبات وضعیت‬ Flag Of )Overflow( Df )Direction( If )Interrupt( Sf )Sign( Zf )Zero( Af )Auxiliary( Pf )Parity( Cf )Carry(

Code when set )=1( Code when reset )=0( OV )Overflow( DN )Down( EI )Enable Interrupt( NG )negative( ZR )Zero( AC)Auxiliary Carry( PE )Parity Even( CY )Carry(

NV )No Overflow( UP )Up( DI )Disable Interrupt( PL )Plus or Positive( NZ )Not Zero( NA )Not Auxiliary( PO )Parity Odd( NC )Not Carry(

‫‪ :)N )Name‬اگر بخواهیم یک فایل اجرایی را در داخل ‪،Debug‬‬ ‫اشکال زدایی کنیم و یا فایلی را به وجود آوریم و یا بر روی دیسک‬ ‫ذخیره کنیم‪ ،‬توسط این دستور می توانیم نام آن را مشخص کنیم‪.‬‬ ‫‪com.‬نام فایل ‪-N‬‬ ‫‪ :)L )Load‬پس از مشخص کردن نام فایل‪ ،‬با استفاده از این دستور‬ ‫می توان فایل را از روی دیسک خوانده و آن را آماده اشکال زدایی‬ ‫نماییم‪.‬‬ ‫‪ :)Q )Quit‬ازاین دستور‪ ،‬برای خروج از‪ ،Debug‬بدون ثبت تغییرات‬ ‫اعمال شده استفاده می شود‪.‬‬

‫‪ :)W )Write‬برای ذخیره کردن فایلی که قبل نام آن را مشخص‬ ‫کرده ایم‪ ،‬از این دستور استفاده می نماییم‪ .‬این دستور‪ ،‬به تعداد بایتی‬ ‫که تعداد آن در ثبات ‪ Cx‬قرار دارد‪ ،‬از ابتدای محل برنامه موجود‬ ‫در ‪ Debug‬بر روی دیسک ذخیره می کنیم‪.‬‬ ‫‪:0100‬‬ ‫دستورات برنامه‬ ‫نمایش محتویات ثبات ‪ cx‬و امکان‬ ‫تعویض مقدار آن‬

‫‪-R cx‬‬ ‫‪01F2‬‬ ‫‪ g‬تعداد بایت ‪:N‬‬ ‫‪-N test.exe‬‬ ‫‪-W‬‬

‫‪ :)U )Unassemble‬با استفاده از این دستور‪ ،‬می توانیم لیستی (به‬ ‫زبان اسمبلی) از دستورات موجود در حافظه را مشاهده نماییم‪( .‬اگر‬ ‫برنامهای در حافظه موجود باشد یعنی قبل ‪ Load‬شده باشد)‪ .‬شکل‬ ‫کلی این دستور به صورت زیر است‪:‬‬ ‫>‪U <Student address> <End address‬‬ ‫>‪U <Student address>
‫‪ :)A )Assembler‬شکل کلی این دستور به صورت زیر است‪:‬‬ ‫آدرس شروع ‪-A‬‬ ‫پس از وارد کردن این دستور‪ ،‬آدرس محلی را که وارد کرده ایم‪ ،‬در‬ ‫سمت چپ ظاهرشده و می توانیم در جلوی آن‪ ،‬فقط دستورات اسمبلی‬ ‫را بنویسیم‪.‬‬ ‫‪cs:offset‬‬ ‫آدرس منطقی‬ ‫‪-a 100‬‬ ‫‪ : offset‬آدرس ‪Cs‬‬

‫شماره ‪0100 :‬‬

‫‪-‬‬

‫‪ :)G )Go‬ازاین دستور برای اجرای برنامه‪ ،‬ازآدرس مشخص شده‬ ‫استفاده می شود‪ .‬شکل کلی این دستور به صورت زیرمی باشد‪:‬‬ ‫‪C:\>Debug‬‬ ‫‪-N Reset.com‬‬ ‫‪-l‬‬ ‫> ‪<=Start address> <=Stop adress‬‬ ‫اجرای دستورات از آدرس ‪ 100‬تا‬ ‫آخرین دستور موجود در حافظه‪.‬‬ ‫اجرای دستورات از آدرس ‪ 100‬تا‬ ‫آدرس ‪.112‬‬

‫‪-U 100 112‬‬ ‫‪-G = 100‬‬ ‫‪-G = 100 112‬‬

‫‪ :)T )Trap‬از این دستور‪ ،‬برای اجرا کردن و دیدن خط به خط ثباتها‬ ‫و نواحی استفاده می شود‪ .‬شکل کلی این دستور به صورت زیر است‪:‬‬ ‫> تعداد دستورات < >‪-T <= Start Address‬‬ ‫‪-T =100 5‬‬ ‫اجرای دستورات از آدرس ‪ 100‬به تعداد ‪ 5‬دستور‬

‫دستورات زبان اسمبلی‬ ‫‪ :Mov‬ازاین دستور‪ ،‬برای انتقال دادن یک مقدار به یک ثبات مورد‬ ‫استفاده قرار می گیرد‪.‬‬

‫نکاتی را بایستی برای این دستور در نظر بگیریم‪.‬‬ ‫در ‪ mov‬نمی توان ازدو متغییر استفاده کرد‪.‬‬

‫‪F‬‬

‫‪Mov x,y‬‬

‫‪ Bl‬یک بایتی‪ ،‬درحالیکه مقدار بیش از‪1‬بایت‪.‬‬

‫‪F‬‬

‫نمی توان مستقیما به ‪ ds‬مقدار داد‪.‬‬

‫‪F‬‬

‫‪Mov bl,F2F‬‬ ‫‪Mov ds,42F2H‬‬

‫شکل صحیح دستور بالیی‪.‬‬

‫‪T‬‬

‫‪Mov ax,42F2H‬‬ ‫‪Mov ds,ax‬‬

‫‪Mov di,offset area‬‬ ‫آدرس شروع ناحیه ‪ area‬در‪ DI‬قرارمی گیرد‪T .‬‬ ‫آدرس یک ناحیه ازحافظه را دریک ثبات می ریزیم‬ ‫‪Lea di,area‬‬ ‫’‪Mov al,’A‬‬ ‫اگر خواسته باشیم مقداری را به یک ثبات‬ ‫‪T‬‬ ‫نسبت دهیم‪ ،‬می توانیم نوع آن را نیز مشخص‬ ‫‪Mov al,65‬‬ ‫کنیم‪.‬‬ ‫‪Mov al,01000001B‬‬ ‫‪Mov al, 65decimal‬‬ ‫کلیه این دستورات‪ ،‬معادلند‪.‬‬ ‫‪Mov al,41hexdecimal‬‬

‫وقفه ‪ :19H‬وقفه ای است که توسط آن‪ ،‬سیستم ‪ boot‬می شود‪.‬‬ ‫وقفه ‪ :20H‬برای اتمام برنامه و بازگشت به ‪ Dos‬مورد استفاده قرار‬ ‫می گیرد‪.‬‬ ‫سرویس ‪ 4CH‬از وقفه ‪ :21H‬این سرویس‪ ،‬می تواند اجرای برنامه‬ ‫را به پایان برد و باعث بازگشت به ‪ Dos‬می شود‪(.‬وقفه ‪ 20H‬با این‬ ‫سرویس‪ ،‬معادل است)‬

C:\asm>Debug -a 100 … : 0100 int 19H … : 0102 mov ah,4CH … : 0104 int 21H … : 010b -R cx … :6 -N Reset.com -W -Q C:\asm>Dir Reset.com

‫تمرین‬ Debug ‫ برنامه ای در‬.1 ‫بنویس ید ک ه ب ا اجرای این‬ ‫ شدن‬Reset ‫ باعث‬،‫برنامه‬ ‫دستگاه شود؟‬

‫ به مختصات‬،‫برنامه ای بنویسید که یک فایل را تشکیل دهد وقسمتی ازصفحه نمایش‬ )Debug( ‫ سطر بال ببرد؟‬5 ‫ به اندازه‬،‫داده شده را‬

C:\asm>Debug 1 -a 100 … : 0100 mov ah,06H … : 0102 mov cx,aa … : 0105 mov dx,F65 … : 0108 mov al,5 … : 010a int 10H … : 010c -R cx :C -N Cls.com

-W 2 -Q :0106 int 10H :0108 int 21H :010a -R cx :A -N Curoor.com -W Writing 0000A Byte -@ c:\asm>

‫‪ .3‬با اس تفاده از دس تورات ‪ Debug‬و اس مبلی برنام ه مربوط به‬ ‫وقفه زیر را بنویسید‪:‬‬ ‫سرویس ‪ 01H‬از وقفه ‪ ،10H‬اندازه مکان نما را تغییر می دهد‪.‬‬ ‫اگر در ‪ ch‬خط شروع و در ‪ cl‬نقطه پایان مکان نما را تغییر دهیم‬ ‫و این وقفه را اجرا نمائیم اندازه مکان نما به اندازه فاصله این دو‬ ‫خط خواهد شد‪.‬‬ ‫‪-N cu.com‬‬ ‫‪:E‬‬ ‫‪1 -W‬‬ ‫‪-a 100‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪-N cu1.com‬‬ ‫‪:0100 mov ah,01‬‬ ‫‪Writing 0000A Byte‬‬ ‫‪:0102 mov ch,01‬‬ ‫‪-W‬‬ ‫@‪-‬‬ ‫‪:0104 mov ch,E)14( :010C int 21H‬‬ ‫@‪-‬‬ ‫‪:010E‬‬ ‫‪:010a‬‬ ‫‪-R cx‬‬ ‫‪-R cx‬‬ ‫‪:A‬‬

‫‪ .4‬برنامه ای بنویسیدکه مکان نما‬ ‫را به حالت اول برگرداند؟‬

‫‪ .5‬برنامه ای بنویسیدکه مکان نما‬ ‫را درموقعیت ‪ 10,10‬چاپ کند؟‬

‫‪-a 100‬‬ ‫‪… : 0100 mov ah,01H‬‬ ‫‪… : 0102 mov ch,c‬‬ ‫‪… : 0104 mov cl,c‬‬ ‫‪… : 0106 int 10H‬‬ ‫‪… : 0108 int 20H‬‬

‫‪-a 100‬‬ ‫‪… : 0100 mov ah,02H‬‬ ‫‪… : 0102 mov dh,A‬‬ ‫‪… : 0104 mov dl,A‬‬ ‫‪… : 0106 int 10H‬‬ ‫‪… : 0108 mov ah,02H‬‬ ‫‪… : 010A mov dh,41‬‬

‫شبه دستورات‬ ‫ی ک برنام ه اس مبلی‪ ،‬در ‪ Macro Assembler‬را م ی توان به‬ ‫دستورات و شبه دستورات تقسیم کرد‪ .‬منظور از دستورات‪ ،‬همان‬ ‫دستورا زبان اسمبلی می باشد و در موقع ترجمه برنامه‪ ،‬هر کدام‬ ‫به یک کد زبان تبدیل می شوند‪.‬‬ ‫اما شبه دستورات‪ ،‬برای کمک به برنامه ریز با آدرس های مختلف‬ ‫حافظه و خوانا شدن برنامه‪،‬به برنامه اضافه می شوند‪ .‬که در موقع‬ ‫ترجم ه برنام ه‪ ،‬ب ه آدرس های مورد نظ ر تبدی ل می شود‪ .‬مثل‪،‬‬ ‫برای نام گذاری متغیره ا‪ ،‬شب ه دس توراتی وجود دارد ک ه توسط‬ ‫آنها‪ ،‬می توانیم در طول برنامه‪ ،‬متغییرهایی را تعریف کنیم و در‬ ‫موقع ترجمه برنامه‪ ،‬هر کجا که متغییری ذکر کرده باشیم‪ ،‬آدرس‬ ‫آن جایگزین خواهد شد‪.‬‬

‫شبه دستور تعریف نماد‬ ‫کلم ه ‪ EQU‬یا علم ت مس اوی در ‪ Macro Assembler‬توسط‬ ‫مقادیر متناظر خود‪ ،‬برای تعریف بکار می رود و در موقع ترجمه‬ ‫برنامه‪ ،‬نمادها با مقادیر داده شده‪ ،‬جایگزین می شوند‪.‬‬ ‫مقدار ‪ EQU‬نام متغییر‬ ‫‪EQU 13‬‬

‫تعریف داده و متغییر‬

‫‪Enter‬‬

‫’‪Eoline EQU ‘$‬‬

‫شب ه دس تورات ‪ ، DT,DQ,DD,DW,DB‬برای تعری ف متغییر‬ ‫استفاده می شوند‪ .‬شکل کلی تعریف به صورت زیر است‪:‬‬ ‫?‬ ‫()‪Dup‬‬ ‫مقدار‬

‫نام متغییر‬

‫طول متغییر‬

‫‪DB‬‬

.‫هر یک از شبه دستورات گفته شده به صورت زیر بیان می شود‬ DB ) Define Byte (

1 Byte

DW ) Define Word (

2 Byte

DD ) Define Double Word (

4 Byte

DQ ) Define Quail Word (

6 Byte

DT ) Define Ten Byte (

10 Byte

‫‪1.F1 db 30‬‬ ‫‪ F1‬به طول ‪ 1‬بایت با مقدار اولیه ‪.30‬‬ ‫”‪2.F2 db “Ali‬‬ ‫‪ F2‬به طول ‪ 1‬بایت با مقدار اولیه ‪.30‬‬ ‫’‪3.F3 db 65,’L’,’$‬‬ ‫‪ F3‬متغییری از نوع آرایه به طول ‪ 3‬بایت با مقدار اولیه متفاوت‪.‬‬ ‫‪ F4‬متغییری به طول ‪ 1‬بایت که هنوز مقدار نمی گیرد‪.‬‬

‫? ‪4.F4 db‬‬

‫‪5.F5 db‬‬ ‫‪ F5‬متغییری از نوع آرایه به طول ‪ 4‬بایت با مقدار اولیه داده شده‪.‬‬ ‫‪3FH,2FH,00H,4CH‬‬ ‫‪ F6‬از نوع آرایه بطول ‪ 10‬بایت با مقدار اولیه صفر‪.‬‬

‫(?)‪7.F7 db 10 Dup‬‬ ‫‪ F7‬از نوع آرایه بطول ‪ 10‬بایت که مقدار اولیه ندادیم‪.‬‬ ‫‪8.F8 dw 10‬‬ ‫‪ F8‬متغییری بطول یک کلمه با مقداراولیه ‪.10‬‬ ‫‪9.F9 dw 30,40,108,456‬‬ ‫شده‪10.F10 dw 12.‬‬ ‫(?)‪Dup‬‬ ‫‪ F9‬آرایه ای بطول ‪ 4‬کلمه با مقداراولیه داده‬ ‫‪11.F11 db 1,2,3‬‬ ‫‪ F7‬آرایه ای بطول ‪ 12‬کلمه بدون هیچ مقداراولیه ای‪.‬‬ ‫‪db 4,5,6‬‬ ‫‪ F9‬متغییری ازنوع آرایه بطول ‪ 6‬بایت با مقادیراولیه داده شده‪.‬‬

‫شبه دستور ‪Call‬‬ ‫ای ن دس تور‪ ،‬برای فراخوان ی ی ک زیربرنام ه مورد اس تفاده قرارمی‬ ‫گیرد برای فراخوانی زیربرنامه موجود درحافظه اصلی‪ ،‬باید آدرس‬ ‫زیربرنامه و یا نام زیربرنامه را درجلوی این دستور‪ ،‬قید کنیم‪.‬‬ ‫شکل کلی استفاده ازاین دستور بصورت زیر است‪:‬‬ ‫نام زیربرنامه ‪Call‬‬ ‫‪cs:offset‬‬

‫آدرس زیربرنامه ‪Call‬‬

‫شبه دستور ‪Endp‬‬ ‫این شبه دستور‪ ،‬برای مشخص کردن ابتدای یک زیربرنامه مورد‬ ‫استفاده قرار می گیرد‪ .‬در این صورت در پایان زیر برنامه‪ ،‬باید از‬ ‫شبه دستور ‪ )Endp )End Of Line‬استفاده نمائیم‪.‬‬ ‫اگر زیربرنامه را بدین صورت معرفی کرده باشیم‪ ،‬می توانیم توسط‬ ‫دستور ‪ call‬آن زیربرنامه را با ذکرنام‪ ،‬فراخوانی کنیم‪.‬‬ ‫شکل کلی استفاده از این دستور‪ ،‬بصورت روبرو است‪:‬‬ ‫]‪ Proc [near/far‬نام زیربرنامه‬ ‫دستورات برنامه‬ ‫بازگشت به برنامه اصلی ‪Ret‬‬ ‫‪ Endp‬نام زیربرنامه‬

‫‪ :Near‬درصورتی که زیربرنامه خارجی نباشد ودرداخل ‪Segment‬‬ ‫جاری باشد‪.‬‬ ‫‪ :Far‬در صورتی که زیربرنامه خارجی باشد و در داخل ‪Segment‬‬ ‫جاری نباشد‪.‬‬ ‫مثال) روالی بنام ‪ putstr‬بنویسید که در رشته ای که آدرس آن در‬ ‫ثبات ‪ dx‬قرار دارد و به ‪ $‬ختم می شود را در محل جاری مکان‬ ‫‪Putstr proc near‬‬ ‫نما‪ ،‬چاپ کند‪.‬‬ ‫‪Mov ah,09H‬‬ ‫نکت ه) جه ت چاپ رشت ه ای که آدرس‬ ‫‪Int 21H‬‬ ‫آن در ثبات ‪ dx‬قرار دارد و به ‪ $‬ختم‬ ‫می شود از ای ن وقف ه ب ا سرویس‬ ‫‪Ret‬‬ ‫‪.‬‬ ‫شود‬ ‫می‬ ‫استفاده‬ ‫مربوطه‬ ‫‪Putstr endp‬‬

‫دستور ‪:Ret‬‬ ‫در صورتي كه در یك زیر برنامه ‪ ،‬اجراي زیر برنامه به این‬ ‫دستور برسد ‪ ،‬اجراي برنامه به محلي باز مي گردد كه‬ ‫آدرس آن در ابتداي ‪ stack‬قرار دارد ‪.‬‬

‫‪:‬انواع آدرس دهي حافظه در زبان اسمبلي‬ ‫‪:‬آدرس دهي و دسترسي مستقیم ‪1-‬‬ ‫در این نوع آدرس دهي ‪ ،‬مستقیما نام متغییر در دستور زبان‬ ‫‪.‬اسمبلي ذكر مي شود‬ ‫‪:‬مثال‬ ‫‪X db 25‬‬ ‫‪Y db 45‬‬ ‫‪Mov al,x‬‬ ‫‪Mov ah,y‬‬

‫‪ -2‬دسترسي بلفصل‪:‬‬ ‫‪.‬در این نوع دسترسي‪ ،‬داده بلفاصله در دستور ذكر مي شود‬ ‫‪:‬مثال‬

‫‪Mov bx,4f2h‬‬ ‫‪Mov al,25‬‬

‫‪:‬دسترسي توسط ثبات ‪3-‬‬ ‫در این نوع دسترسي ‪ ،‬نام یك ثبات را در دستور زبان اسمبلي‬ ‫ذكر مي كنیم و منظور ما از ذكر نام ثبات ‪ ،‬مقداري است كه‬ ‫‪.‬در آن ثبات قرار دارد‬ ‫‪ :‬مثال‬ ‫‪Mov ax,dataseg‬‬ ‫‪Mov ds,ax‬‬

‫‪:‬دسترسي غیر مستقیم توسط ثبات شاخص یا پایه ‪4-‬‬ ‫در این نوع آدرس دهي محلي از حافظه كه محتویات آن مورد‬ ‫نظر است ‪ ،‬در یك ثبات قرارمي گیرد و توسط آن ثبات ‪ ،‬از‬ ‫‪.‬محتویات آن آدرس ‪ ،‬استفاده مي كند‬ ‫‪:‬مثال‬ ‫‪8‬‬

‫‪1 41 9F 2 3E‬‬ ‫‪2‬‬ ‫‪7‬‬ ‫‪100 101 102 103‬‬ ‫‪104 105‬‬

‫شده‬

‫‪al=9f‬‬

‫‪Mov bx,103‬‬ ‫]‪Mov al,[bx‬‬

‫‪:‬دسترسي غیر مستقیم نسبي نسبت به ثبات پایه ‪5-‬‬ ‫در این نوع دسترسي ‪ ،‬آدرس محلي كه محتویات آن مورد نظر‬ ‫است ‪ ،‬در ثبات پایه (‪ )BX‬قرار مي گیرد و تفاوت مكان نیز‬ ‫به آن اضافه مي شود ‪.‬‬ ‫مثال‪:‬‬ ‫‪8‬‬

‫]‪Mov al,[bx+n‬‬ ‫]‪Mov al,n[bx‬‬ ‫‪Mov al,[bx]+n‬‬

‫‪1 41 9F 2 3E‬‬ ‫‪2‬‬ ‫‪7‬‬ ‫‪100 101 102 103‬‬ ‫‪104 105‬‬

‫‪al=27‬‬

‫‪Mov bx,100‬‬ ‫]‪Mov al,[bx+4‬‬

‫‪:‬دسترسي نسبي نسبت به ثبات شاخص ‪6-‬‬ ‫در این نوع دسترسي‪،‬محلي از حافظه را بعنوان مبدا در نظر‬ ‫گرفته و تفاوت مكان آن را در یكي از ثباتهاي شاخص (‪ si‬یا‬ ‫‪ )di‬قرار مي دهیم ‪.‬‬ ‫محتویات محل مبدا به اضافه تفاوت مكان مورد نظر است ‪.‬‬ ‫مثال‪:‬‬ ‫‪‘$‘,“String db “abcdefg‬‬ ‫‪Mov si,3‬‬ ‫]‪‘Mov al,string[si‬‬ ‫‪al=‘d‬‬

‫‪:‬دسترسي نسبي نسبت به ثبات پایه وشاخص ‪7-‬‬ ‫در این نوع دیترسي ‪ ،‬محلي از حافظه بعنوان ئمبدا در نظر‬ ‫گرفته مي شود و مجموع آدرس هاي ثبات پایه و شاخص ‪،‬‬ ‫‪.‬با آدرس مبدا جمع مي شود‬ ‫‪SI‬‬

‫‪SI‬‬

‫‪SI‬‬ ‫‪SI‬‬

‫‪BX‬‬ ‫‪BX‬‬ ‫‪BX‬‬ ‫‪BX‬‬

‫] ‪ di‬یا ‪Area [bx][si‬‬ ‫]‪Area [ bx+si‬‬ ‫’‪String db “abcdefg”.’$‬‬ ‫‪Mov si,3‬‬ ‫‪Mov bx,2‬‬ ‫’ ‪Mov al,string[bx][si] al=‘ f‬‬

‫‪:‬تمرین‬

‫‪:‬ساختار یك برنامه در زبان اسمبلي‬ ‫بطور كلي یك برنامه در زبان اسمبلي ‪ ،‬باید از چهار قسمت‬ ‫‪:‬زیر تشكیل شده باشد‬ ‫(‪1. CS )code segment‬‬ ‫(‪2. DS )data segment‬‬ ‫(‪3. SS )stack segment‬‬ ‫(‪4. ES )extra segment‬‬

‫قسمت ‪ cs‬برنامه جزء قسمت هاي ضروري مي باشد‪ .‬اما سه‬ ‫قسمت دیگر آن ممكن است در برخي از برنامه ها مورد‬ ‫استفاده قرار نگیرد ‪.‬‬ ‫اگر تعریف متغییر ها را در قسمت ‪ cs‬انجام دهیم باید اجراي‬ ‫برنامه طوري باشد كه ‪ :‬از روي آدري متغییرها عبور كند ‪.‬‬ ‫وگرنه در موقع اجرا محتویات متغییرها را بعنوان‬ ‫دستورالعمل در نظر گرفته و با خطا مواجه مي شود ‪.‬‬

‫اگر در برنامه اي ‪ ،‬تمام این چهار قسمت تعریف شوند ‪ ،‬آن‬ ‫برنامه ‪،‬قابل تبدیل به فایلي با پسوند ‪ com.‬مي باشد ‪ .‬كه از لحاظ‬ ‫سرعت ‪ ،‬از فایل هاي ‪ exe.‬سریعتر مي باشند ‪.‬‬ ‫در صورتي كه بخواهیم برنامه را به یك فایل با پسوند ‪com.‬‬ ‫تبدیل نمائیم بایستي تمام این چهار قسمت در یك قسمت قرار‬ ‫گیرند‪)code segment(.‬‬ ‫اما در مورد فایل هاي ‪ exe.‬این نواحي مي توانند از هم جدا‬ ‫باشند ‪ .‬بنابراین در صورتي كه یكي از این نواحي را به طور‬ ‫جداگانه معرفي مي كنیم ‪ ،‬فایل حاصل قابل تبدیل به فایل با‬ ‫توسعه ‪ com.‬نیست ‪.‬‬

‫‪:‬الگوهاي فایل‬ ‫فایل هاي ‪: com.‬‬ ‫همانطور كه گفته شد ‪ ،‬در مورد فایل هاي ‪ com.‬تمام برنامه‬ ‫باید در یك ناحیه باشد ‪ .‬در صورتي كه نیاز به تعریف داده‬ ‫در برنامه داشته باشیم ‪ ،‬باید آنها را در داخل خود برنامه‬ ‫معرفي كرده و با دستورات پرش مناسب‪ ،‬برنامه را به سمت‬ ‫كدهاي اصلي برنامه ‪ ،‬هدایت كنیم ‪.‬‬

‫ساختار فایل هاي ‪com.‬‬

‫دستورات برنامه‬ ‫محل تعريف داده ها‬ ‫دستورات برنامه‬

‫اگر توابع فرعي داشته باشیم تعريف مي كنیم‬

‫‪: Macro assembler‬‬ ‫‪model small.‬‬ ‫‪code.‬‬ ‫‪Main proc‬‬ ‫‪org 100‬‬ ‫‪jmp l1‬‬ ‫………‬ ‫………‬ ‫‪:L1‬‬ ‫………‬ ‫………‬ ‫‪Main endp‬‬ ‫………‬ ‫………‬

‫ساختار فایل هاي ‪com.‬‬

‫در اين قسمت داده هاي مورد نظر تعريف مي شود‬

‫اگر زير برنامه داشته باشیم در اين قسمت تعريف مي شود‬

‫دستورات اصلي برنامه‬

‫‪Turbo assembler:‬‬ ‫‪.model tiny ,c,os_dos‬‬ ‫‪.286‬‬ ‫‪.code‬‬ ‫‪.sturtup‬‬ ‫‪Jmp l1‬‬ ‫………‬ ‫………‬ ‫‪...........‬‬ ‫………‬ ‫‪L1:‬‬ ‫‪……..‬‬ ‫‪……..‬‬ ‫‪.exit0‬‬ ‫‪end‬‬

‫تعریف ‪PSP ))programs segment prefix‬‬ ‫( قطعه پیشوند برنامه)‪:‬‬ ‫در موقع اجراي یك فایل ‪ com.‬سیستم عامل ‪ byte 256،‬به‬ ‫عنوان قطعه پیشوند برنامه در نظر مي گیرد و دستورات‬ ‫مربوط به فایل ‪ com.‬را پس از این قرار مي دهد ‪.‬‬ ‫این ناحیه ‪ ،‬اطلعات اساسي در مورد برنامه شامل ‪ :‬حجم‬ ‫برنامه ‪ ،‬دستورات بازگشت به سیستم عامل ‪، dos‬‬ ‫پارامترهاي همراه برنامه و اطلعات دیگر را در بر دارد ‪.‬‬ ‫بنابراین ‪ ،‬تمامي آدرسها در یك فایل ‪ com.‬باید بعد از این‬ ‫ناحیه قرار بگیرد ‪.‬‬

‫براي اینكه برنامه اسمبلي را ار آدرس ‪ 256‬به بعد شروع كنیم‬ ‫و ‪ 258byte‬اول را به ‪ psp‬اختصاص دهیم ‪ ،‬در ‪debug‬‬ ‫با استفاده از دستور –‪ a‬و در ‪ macro assembler‬با‬ ‫استفاده از ‪ ، org 100h‬این ‪ 256byte‬را براي قطعه‬ ‫برنامه ذخیره مي كنیم ‪.‬‬ ‫اگر یك برنامه اسمبلي را با این ساختار نوشته و به یك فایل‬ ‫‪ com.‬تبدیل كنیم ‪ ،‬پس از اتمام برنامه و رسیدن به دستور‬ ‫‪ ، ret‬برنامه به طور خودكار به ‪ psp‬مراجعه كرده و ‪int‬‬ ‫‪ 20h‬را در ابتداي آن قرار داده ‪ ،‬براي بازگشت به سیستم‬ ‫عامل ‪ dos‬به كار مي برد و آن را اجرا مي كند‬

‫‪:‬تمرین‬ ‫برنامه اي بنویسید با ساختار ‪ com.‬كه صفحه نمایش را پاك‬ ‫نموده و در وسط صفحه نمایش‬

‫ساختار فایل ‪Exe.:‬‬ ‫در ساختار فایل ‪ exe.‬هر یك از ‪ segment‬ها بصورت مجزا‬ ‫تعریف مي شوند شكل كلي یك برنامه با ساختار ‪exe.‬‬ ‫بصورت زیر است‪:‬‬ ‫‪Stseg segment‬‬ ‫( ? ) ‪db 64 dup‬‬ ‫( ? )‪Or dw 32 dup‬‬ ‫‪Stseg ends‬‬ ‫(‪;……………)comments‬‬

Dtseg segment ………….. ………….. Dtseg ends ;…………….. Cdseg segment main proc near assume s:cdseg,ds:dtseg,ss:stseg,es:nothing mov ax,dtseg mov ds,ax …………… …………… …………… mov ah,4ch Int 21h main endp …………… …………... cdseg ends end main

‫محل تعريف داده هاي مورد نیاز برنامه‬

‫محل نوشتن دستورات برنامه‬

‫محل نوشتن روالها و زير برنامه ها‬

‫مفهوم دستور ‪:ptr ))pointer‬‬ ‫این دستور براي اشاره كردن به محلي از حافظه و مقدار دادن‬ ‫و یا مقدار گرفتن از آن قسمت مي باشد كه مي تواند انواع‬ ‫‪ byte,word,dword,qword‬را آدرس دهي كند‪.‬‬ ‫مثال‪:‬‬ ‫‪db 32h,7fh,99h,932h‬‬ ‫‪dw 67f1h‬‬ ‫‪dd 22229999h‬‬

‫‪D1‬‬ ‫‪D2‬‬ ‫‪D3‬‬

1.

3.

5.

7.

9.

11.

Mov ax,wordptr d1 ax=7f23 Mov bx,wordptr d1+2 bx=9299 Mov al,byteptr d2 D1 al=f1h D2 D3 Mov ax,wordptr d3 ax=9999h Mov ax,wordptr d2 ax=67f1h Mov bx,wordptr d3+2 bx=2222h

db 32h,7fh,99h,932h dw 67f1h dd 22229999h

‫دستور‪: add‬‬ ‫از این دستور براي جمع كردن یك مقدار با یك ثبات استفاده مي‬ ‫شود ‪ .‬شكل كلي این دستور بصورت زیر است ‪:‬‬ ‫‪Add op1,op2‬‬ ‫‪opi=opi+op2‬‬ ‫نكته‪:‬‬ ‫‪ Bit‬هاي ثبات وضعیت زیر با انجام این دستور ‪ ،‬تغییر خواهند‬ ‫كرد‪:‬‬ ‫‪O S Z A P C‬‬

‫دستور‪: adc ))add with carry‬‬ ‫با انجام این دستور بیت ‪ carry‬در عملیات جمع ‪ ،‬شركت‬ ‫خواهد نمود ‪.‬‬ ‫تمرین‪:‬‬ ‫مقدار ثباتهاي ‪ al,ah‬و نشانه هاي ‪ sf,cf,of,zf‬را پس از‬ ‫انجام دستورات زیر مشخص كنید ‪:‬‬ ‫‪1 1‬‬ ‫‪Sf=0‬‬ ‫‪zf=0‬‬ ‫‪Mov al,a3h‬‬ ‫‪a 3‬‬ ‫‪Cf=1‬‬ ‫‪of=1‬‬ ‫‪Mov bl,8eh‬‬ ‫‪+8 E‬‬ ‫‪3 1‬‬ ‫‪Add al,bl‬‬ ‫‪al=al+bl‬‬ ‫‪0011 0001‬‬

‫دستور‪: sub‬‬ ‫از این دستور براي كم كردن یك مقدار از یك ثبات استفاده مي‬ ‫‪:‬شود ‪ .‬شكا كلي این دستور بصورت زیر است‬ ‫‪Sub‬‬ ‫‪op1,op2‬‬ ‫‪op1=op1-op2‬‬ ‫‪:‬نكته‬ ‫با انجام این دستور ‪ bit‬هاي ثبات وضعیت بصورت زیر تغییر‬ ‫مي كنند‪:‬‬ ‫‪O S Z A P C‬‬

‫دستور ‪:sbb ))sub with barron‬‬ ‫براي تفریق كردن به همراه بیت انتقال از این دستور استفاده‬ ‫مي شود كه مانند دستور ‪ adc‬عمل مي كند (یك عدد را از‬ ‫عدد دیگر كم مي كند ) كه در این محاسبه ‪ ،‬بیت انتقال نیز‬ ‫شركت مي كند ‪.‬‬ ‫این دستور براي تفریق كردن متغیرهاي غیر هم طول و یا با‬ ‫طول بیش از یك كلمه استفاده مي شود ‪.‬‬

‫دستور ‪:Mul , Imul‬‬ ‫از این دستور براي عمل ضرب در زبان اسمبلي استفاده مي‬ ‫‪.‬شود ‪ .‬این دو دستور ‪ ،‬فقط داراي یك عملوند مي باشند‬ ‫‪، Mul‬براي ضرب بدون علمت و ‪ ، Imul‬براي ضرب با‬ ‫علمت استفاده مي شود ‪.‬‬ ‫این دو دستور ‪،‬عملوند را در ثبات ‪ al‬یا ثبات ‪ ax‬ضرب مي‬ ‫كنند‪.‬‬

‫‪:‬اگر عملوند یك بایتي باشد‬ ‫آن را در ثبات ‪ al‬ضرب كرده و حاصل را در ثبات ‪ ax‬قرار‬ ‫مي دهد‪.‬‬ ‫اگر عملوند دو بایتي باشد‪:‬‬ ‫آن را در ثبات ‪ ax‬ضرب كرده و حاصل را در ثبات ‪ax,dx‬‬ ‫قرار میدهد ‪.‬‬ ‫دو بایت سمت چپ را در ‪ dx‬و دو بایت سمت راست را در‬ ‫ثبات ‪ ax‬قرار مي دهد‬ ‫شكل كلي این دستور بصورت زیر است‪:‬‬ ‫‪Mul operand‬‬ ‫‪Or‬‬ ‫‪Imul operand‬‬

‫با انجام این دستور ‪ bit‬هاي زیر از ثبات وضعیت ‪ ،‬تغییر مي‬ ‫كنند‪:‬‬ ‫‪O S Z A P C‬‬

‫‪AX‬‬

‫ثبات يا حافظه‬

‫‪AL‬‬

‫‪byte*b‬‬ ‫‪yte‬‬

‫‪DX:AX‬‬

‫ثبات يا حافظه‬

‫‪AX‬‬

‫‪word*wor‬‬ ‫‪d‬‬

‫‪DX:AX‬‬

‫ثبات يا حافظه‬

‫‪Al‬‬ ‫‪=byte‬‬ ‫‪Ah=0‬‬

‫‪word*by‬‬ ‫‪te‬‬

‫مثال‬: 1(Mov Mov Mul

al,20h bl,3fh bl

ax=al*bl

2(X dw 2051h Mov ax,f201h Mul x dx:ax =ax ‫دو بایت كم ارزش‬ =dx ‫دو بایت با ارزش‬

3)Mov Mov Mov Mul

ah=00h al,3bh bl,ffh bl dx:ax =ax ‫دو بايت كم ارزش‬ =dx ‫دو بايت با ارزش‬

‫‪:‬نمونه سوال امتحان‬ ‫اگر ‪x‬یك متغییر از حافظه به طول ‪ 1‬بایت و ‪ y‬یك متغییر از‬ ‫حافظه به طول ‪ 1word‬باشد رابطه زیر را به زبان اسمبلي‬ ‫شبیه سازي كنید ‪.‬‬ ‫‪Y=x^3-3x^2+7‬‬

Mov Mov Mul Mov Mul Mov Mov Mul Mov Sub Add Mov

ax , 00h al,x x bx,ax x y,ax ax,bx 3 bx,y bx,ax bx,7 y,bx

or

sub ax,ax

ax=x^2 ax=x^3

ax=3x^2 bx=x^3-3x^2 bx=x^3-3x^2+7 y=x^3-3x^2+7

‫‪:‬تمرین‬ ‫‪.‬ضرب دو عدد ‪ 4‬بایتي به تفكیك متغییرهاي ‪ 2‬بایتي‬ ‫‪A A+1 A+2‬‬ ‫‪A+3‬‬

‫*‬

‫‪B B+1 B+2‬‬ ‫‪B+3‬‬

‫*‬

‫‪C+1 C+2 C+3 C+4‬‬ ‫‪C+5‬‬ ‫‪C +AL +AL +AL‬‬

‫‪A‬‬

‫‪B‬‬

‫‪C‬‬

.model tiny,c,os_dos .286 .code .startup Jmp l1 a dd 1234567 b dd 1234567 c db 6 dup)0( L1: sub ah,ah Mov ah, byte ptr a mul byte ptr b

Mov Mov Sum Mov Mul Add Mov Sub Mov Mul Add Mov

byte ptr c,al byte ptr c+1,ah ah,ah al,byte ptr a+1 byte ptr b+1 byte ptr c+1,al byte ptr c+2,ah ah,ah al,byte ptr a+2 byte ptr b+2 byte ptr c+2,al byte ptr c+3,ah

Sub ah.ah Mov al,byte ptr a+3 Mul byte ptr b+3 Add byte ptr c+3,al Mov byte ptr c+4,ah .exit end

‫دستور ‪:Div, Idiv‬‬ ‫این دستور جهت تقسیم یك مقدار بر یك مقدار دیگر در دو حالت‬ ‫‪.‬اعداد علمتدار و اعداد بدون علمت استفاده مي شود‬ ‫اگر اعداد بدون علمت باشند از دستور ‪ div‬در غیر اینصورت‬ ‫از دستور ‪ idiv‬استفاده مي شود‪.‬‬ ‫شكل كلي این دستور دقیقا مانند دستور ‪ mul,imul‬مي باشد ‪ .‬با‬ ‫این تفاوت كه دو دستور ‪ div,idiv‬داراي باقیمانده و خارج‬ ‫قسمت هستند شكل كلي این دستور بصورت زیر است‪:‬‬ ‫‪Div operand‬‬ ‫‪Or‬‬ ‫‪Idiv operand‬‬

‫حالت مختلف دستور ‪ div‬بر حسب طول متغییر ‪،‬بصورت‬ ‫زیر است‪:‬‬ ‫باقي مانده‬

‫خارج قسمت‬

‫عملوند‬

‫‪AH‬‬

‫‪AL‬‬

‫ثبات يا حافظه‬

‫‪DX‬‬

‫‪AX‬‬

‫ثبات يا حافظه‬

‫‪AH‬‬

‫‪AL‬‬

‫ثبات يا حافظه‬

‫‪DX‬‬

‫‪AX‬‬

‫ثبات يا حافظه‬

‫مقدار دهي اوليه‬ ‫‪AX,DX‬‬

‫نوع متغییر‬

‫‪Byte/Byte Al=byte,ah‬‬ ‫‪=0‬‬ ‫‪Word/Wor‬‬ ‫‪Ax=word,d‬‬ ‫‪d‬‬ ‫‪x=0‬‬ ‫‪Word/Byte‬‬ ‫‪Ax=word‬‬ ‫‪Doublewor‬‬ ‫‪Dx:ax=dw‬‬ ‫‪d/‬‬ ‫‪Word‬‬

‫تغییر بیتهاي ثبات وضعیت در این دستور مانند ‪ mul‬است‪.‬‬

‫‪:‬مثال‬ ‫‪X db 136‬‬ ‫‪Y db 17‬‬ ‫? ‪R db‬‬ ‫? ‪Q db‬‬ ‫‪x/y =? Byte‬‬ ‫باقیمانده=‪R‬‬ ‫خارج قسمت=‪Q‬‬

‫جواب‬: Mov Mov Div Mov Mov

al,x ah,0 y r,ah q,al

‫‪:‬نمونه سؤال امتحان‬ ‫اگر ‪ c,f‬دو مكان از حافظه ‪ ،‬هر كدام بطول ‪ 1word‬باشند ‪،‬‬ ‫عبارت زیر را با دستورات زبان اسمبلي ‪ ،‬شبیه سازي‬ ‫نمایید‪.‬‬ ‫‪)C=)5/9(*)f-32‬‬

‫جواب‬: C dw ? F dw -10 Mov ah,5 Idiv 9 Mov bx,f Sub bx,32 Imul bx 32) Mov c,ax 32)

ax=(5/9)*(fc=(5/9)*(f-

‫دستور ‪:inc‬‬ ‫یك واحد به متغییر كه ممكن است ثبات باشد یا حافظه اضافه‬ ‫مي كند ‪ .‬شكل كلي این دستور بصورت زیر است‪:‬‬ ‫‪Inc mem/reg‬‬ ‫دستور ‪:dec‬‬ ‫یك واحد از متغییر كه ممكن است ثبات یا حافظه باشد كم مي‬ ‫كند ‪ .‬شكا كاي این دستور بصورت زیر است‪:‬‬ ‫‪Dec mem/reg‬‬

‫مثال‪:‬‬ ‫‪x=11‬‬

‫‪X db 10‬‬ ‫‪Inc x‬‬

‫نكته‪:‬‬ ‫بیتهاي زیر از ثبات وضعیت با انجام دستورات ‪ inc‬و‪dec‬‬ ‫تغییر میكنند‪:‬‬ ‫‪O S Z A P C‬‬

‫دستور ‪: neg‬‬ ‫بر روي یك ثبات یا حافظه استفاده مي شود ‪ .‬این دستور‬ ‫علمت را عوض مي كند ‪ .‬در صورت مثبت بودن آن را‬ ‫منفي و در غیر اینصورت آن را مثبت مي كند ‪ .‬شكل كلي‬ ‫این دستور بصورت زیر است‪:‬‬ ‫‪Neg mem/reg‬‬ ‫نكته‪:‬‬ ‫بیتهاي زیر از ثبات وضعیت با انجام دستورات ‪ neg‬تغییر‬ ‫میكنند‪:‬‬ ‫‪O S Z A P C‬‬

‫دستور ‪:xchg ))xchang‬‬ ‫از این دستور براي تعویض نمودن دو ثبات و یا یك ثبات و ناحیه اي از‬ ‫حافظه ‪ ،‬مورد استفاده قرار مي گیرد ‪.‬‬ ‫بایستي توجه داشته باشیم كه طول متغییرها یا ثبات ها باید یكي باشد ‪.‬‬ ‫شكل كلي این دستور بصورت زیر است ‪:‬‬ ‫‪Xchg reg , reg/mem‬‬ ‫مثال‪:‬‬ ‫‪X dw 2fe0h‬‬ ‫‪Mov ax , 3f25h‬‬ ‫‪Xchg ax , x‬‬ ‫‪ax=2fe0h‬‬ ‫‪x=3f25‬‬

‫دستور ‪:jmp‬‬ ‫از این دستور براي انتقال كنترل برنامه به دستور خاصي‬ ‫استفاده مي شود ‪.‬در صورتي كه كنترل و اجراي برنامه از‬ ‫دستوري كه برچسب آن در جلوي این دستور مشخص شده ‪،‬‬ ‫ادامه پیدا مي كند‪.‬‬ ‫برچسب جلوي این دستور ‪،‬مي تواند قبل یا بعد از این دستور‬ ‫قرار گیرد‪.‬‬ ‫نكته‪:‬‬ ‫‪ ، Lable‬نباید همنام باشد‪.‬‬ ‫‪ ، Lable‬نباید خیلي بزرگ باشد‪.‬‬

‫شكل كلي اين دستور بصورت زير است‬: Jmp lable ‫مثال‬: Lable : ………. ………. ………. jmp lable

jmp lable ………… ………… ………… lable: ………… …………

‫دستور ‪:Loop‬‬ ‫از این دستور ‪ ،‬جهت تكرار قسمتي از برنامه مورد استفاده‬ ‫قرار مي گیرد ‪ .‬اگر اجراي برنامه به این دستور برسد ‪،‬‬ ‫كنترل برنامه به دستوري كه برچسب آن در این دستور‬ ‫مشخص شده ‪ ،‬انتقال پیدا مي كند و ضمنا یك واحد از ‪ cx‬كم‬ ‫مي شود‪.‬‬ ‫بنابراین براي ایجاد یك حلقه تكرار ‪ ،‬مي توانیم تعداد تكرار را‬ ‫در ‪ cx‬قرار داده و از این دستور استفاده نماییم‪.‬‬ ‫شكل كلي این دستور به صورت زیر است ‪:‬‬ ‫‪Loop lable‬‬

‫مجموعه اي از دستورات كه مي خواهیم‬ ‫‪ n‬با ر تكرار شوند‪.‬‬

‫‪Mov cx,n‬‬ ‫‪Lable:‬‬ ‫‪……….‬‬ ‫‪……….‬‬ ‫‪……….‬‬ ‫‪Loop lable‬‬

‫‪:‬مثال‬ ‫فرض كنید رشته هاي ‪s1,s2‬را با طول مشخص داریم(‪5‬‬ ‫بایت)‪،‬قسمت برنامه اي بنویسید كه رشته ‪ s1‬را در رشته ‪s2‬‬ ‫كپي كند ‪.‬‬ ‫‪“S1 db “abcde‬‬ ‫‪)?(S2 db 5 dup‬‬ ‫نكته‪:‬‬ ‫‪ bx,si,di‬بعنوان شمارنده و براي آدرس دهي بكار مي روند‪.‬‬

‫جواب‬: Mov cx,5 L1: mov si,cx dec si mov al,s1[si] mov s2[si],al Loop l1

‫‪:‬نمونه سؤال امتحان‬ ‫معادل قسمت برنامه زیر كه به زبان ‪ pascal‬مي باشد را به‬ ‫زبان اسمبلي تبدیل نما ئید‪(.‬هر عضو ‪A،1‬بایت است)‬ ‫;‪Sum:=0‬‬ ‫‪For i:=1 to 10 do‬‬ ‫]‪sum:=sum + a[i‬‬

A db 20,31,…, 84,32 Sum dw 0 ………… ………… Mov cx,10 Sub ax,ax L1: mov si,cx dec si add ax,a[si] Loop l1 Mov sum,ax

‫جواب‬:

‫دستور‪: cmp ))compare‬‬ ‫براي مقایسه دو عملوند از این دستور استفاده مي شود دو‬ ‫عملوند ‪ ،‬مي توانند هر دو ثبات باشند‪.‬‬ ‫در صورتي كه عملوند اول آدرس حافظه باشد ‪ ،‬عملوند دوم‬ ‫باید دادهاي بلفصل باشد‪.‬‬ ‫بسته به نوع مقایسه این دستور ‪،‬در ثبات ‪ flag‬تاثیر مي گذارد‪.‬‬ ‫این دستور معمول همراه دستور انتقال شرطي مورد استفاده‬ ‫قرار مي گیرد‪.‬‬

‫‪:‬شكل كلي این دستور بصورت زیر است‬ ‫‪Cmp op1,op2‬‬ ‫‪:‬مثال‬ ‫‪Cmp ax,bx‬‬ ‫متغییر‪Cmp ax,‬‬ ‫‪Cmp f1,10‬‬

‫‪:‬دستورانتقال شرطي‬ ‫دستورات ‪ jx‬بعداز دستور ‪ cmp‬مي آیند كه درجلوي آنها یك بر‬ ‫چسب وجود دارد‪.‬‬ ‫به جاي ‪ x‬رشته اي قرار مي گیرد كه مشخص كننده ي نتیجه ي‬ ‫مقایسه ویا مقدار ثبات ‪ Flag‬مي باشد‪.‬‬ ‫اگررابطه ي متناظربا این رشته صحیح باشد كنترل برنامه به‬ ‫برچسب موردنظر انتقال پیدا مي كند‪.‬‬ ‫‪CMP OP1,OP2‬‬ ‫شكل كلي این دستور به صورت زیراست ‪:‬‬ ‫‪JX LABLE‬‬ ‫‪JMP‬‬

: JX ‫جدول حالت‬ ‫بدون علمت‬OP1,OP2

‫با علمت‬OP1,OP2

OP1>OP2 JA OP1>=OP2 JAE OP1=OP2 JE OP1<>OP2 JNE OP1
JG

G=GREATER

B=BELOW

L=LESS

JGE JE JNE JL JLE

‫تغییرات ثبات وضعیت‬ JC CARRY FLAG=1 JNC CARRYFLAG=0 JS SIGNFLAG=1 JNS SIGNFLAG=0 JZ ZEROFLAG=1 JNZ ZEROFLAG=0 JP PARITYFLAG=1 JNP

‫شبیه‬‫اسمبلي‬‫زبان‬‫به‬‫زيررا‬‫پاسكال‬‫دستورات‬‫معادل‬ ‫كنید‬‫سازي‬ Sum=0 Count=100 While (sum < 500) or (count > 0) sum = sum + count count = count – 1 end while

Mov ax,0 Mov cx,100 While1 : Cmp ax,5000 Jb l1 Cmp cx,0 Jle exit L1 : Add ax,cx Dec cx Jmp while1 Exit :

i=0 Sum=0 While )sum<100( { for i=1 to 10 sum=sum+I if sum=50 then s1; else s2; }

Mov si,0 Mov ax,0 While1: cmp ax,100 jae exit mov si,1 For1: cmp si,10 ja if1 add ax,si inc si jmp for1 If1: cmp ax,50 jae else1 call s1 jmp l1 Else1: call s2 L2: jmp while1 Exit:

‫‪ :‬دریافت اطلعات از صفحه كلید‬ ‫براي دريافت مقادير)چه عددي وچه رشته اي(درهرصورت‬ ‫بايستي اطلعات از صفحه كلید بصورت رشته دريافت شود‬ ‫‪:‬اين كاررا مي توان بصورتهاي زير نشان داد‬ ‫‪ -1‬كاراكتربه كاراكتر‪ :‬وقفه ي ‪ 10h‬سرويس ‪08h‬‬ ‫شماره ي سرويس =‬ ‫‪AH‬‬ ‫‪INT 10H‬‬ ‫دراين حالت كاراكتردريافتي رادرثبات ‪ AL‬مي ريزد وهنگام‬ ‫دريافت كاراكتررا روي صفحه نشان نمي دهدولي با استفاده‬ ‫از وقفه ي ‪ 21h‬سرويس ‪ 01h‬مي اتوان كاراكتررا روي‬

‫‪ -2‬رشته اي ‪ :‬وقفه ي ‪ 21H‬سرويس ‪0AH‬‬ ‫شماره ي سرويس =‬ ‫‪AH‬‬ ‫آدرس رشته =‬ ‫‪DX‬‬ ‫‪INT 21H‬‬ ‫شكل و ساختاررشته دراين سرويس ‪:‬‬ ‫‪String Lable Byte‬‬ ‫طول رشته ي واقعي ‪DB‬‬ ‫‪DB‬‬

‫)نام رشته(‬ ‫‪) ? Len‬طول رشته ي‬

‫‪ SHIFT‬منطقي ‪:‬‬ ‫‪:‬شكل كلي اين دستوربه صورت زير است‬ ‫‪SHL mem/reg , n‬‬ ‫‪SHR mem/reg , n‬‬ ‫‪ N‬تعداد دفعات عمل‪ SHIFT‬را مشخص مي كند ‪.‬‬ ‫از اين دو دستور براي ‪ SHIFT‬منطقي ثبات يا حافظه استفاده‬ ‫مي شود ‪.‬‬ ‫در عمل ‪ SHIFT‬به چپ يا راست مقداروارده صفر ومقدار‬ ‫خارجه دربیت ‪ Carry flag‬قرار مي گیرد ‪.‬‬

‫‪:‬نكته‬ ‫بیت هاي زيراز ثبات وضعیت با اجراي اين دستور تغییر‬ ‫‪O-S-Z-A-P-C‬‬ ‫خواهند‬ ‫‪:‬كرد‬ ‫‪:‬نكته‬ ‫‪SHL‬‬ ‫‪Mem= mem*2^n‬‬ ‫‪SHR‬‬ ‫‪Mem= mem/2^n‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪SHL AL,1‬‬

‫‪ SHIFT‬حسابي ‪:‬‬ ‫‪:‬شكل كلي اين دستوربه صورت زير است‬ ‫‪SAL mem/reg , n‬‬ ‫‪SAR mem/reg , n‬‬ ‫‪ N‬تعداد دفعات عمل‪ SHIFT‬را مشخص مي كند ‪.‬‬ ‫ازاين دو دستور براي ‪ SHIFT‬به چپ ياراست به صورت‬ ‫حسابي استفاده مي شود ‪.‬‬ ‫منظوراز حسابي نگهداشتن بیت علمت است ‪.‬‬

SAR AL,1

1

0

0

0

1

1

1

0

1

1

0

0

0

1

1

1 CF= 0

SAL AL,1

0

0

1

0

0

1

1

0

0

1

0

0

1

1

0

0

CF= 0

‫‪:‬دستورچرخشي بیتي‬ ‫‪:‬شكل كلي اين دستوربه صورت زير است‬ ‫‪ROR mem/reg , n‬‬ ‫‪ROL mem/reg , n‬‬ ‫‪ N‬تعداد دفعات عمل‪ SHIFT‬را مشخص مي كند ‪.‬‬ ‫ازاين دو دستور براي ‪ Rotate‬كردن بیتها استفاده مي شود ‪.‬‬ ‫مقدار ‪ Rotate‬شده ابتدا در‪ CF‬قرارمي گیرد وپس ازآن به‬ ‫آخرين بیتي كه منتقل شده است انتقال پیدا مي كند‪.‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪ROR AL,1‬‬

‫‪CF= 1‬‬

‫مثال‪:‬‬ ‫برنامه اي بنويسید كه يك كاراكتراز صفحه كلید دريافت كند وآن‬ ‫را به صورت مبناي دو نشان دهد ‪.‬‬

‫‪:‬تمرين‬ ‫اطلعات مربوط به ‪ 15‬كارمند در‪ 15‬كلمه ي متوالي قرار‬ ‫دارد )براي هر كارمند يك كلمه وهركلمه ‪ 16‬بیت است(‬ ‫اولین بیت سمت راست كدجنسیت كارمند مي باشد براي‬ ‫مرد يك وبراي زن صفراست قسمت برنامه اي بنويسید كه‬ ‫تعداد كارمندان مرد را مشخص كند ‪.‬‬ ‫‪JNC L2‬‬

‫‪M DB 0‬‬

‫‪INC M‬‬

‫‪AREA DW 2048H ,…, 3000AH‬‬ ‫‪:‬‬

‫‪L2:‬‬ ‫‪ADD SI , 2‬‬

‫‪MOV SI , 0‬‬

‫‪LOOP L1‬‬

‫‪MOV CX , 15‬‬ ‫‪L1:‬‬ ‫]‪MOV AX , AREA [SI‬‬ ‫‪SHL AX , 1‬‬

‫عملگرهاي منطقي ‪)Test,And,Or,Not,Xor(:‬‬ ‫ازاين عملگرها براي انجام اعمال منطقي روي بیتها استفاده‬ ‫مي شود ‪ .‬باانجام اين عملگرها بیتهاي ثبات وضعیت تغییر‬ ‫مي كند نكته ي قابل توجه ديگراين است كه نتیجه ي كاردر‬ ‫‪.‬ثباتي كه درابتدا تعريف شده قرار مي گیرد‬ ‫‪:‬نكته‬ ‫عملگر ‪ Test‬مانند ‪ And‬استفاده مي شود درثبات وضعیت‬ ‫تغییراتي ايجاد مي كند ولي درعملگرهاي مربوط هیچ‬ ‫تغییري ايجاد نمي كند ‪.‬‬

‫شكل كلي هريك از اين دستورات بصورت زير است‬:

Xor dest ,src And dest , src Not operand Or dest , src Test dest , src

‫نحوه ي عملكرد هريك از عملگرها‬: X

Y 0

Xor x,y 0

And x,y 0

Test x,y 0

Or x,y 0

Not x 1

0 0

1

1

0

0

1

1

1

0

1

0

0

1

0

1

1

0

1

1

1

0

‫‪:‬نكته‬ ‫‪ -1‬وقتي بخواهیم بیتي را صفر كنیم آن بیت را صفر وبقیه ي‬ ‫بیتها را يك وازعملگر ‪ AND‬استفاده مي كنیم ‪.‬‬ ‫‪ -2‬وقتي بخواهیم بیتي را يك كنیم آن بیت را يك وبقیه ي بیتها‬ ‫را صفروازعملگر ‪ OR‬استفاده مي كنیم ‪.‬‬ ‫‪ -3‬وقتي بخواهیم بیتي را متمم كنیم آن بیت را يك وبقیه ي‬ ‫بیتها را صفروازعملگر ‪ XOR‬استفاده مي كنیم ‪.‬‬

‫تمرين ‪: 1‬‬ ‫فرض كنید مقداري در ‪ AL‬قرار دارد قطعه برنامه اي بنويسید‬ ‫كه بیتهاي ‪ 0,7‬را يك كند بیتهاي ‪ 1,6‬را صفركند بیتهاي‬ ‫‪ 5,2‬متمم كند وبیتهاي ‪3,4‬را دست نخورده باقي بگذارد ‪.‬‬ ‫‪OR AL , 10000001B‬‬ ‫‪AND AL , 1011101B‬‬ ‫‪XOR AL , 00100100B‬‬

‫تمرين ‪: 2‬‬ ‫‪AX‬قسمت برنامه اي بنويسید كه سمت راست ترين بیت ثبات‬ ‫را بیت شماره ي صفروسمت چپ ترين بیت رابیت شماره ي‬ ‫‪ 15‬درنظربگیريد ‪.‬‬ ‫دنباله دستوراتي بنويسیدكه بیتهاي صفرويك رابابیتهاي ‪14‬‬ ‫و‪15‬‬ ‫عوض نمايد بیتهاي ‪ 7,8‬را دست نخورده باقي بگذارد ‪ .‬بیتهاي‬ ‫‪ 2,3,4‬را متمم كند ‪ .‬بیتهاي ‪ 5,6‬را يك كند ‪.‬‬

‫پورت هاي ‪: PC‬‬ ‫پورتهاي كامپیوترهاي ‪PC‬ارتباط بین ‪ CPU‬وقسمتهاي مختلف‬ ‫كامپیوتربراي هريك از مدارات جانبي يك كامپیوتريا چندثبات‬ ‫درنظرگرفته شده است كه ارتباط بین ‪ CPU‬ومدارات جانبي‬ ‫را برقرارمي كند ‪.‬‬ ‫اين پورتها به دو دسته تقسیم مي شوند ‪:‬‬ ‫‪ -1‬پورتهاي ورودي ‪ :‬اين پورتها محل ورود اطلعات از‬ ‫مدارات جانبي به ‪ CPU‬مي باشند ‪.‬‬ ‫‪ -2‬پورتهاي خروجي ‪ :‬اين پورتهاگذرگاه انتقال اطلعات‬ ‫از‪ CPU‬به مدارات جانبي مي باشند ‪.‬‬

‫درصورتي كه بخواهیم به يكي از مدارات جانبي اطلعات ارسال‬ ‫كنیم ياازآن اطلعات دريافت كنیم ويا اينكه تبادل اطلعات را‬ ‫از طريق برنامه هاي وقفه انجام دهیم دركامپیوترهاي ‪ PC‬يك‬ ‫ناحیه ي ‪ 64KB‬براي ثبات هاي پورتها درنظرگرفته شده‬ ‫است هرسري از پورتها مربوط به قسمتي از كامپیوتراست ‪.‬‬ ‫بعنوان مثال درجدول زيرآدرس بعضي ازثباتهامنظورشده است ‪.‬‬ ‫لزم به ذكراست كه اين آدرس هاآدرس حافظه اصلي نیستند و‬ ‫نمي توانند همانند مقداردادن به حافظه اصلي به آنها مقدار داد‬ ‫ياازآنها مقدار گرفت ‪.‬‬ ‫براي مقداردهي به آنهااز دستورات خاصي مثل ‪ IN‬و ‪OUT‬‬ ‫استفاده مي كنیم ‪.‬‬ ‫آدرس برخي از شماره پورتها به صورت زير است ‪:‬‬

‫برخي از شماره پورتها به ‪: Hexa decimal‬‬ ‫ثبات هاي كنترلي وقفه‬ ‫شمارنده و ‪Timer‬‬

‫‪21H‬‬ ‫‪40 – 42‬‬

‫ورودي از صفحه كلید‬

‫‪60‬‬

‫كنترلي بازي‬

‫‪201‬‬

‫تطبیق دهنده‬

‫– ‪3B0‬‬ ‫‪3BF‬‬ ‫‪61‬‬

‫بلندگو )بیت ‪ 0‬و‪(1‬‬ ‫صفحه نمايش تك رنگ و پورت موازي چاپگر‬ ‫كنترلي ‪disk‬‬

‫– ‪3D0‬‬ ‫–‪3DF‬‬ ‫‪3F0‬‬ ‫‪3FD‬‬

‫دستور ‪ : IN‬اين دستوريك يا دوبايت را از ورودي خوانده و‬ ‫آن را درثبات ‪ AX‬ويا ‪ AL‬قرار مي دهد ‪.‬‬ ‫شكل كلي اين دستوربه صورت زير است ‪:‬‬ ‫‪IN AL,Portnumber‬‬ ‫‪IN AX,Portnumber‬‬ ‫دستور ‪ :OUT‬ازاين دستوربراي فرستادن يك بايت يايك كلمه‬ ‫از ثبات ‪ AX‬يا ‪ AL‬به پورت موردنظر استفاده مي شود ‪.‬‬ ‫شكل كلي اين دستوربه صورت زير است ‪:‬‬ ‫‪OUT Portnumber,AL‬‬ ‫‪OUT Portnumber,AX‬‬

‫‪:‬مثال‬ ‫بااستفاده از دسترسي به آدرس پورتها قسمت برنامه اي بنويسید‬ ‫كه درصورت اجرا بااستفاده از پورت ‪ 61H‬تولید‬ ‫صدانمايد‪.‬‬ ‫‪START : MOV DX , 1000‬‬ ‫‪IN AL , 61H‬‬

‫‪TOP :‬‬

‫‪AND AL , 0FEH‬‬ ‫‪XOR AL , 02H‬‬ ‫‪OUT 61H , AL‬‬ ‫‪MOV CX , 1000‬‬ ‫‪DELAY : LOOP DELAY‬‬ ‫‪DEC DX‬‬ ‫‪CMP DX ,‬‬ ‫‪JNE TOP‬‬

‫تمرين ‪: 1‬‬ ‫با استفاده از دسترسي به آدرس پورتها برنامه اي بنويسید كه‬ ‫در صورت اجرا مشخص نمايد چاپگر آماده است يا خیر ؟‬

‫ بااستفاده از دسترسي به آدرس پورتها برنامه اي‬:2 ‫تمرين‬ . ‫ صفحه كلید بخواند‬Buffer ‫بنويسید كه يك كاراكتررا از‬ MASK1

DB 0000000000001111

MASK2

DB 0000000011110000

MASK3

DB 0000111100000000

MASK4

DB 1111000000000000

MASK_OUT1 DB 10000001 MASK_OUT2 DB 01000010 MASK_OUT3 DB 00100100 MASK_OUT4 DB 00011000

START :

JE LTHREE

IN AX , 305H

MOV AX , BX

MOV BX , AX

AND AX , MASK4

AND AX , MASK1

CMP AX , MASK4

CMP AX , MASK1

JE LFOUR

JE LONE

EXIT :

MOV AX , BX AND AX , MASK2 CMP AX , MASK2 JE LTWO MOV AX , BX AND AX , MASK3 CMP AX , MASK3

LONE : MOV AL , MASK_OUT4 OUT 307H , AL JMP EXIT

LTWO : MOV AL , MASK_OUT3 OUT 307H , AL JMP EXIT

LTHREE : MOV AL , MASK_OUT2 OUT 307H , AL JMP EXIT

LONE : MOV AL , MASK_OUT1 OUT 307H , AL JMP EXIT

‫دستورات ‪ PUSH‬و ‪: POP‬‬ ‫وقتي كه يك زيربرنامه را فراخواني مي كنیم درمواقع اجراي‬ ‫زيربرنامه بهتراست كه درابتدا محتويات ثبات ها را به حالت‬ ‫اول خودبرگرداند اين كاربدين منظورانجام مي شود كه ثباتها‬ ‫بخصوص ثباتهاي عمومي درتمام زيربرنامه ها استفاده مي‬ ‫‪.‬شوند‬ ‫تغییردادن مقدار آنهادرطول زيربرنامه ممكن است اختللتي‬ ‫‪.‬در برنامه ايجاد كند‬ ‫دستور ‪ PUSH‬مي تواند مقدار يك ثبات يا محلي از حافظه‬ ‫رادر محلي بنام ‪ STACK‬ذخیره نمايد ‪ .‬دراين محل هريك‬ ‫از اطلعات جديد روي اطلعات قبلي قرار مي گیرد ‪.‬‬

‫بنابراين براي بازيابي اطلعات بايد آنهارا برعكس زمان‬ ‫‪.‬ذخیره كردن بازيابي نمود‬ ‫دستور ‪ POP‬براي بازيابي كردن مقداري از ‪Stack‬‬ ‫وقرار دادن دريك ثبات يا متغیرحافظه استفاده مي شود ‪.‬‬ ‫شكل كلي اين دستور بصورت زير است ‪:‬‬ ‫‪PUSH mem/reg‬‬ ‫‪POP‬‬ ‫‪mem/reg‬‬ ‫سؤال ‪ :‬دستورات زير معادل كدام دستوردر اسمبلي است ؟‬ ‫‪PUSH AX‬‬

‫‪XCHG AX ,‬‬ ‫‪BX‬‬

‫‪PUSH BX‬‬ ‫‪AX‬‬

‫‪POP‬‬

‫‪BX‬‬

‫‪POP‬‬

‫دستورات زير چه كاري انجام مي دهند ؟‬ MOV AX , 30F2H MOV BX , 1200H MOV CX , 3022H PUSH AX PUSH BX PUSH CX . . POP CX POP BX POP AX

SP SP

1230 1231

22 30

SP SP

1232 1233

00 12

SP SP

1234 1235

F2 30 12 36

‫مثال ‪ :‬قسمت برنامه اي بنويسید كه دربرنامه ي اصلي مقدار‬ ‫‪ah‬و ‪ bh‬بعنوان پارامتر به يك پشته ارسال شوند وسپس‬ ‫در زيربرنامه مقداري از‪ Stack‬خوانده شود ‪.‬‬ ‫‪AL DW 203FH‬‬

‫‪BP = SP‬‬

‫‪IP‬‬

‫‪BP + 2‬‬

‫‪60‬‬ ‫‪35‬‬

‫‪BP + 4‬‬

‫‪3F‬‬ ‫‪20‬‬ ‫‪START‬‬

‫‪BL DW 3566H‬‬ ‫‪START:‬‬ ‫‪PUSH AL‬‬ ‫‪PUSH BL‬‬ ‫‪CALL P1‬‬ ‫‪:‬‬ ‫‪END‬‬ ‫‪P1 PROC NEAR‬‬ ‫‪MOV BP , SP‬‬ ‫]‪MOV BX , [BP+2‬‬ ‫]‪MOV AX , [BP , 4‬‬ ‫‪:‬‬ ‫‪ENDP‬‬

‫‪:‬تكلیف‬ ‫دستورات لزم براي يك برنامه ي اصلي وزير برنامه به زبان‬ ‫اسمبلي را بنويسید كه هركدام دريك فايل جداگانه قراردارند‬ ‫وبرنامه ي اصلي دو عددرا كه درمكان ‪ data1‬و‬ ‫‪ data2‬قراردارند وبصورت باينري مي باشند ازطريق‬ ‫‪ Stack‬به زيربرنامه بدهد ‪.‬‬ ‫زيربرنامه اين عددهارا از ‪ Stack‬بردارد ودرهم ضرب‬ ‫نمايد ودر ‪ Stack‬قرار دهد سپس كنترل به برنامه ي‬ ‫اصلي برگردد ‪.‬‬ ‫برنامه ي اصلي اين عدد رااز ‪ Stack‬بردارد ودرمكان‬ ‫‪ data3‬قرار دهد ‪.‬‬

‫دستور ‪: LAHF‬‬ ‫اين دستور‪ 8BIT‬پايین)كم ارزش( ثبات وضعیت را در‪AH‬‬ ‫بار مي كند ‪.‬‬ ‫دستور ‪: SAHF‬‬ ‫اين دستورمقدار‪ AH‬رادر‪ 8BIT‬پايین ثبات وضعیت قرار‬ ‫میدهد‪.‬‬ ‫دستور ‪: POPF‬‬ ‫اين دستورمقدارثبات وضعیت رااز ‪ TOP‬پشته مي گیرد ‪.‬‬ ‫دستور ‪: PUSHF‬‬ ‫اين دستور مقدارثبات وضعیت را در ‪ TOP‬پشته كپي مي كند ‪.‬‬

‫‪:‬تمرين‬ ‫قسمت برنامه اي بنويسید كه بیتهاي ‪ TF‬و ‪ DF‬و ‪OF‬‬ ‫ازثبات وضعیت را ‪ SET‬كند ‪.‬‬ ‫‪TF=8 , DF=10 , OF=11‬‬ ‫‪PUSHF‬‬ ‫‪POP AX‬‬ ‫‪OR AX , 0000110100000000‬‬ ‫‪PUSH AX‬‬ ‫‪POPF‬‬

‫‪:‬انواع چاپ برروي صفحه نمایش‬ ‫‪:‬با استفاده از وقفه ها ‪1-‬‬ ‫بااستفاده ازوقفه ها مي توان رشته رابه صورت حرف به‬ ‫‪.‬حرف يا يك جابايك وقفه چاپ نمود‬ ‫مثال ‪ :‬باوقفه ي ‪ 10h‬سرويس ‪ 09h‬مي توان يك‬ ‫كاراكتررادر محل جاري مكان نما چاپ كرد ‪.‬‬ ‫‪MOV BH , 0‬‬ ‫’‪MOV AL , ‘A‬‬ ‫‪MOV BL , 1FH‬‬ ‫‪MOV CX , 1‬‬ ‫‪MOV AH , 09H‬‬ ‫‪INT 10H‬‬

‫‪:‬مثال‬ ‫با وقفه ي ‪ 21H‬سرويس ‪ 09H‬مي توان يك رشته را در‬ ‫محل جاري مكان نما چاپ كرد ‪.‬‬ ‫’‪S DB “This is a test !...”, ‘$‬‬ ‫‪Lea dx , s‬‬ ‫‪Mov ah , 09h‬‬ ‫‪Int 21h‬‬

‫‪:‬نكته‬ ‫وقفه ي ‪ 21H‬سرويس ‪ 02H‬براي نمايش كاراكتري كه در‬ ‫‪ DL‬قرار دارد استفاده مي شود‪.‬‬

‫‪ -2‬با استفاده از ‪: Video Ram‬‬ ‫‪ Video Ram‬درحالت متني ‪ 25*80‬آدرس‬ ‫‪ 0b800:0000‬را دارد كه بصورت زيرمي باشد ‪:‬‬

‫براي بدست آوردن مختصات يك نقطه براي چاپ درحافظه ي‬ ‫ازرابطه ي زيراستفاده مي شود‬ ‫‪:Video‬‬ ‫نمايشي ‪Ram‬‬ ‫‪PTR = 0B800H‬‬ ‫‪PTR = PTR+(X-1)*2+(Y-1)*160‬‬

‫براي چاپ كردن یك كاراكتردر صفحه نمایش توسط ‪ VR‬باید‬ ‫آدرس متناظر با آن موقعیت رامحاسبه كرده ودر ‪2Byte‬‬ ‫متناظرباآن كد كاراكتروهمچنین رنگ آن رامشخص نماییم‪.‬‬ ‫براي مقداردادن به یك آدرس بایدابتدا دوبایت سمت چپ آدرس‬ ‫رادریكي ازثبات هاي ناحیه ي ‪ ES‬یا ‪ DS‬قراردهیم ودو‬ ‫بایت سمت راست را در ثبات ‪ BX‬یایكي از ثبات هاي‬ ‫شاخص یا پایه قرار مي دهیم و باید توسط دستور ‪MOV‬‬ ‫عمل انتقال به آن آدرس را انجام دهیم ‪.‬‬

‫‪:‬مثال‬ ‫كاراكتر ‘‪ 'A‬را درموقعیت )‪ (1,1‬بارنگ زرد و زمینه ي‬ ‫آبي چاپ كنید ‪.‬‬ ‫‪MOV AX , 0B800H‬‬ ‫‪MOV ES , AX‬‬ ‫‪MOV BX , 00H‬‬ ‫‪MOV AL , 65‬‬ ‫‪MOV AH , 04H‬‬ ‫‪MOV ES : [BX] , AX‬‬

‫مثال‬: AL ‫ كاراكتري كه در‬VR ‫تابعي بنويسید كه بااستفاده از‬ BH ‫ وستون‬BL‫ درسطر‬AH ‫وجود داردورنگ آن در‬ .MODEL Tiny,C,,OS_DOS SUB AH , AH H: . ‫چاپ كند‬ .286 .CODE .STARTUP JMP H PUTCH PROC NEAR PUSH ES PUSH AX PUSH BX PUSH CX MOV CX , 0B800H MOV ES , CX DEC BL DEC BH MOV CX , AX

MOV AL , 80 MUL BL ADD AL , BH ADC AH , 0 SHL AX , 1 MOV BX , AX MOV AX , CX MOV ES : [BX] , AX POP DX POP CX POP BX POP AX POP ES RET PUTCH ENDP

MOV AH , 1HH MOV AL , ‘A’ MOV BL , 20 MOV BH , 10 CALL PUTCH .EXIT0 END

‫تمرين ‪: 1‬‬ ‫‪.‬برنامه اي بنويسید كه صفحه نمايش را بارنگ پنج پاك كند‬ ‫)بااستفاده از ‪( Video Ram‬‬

‫تمرين ‪: 2‬‬ ‫برنامه اي بنويسید كه بااستفاده از ‪ Video Ram‬يك ‪Box‬‬ ‫از )‪ (5,6‬تا )‪ (30,12‬رسم كند ‪.‬‬

‫تمرين ‪: 3‬‬ ‫برنامه اي بنويسید كه بااستفاده از ‪ Video Ram‬يك منو با‬ ‫پنج گزينه روي صفحه نمايش ايجاد كند بااستفاده از‬ ‫كلیدهاي ‪ Arrow up‬و ‪ Arrow down‬روي گزينه‬ ‫هاي آن حركت كرده وبازدن كلید ‪ Enter‬هريك پیغام‬ ‫خاصي برروي صفحه نمايش چاپ شود گزينه ي خروج‬ ‫نیز داشته باشد ‪.‬‬

‫ماکرو )درشت دستور(‪:‬‬ ‫قسمتی از یک زیر برنامه اسمبلی است که ن ام خاصی را ب ه آن‬ ‫اختصاص داده ایم‪ .‬ماکرو همانند زیربرنامه است با این تفاوت که با‬ ‫هر بار فراخوانی یک ماکرو تمام دست ورات ماک رو در مح ل‬ ‫فراخوانی کپی می شود‪.‬‬ ‫برای فراخوانی ماکرو باید از دستور ‪ MACRO‬استفاده نمود‪.‬‬ ‫شکل کلی یک ماکرو به صورت زیر است‪:‬‬

‫‪Name_macro MACRO parameter_list‬‬ ‫‪local‬‬ ‫نام برچسب ها‬ ‫دستورات ماکرو‬ ‫‪ENDM‬‬

‫فراخوانی ماکرو‬ ‫برای فراخوانی یک ماکرو کافی است نام آن را در مح ل م ورد نیاز‬ ‫ذکر نماییم‪ .‬پارامترهای ماکرو می توانند در جلوی کلمه ماکرو به‬ ‫همراه “ ‪ ” ,‬از هم متمایز شوند‪.‬‬

‫اگر بخواهیم ماکرویی که دارای پارامتر می باشد را فراخوانی نمایی م‬ ‫باید نام آن را به همراه پارامترها در محل مورد نیاز ذکر کنیم‪.‬‬

‫چند نکته‪:‬‬ ‫‪ -1‬استفاده از ماکرو حجم برنامه را به طور قابل ملحظه ای افزایش‬ ‫می دهد‪ .‬اما از طرفی به خوانایی برنامه کمک می کند و همچن ین‬ ‫دسترسی به زیربرنامه ها را ساده تر می کند‪.‬‬ ‫‪ -2‬برای اینکه حجم برنامه در موقع استفاده از ماکرو افزای ش پی دا‬ ‫نکند بهتر است در ماکرو فقط مقداردهی ثباتها را انجام دهیم و در‬ ‫انتهای آن زیربرنامه مربوطه را فراخوانی کنیم‪.‬‬ ‫‪ -3‬تعریف ماکرو باید قبل از تعاریف ‪ Segment‬برنامه باشد‪.‬‬

:‫مثال‬ ‫ ببرد؟‬col ‫ و ستون‬row ‫ماکرویی بنویسید که مکان نما را به سطر‬ Gotoxy MACRO col,row mov ah,02h mov al,00h mov bh,00h mov dh,col mov dl,row int 21h ENDM

mov row,5 mov col,7 Gotoxy col,row ‫فراخوانی ماکرو در برنامه‬

‫مثال‪:‬‬ ‫ماکرویی بنویسید که با دریافت رشته ‪ ,‬رشته را در مح ل ج اری‬ ‫مکان نما چاپ کند؟‬ ‫‪Put_str MACRO string‬‬ ‫‪mov ah,09h‬‬ ‫‪lea dx,string‬‬ ‫‪int 21h‬‬ ‫‪ENDM‬‬ ‫فراخوانی ماکرو‬

‫‪put_str msg1‬‬

:‫مثال‬ ‫ ک ه دارای چ هار‬putchm ‫ ماکرویی به نام‬,‫با استفاده از ماکرو‬ ‫ می باشد را به زب ان اسمب لی‬col,row,char,attr ‫پارامتر‬ ‫بنویسید؟‬ . Model tiny,c,os_dos . 286 Putchm MACRO col,row,char,attr push ax push bx mov al,char mov ah,attr mov bl,col

mov bh,row Call putch pop bx pop ax ENDM .code . Startup jmp L putch proc near

putch endp

L: putchm 2,2,’A’,1fH putchm 10,10,’B’,4fH .Exit0 End

‫دستورات رشته ای‪:‬‬ ‫برای انجام دستورات رشته ای بایستی قبل از هر چیز وضعیت بیت‬ ‫‪ )DF )Direction Flag‬را مشخص کنیم‪ .‬زیرا این بی ت با دو‬ ‫مقدار‪ 0‬و ‪ 1‬خود تنظیم کننده عملیات رشته ای از راست به چپ‬ ‫یا از چپ به راست می باشد‪.‬‬

‫دستور ‪)CLD )Clear Direction Flag‬‬ ‫با استفاده از این دستور بی ت ‪ DF‬از ثبات وضعی ت را ص فر‬ ‫می کنیم‪.‬‬

‫دستور ‪:)STD )Set Direction Flag‬‬ ‫با اجرای این دستور بیت ‪ DF‬از ثبات وضعیت را یک می کنیم‪.‬‬

‫دستور ‪:) REP )Repeat‬‬ ‫با استفاده از این دستور می توانیم دستور جلوی آن را به اندازه ‪Cx‬‬ ‫تکرار کنیم‪ .‬عملیات تا زمانی که ‪ cx‬کاهش یافته و ص فر شود‬ ‫ادامه می یابد‪.‬‬ ‫‪mov cx,n‬‬ ‫دستور ‪Rep‬‬

‫دستورات ‪: MOVSB , MOVSW‬‬ ‫این دو دستور برای انتقال دادن یک رشته از محلی از حاف ظه ب ه‬ ‫محل دیگری از حافظه استفاده می شوند‪.‬‬ ‫‪ Movsb‬هر بار یک بای ت از مح لی که ‪ DS:SI‬آدرس آن را در‬ ‫ب ردارد به مح لی که ‪ ES:DI‬آدرس آن را در ب ردارد کپ ی‬ ‫می کند‪.‬وبا استفاده از دستور ‪ Movsw‬هر بار دو بای ت کپ ی‬ ‫می شود‪ .‬پس از کپی کردن یک یا دو بایت توسط این دست ورات‬ ‫یک یا دو واحد به ثباتهای ‪ SI‬و ‪ DI‬اضافه یا کم می گردد‪.‬‬

‫نکته‪:‬‬ ‫اگر ‪ DF=0‬باشد ‪ SI‬و ‪ DI‬افزایش پیدا می کنند‪.‬‬ ‫اگر ‪ DF=1‬باشد ‪ SI‬و ‪ DI‬کاهش پیدا می کنند‪.‬‬

:‫مثال‬ ‫ بایت را در رشته‬10 ‫ به طول‬str1 ‫دست وراتی بن ویسید که رشته‬ ‫ کپی کند؟‬str2 Str1 db “abcdefghij” Str2 db 10 dup )?( mov si,offset str1 mov di,offset str2 CLD mov cx,10 Rep movsb

:‫مثال‬ ‫مجموعه دست ورات زیر چه عم لی را ان جام م ی دهند؟ در انتها‬ .‫ را مشخص نمائید‬String ‫محتویات رشته‬ String db “ABCDEFGHIJ” mov cx,4 mov si,offset string+4 mov di,offset string+9 STD Rep movsb

A

B

C

D

E

F

G

H

SI

A

B

C

D

I

J

DI

E

F

B

C

”result string:”ABCDEFBCDE

D

E

:‫مثال‬ ‫ کپی کند؟‬str2 ‫ را در‬str1 ‫ کلمه از‬10 ‫دستوراتی بنویسید که‬

Str1 dw “ ABCDEFGHIJ” Str2 dw 10 dup)?( mov si,offset str1 mov di,offset str2 CLD mov cx,5 Rep movsw

‫دستورات ‪: LODSB , LODSW‬‬ ‫این دو دست ور از آدرس ‪ DS:SI‬یک بایت در ‪ al‬و یا دو بایت در‬ ‫‪ ax‬کپی می کنند‪.‬‬

‫نکته‪:‬‬ ‫با اجرای دستورات فوق اگر ‪ DF=1‬باشد ‪ SI‬یک یا دو بایت کاهش‬ ‫می یاب د و اگر ‪ DF=0‬باشد ‪ SI‬یک یا دو بای ت افزایش پیدا‬ ‫می کند‪.‬‬

:‫مثال‬ ‫ قرار‬str2 ‫ را در رشته‬str1 ‫دستوراتی بنویسید که معکوس رشته‬ ‫دهد؟‬ Str1 db “ABCDFG” Str2 db 6 dup )?( mov si,offset str1 mov di,offset str2+5 CLD mov cx,6 L1: LODSB mov [di],al dec di Loop L1

‫دستورات ‪: STOSB , STOSW‬‬ ‫با استفاده از این دو دست ور می توان محت ویات ‪ al‬و یا ‪ ax‬را در‬ ‫آدرس ‪ DS:DI‬از حافظه کپی نمود‪.‬عمل کپی یک یا دو بایت ی‬ ‫انجام می شود‪.‬‬

‫نکته‪:‬‬ ‫با اجرای این دو دست ور اگر ‪ DF=0‬باشد ‪ DI‬یک یا دو بای ت‬ ‫افزایش می یابد و اگر ‪ DF=1‬باشد ‪ DI‬یک یا دو بای ت کاهش‬ ‫می یابد‪.‬‬

‫مثال‪:‬‬ ‫قسمت برنامه ای بنویسید که رشته ‪ str1‬به طول ‪ 10‬بای ت را با‬ ‫کاراکتر ‪ Space‬پر کند؟‬

‫کد کاراکتر ‪Space‬‬

‫(?) ‪Str1 db 10 dup‬‬ ‫‪mov cx,5‬‬ ‫‪CLD‬‬ ‫‪Lea di,str1‬‬ ‫‪mov ax,2020H‬‬ ‫‪Rep stosw‬‬

‫دستور ‪ REPE‬یا ‪: REPZ‬‬ ‫عملیات تا زمانی که ‪ ZF‬مبتنی بر مساوی یا صفر باش د ادام ه‬ ‫می یابد‪.‬وقتی که ‪ ZF‬مبتنی بر صفر نبودن ش ود یا ‪ cx‬کاهش‬ ‫یافته وصفر شود عملیات خاتمه می یابد‪.‬‬

‫دستور ‪ REPNE‬یا ‪: REPNZ‬‬ ‫عملیات تا زمانی که ‪ ZF‬مبنی بر عدم صفر یا نامس اوی باش د‬ ‫تکرار می شود‪ .‬وقتی که ‪ ZF‬مبنی بر صفر یا مس اوی بودن‬ ‫شود یا ‪ cx‬کاهش یافته و صفر شود خاتمه می یابد‪.‬‬

‫دستورات ‪: CMPSB , CMPSW‬‬ ‫این دو دستور یک بایت یا دو بای ت از آدرس ‪ DS:SI‬را ب ا آدرس‬ ‫‪ ES:DI‬مقایسه می کند که پرچم های زیر را تنظیم می کند‪.‬‬ ‫‪ZF,AF,OF,CF,SF,PF‬‬ ‫با اجرای این دو دستور اگر‪ DF=0‬باشد ‪ DI‬یا ‪ SI‬یک یا دو واح د‬ ‫افزایش می یابد و اگر ‪ DF=1‬باشد ‪ DI‬یا ‪ SI‬یک یا دو واح د‬ ‫کاهش می یابد‪.‬‬

‫مثال‪:‬‬ ‫قسمت برنامه ای بنوی سید که دو رشت ه ‪ S1‬و ‪ S2‬را ب ه طول ‪5‬‬ ‫بایت مقایسه کند‪ .‬اگر این دو رشته برابر بودند در ‪ BH‬مقدار ‪1‬‬ ‫را قرار دهد و در ادامه رشته ‪ S2‬را با رشته ‪ S3‬مقای سه کن د‬ ‫اگر برابر نبودند در ‪ BH‬مقدار ‪ 2‬را قرار دهد؟‬ ‫”‪S1 db “ABCDE‬‬ ‫”‪S2 db “ABCDE‬‬ ‫”‪S3 db “AKMNO‬‬ ‫‪mov si,offset S1‬‬ ‫‪mov di,offset S2‬‬ ‫‪CLD‬‬

mov cx,5 :Repe cmpsb mov bh,1 :L1 mov cx,5 lea si,S2 lea di,S3 Repe cmpsb je L2 mov bh,2

L2 Jne L1

‫دستورات ‪: SCASB , SCASW‬‬ ‫از این دو دستور برای جستجوی کاراکتری که در ‪ al‬یا مقداری که‬ ‫در ‪ ax‬وجود دارد در آدرس ‪ ES:DI‬استفاده می شود که با توجه‬ ‫به شرایط ‪ DF‬فقط ‪ DI‬افزایش یا کاهش می یابد‪.‬‬

‫مثال‪:‬‬ ‫قسمت برن امه ای بنوی سید که در رشت ه ای به طول ‪ 10‬بای ت‬ ‫کاراکت ری که در ‪ al‬وج ود دارد را جستج و کند اگر پیدا کرد‬ ‫مقدار ‪ 03‬را در ‪ al‬قرار دهد؟‬

“Str1 db “ABCDEFGHML mov cx,10 CLD Lea di,str1 ‘mov al,’F Repne scasb Jne L1 mov al,03H :L1

‫مثال‪:‬‬ ‫قسمت برنامه ای بنویسید که کاراکتر ’*‘ را در رشته ‪ str‬به طول‬ ‫‪ 6‬بایت جستجو کند‪ .‬اگر پیدا کرد آن را با ‪ Space‬جایگزین کند؟‬ ‫‪L1:‬‬

‫”‪Str db “ABC*EF‬‬ ‫‪mov cx,6‬‬ ‫‪CLD‬‬ ‫‪Lea di,str‬‬ ‫’*’‪mov al,‬‬ ‫‪Repne scasb‬‬ ‫‪Jne L1‬‬ ‫‪mov byteptr [di+1],20H‬‬

‫مثال‪:‬‬ ‫قسمت برنامه ای بنویسید که در یک رشت ه بن ام ‪ str‬به طول ‪20‬‬ ‫بایت کاراکتر ’*‘ را جستجو کند‪ .‬به طوری که تمام کاراکترهای‬ ‫’*‘ موجود در رشته را با ‪ Space‬جایگزین کند؟‬ ‫‪:Repeat‬‬ ‫‪Repne scasb‬‬ ‫‪jne L1‬‬ ‫‪mov byteptr [di+1],20H‬‬ ‫‪Loop Repeat‬‬ ‫‪:L1‬‬

‫(?)‪Str db 20 dup‬‬ ‫‪Mov cx,20‬‬ ‫‪CLD‬‬ ‫‪mov di,offset str‬‬ ‫’*’‪mov al,‬‬

‫برنامه های مقیم در حافظه‪:‬‬ ‫یکی از کاربردهای زبان اسمبلی مقیم کردن برنامه های اجرای ی در‬ ‫حافظه می باشد‪.‬‬ ‫مقیم کردن یک برنامه یعنی این که‪ :‬آن را در حافظه اص لی طوری‬ ‫قرار دهیم که در زمان های خاصی و در شرای ط خاص به طور‬ ‫خودک ار اج را شود‪ .‬در حالی که به طور همزمان بت وانیم در‬ ‫کامپیوتر برنامه های دیگری را اجرا نماییم‪.‬‬ ‫همانطور که در مورد وقفه ‪ 5‬توضیح داده شد وقفه های نرم افزاری‬ ‫برنامه های مقیم در حافظه هس تند که در شرای ط خاص اج را‬ ‫می شوند‪.‬‬

‫برای مقی م کردن برنامه های دیگر نیز از ساخت اری مانند ساخت ار‬ ‫وقفه ها می توان استفاده کرد‪.‬‬ ‫برنامه های مربوط به وقفه ها در قسمت های مختلف حافظه پراکن ده‬ ‫هستند‪ .‬وقتی که شرایط ب رای اج رای یک وقفه فراهم می ش ود‬ ‫سیستم عامل آدرس برنامه وقفه را از ابتدای حافظه پیدا م ی کند و‬ ‫سپس به آدرس آن مراجعه کرده برنامه وقفه را اجرا می کند‪.‬‬ ‫آدرس برنامه های وقفه در ابتدای حاف ظه قرار گرفت ه اند و هر ‪4‬‬ ‫بای ت از این قسم ت ‪ ,‬آدرس ناحیه و تف اوت م کان و آدرس‬ ‫‪ Segment‬و ‪ Offset‬مربوط به یکی از وقفه ها را در بردارد‪.‬‬ ‫یعنی از بایت صف رم تا بای ت سوم آدرس وقف ه صفر را تشکی ل‬ ‫می دهد‪ .‬از بایت چهارم تا بایت هفتم آدرس وقفه یک و به هم ین‬ ‫ترتیب آدرس بقیه وقفه ها در بایتهای بعدی قرار دارند‪.‬‬

‫‪11 ... 255 254 253 252‬‬

‫‪9 10‬‬

‫وقفه ‪255‬‬

‫‪7 8‬‬

‫‪5 6‬‬

‫‪4‬‬

‫‪1 2 3‬‬

‫وقفه یک‬ ‫وقفه دو‬

‫وقفه صفر‬

‫‪0‬‬

:‫مثال‬ ‫ را‬5 ‫ وقفه شماره‬int ‫برنامه ای بنویسید که بدون استفاده از دستور‬ ) ‫ است‬print screen ‫ مربوط به کلید‬5 ‫اجرا کند؟ ( وقفه شماره‬ .model tiny,c,os_dos .286 .code .startup Oldint dd ? Start: mov bx,0

mov ES,bx mov bx,4*5 [mov ax,ES:[bx mov dword ptr oldint,ax [mov ax, ES:[bx+2 mov dword ptr oldint+2,ax call oldint exit0. End

‫برای این که برنامه ای را بصورت مقی م در حافظه بنویسی م باید‬ ‫کاری کنیم که این برنامه بصورت مستقی م یا غیرمستقی م توسط‬ ‫یکی از وقف ه ها اجرا شود‪ .‬بنابراین باید آدرس یکی از وقفه ها‬ ‫را تغییر دهیم و یا اینکه در برنامه مربوط به وقفه کاری کنیم که‬ ‫پس از اتمام آن برنامه ما فراخوانی شود‪.‬‬ ‫پس تن ها مقیم کردن برنامه در حافظه ن می تواند باع ث اج رای‬ ‫برنامه شود‪.‬‬ ‫برای مثال فرض کنید که بخواهی م برنامه ای بن ویسیم که با زدن‬ ‫کلی د ‪ Print Screen‬اج را شود‪ .‬برای ای ن کار به دو روش‬ ‫می توانیم عمل کنیم‪ .‬اول این که این برنامه را جایگزین برنامه‬ ‫اص لی وقفه ‪ 5‬نماییم‪ .‬یعنی از آدرس های ‪ 20‬تا ‪ 23‬که مربوط‬ ‫به وقفه ‪ 5‬می باشد‪ ,‬آدرس برنامه خود را قرار دهیم‪.‬‬

‫این کار باعث از کار افتادن برنامه اصلی وقفه ‪ 5‬خواهد شد‪.‬‬ ‫روش دوم این است که آدرس برنامه خود را در بایت ها ‪ 20‬تا ‪23‬‬ ‫قرار دهیم و در انتهای برنامه فوق برنامه اصلی وقفه ‪ 5‬را اجرا‬ ‫نماییم‪ .‬این عمل را انحراف بردار وقفه می نامند‪.‬‬ ‫‪20 21 22 23‬‬

‫‪ call‬برنامه‪User‬‬ ‫‪Print Screen‬‬

‫بن ابراین برای مقی م کردن یک برنامه در حافظه باید ابتدا بردار‬ ‫وق فه را به طور من اسب منحرف کرد و سپ س ب رنامه را‬ ‫بصورت مقیم در حافظه درآورد‪.‬‬

‫مقیم کردن یک برنامه در حافظه‪:‬‬ ‫(سرویس ‪ 27H‬از وقفه ‪) 21H‬‬ ‫برای اجرای این برنامه باید در ثبات ‪ bx‬آدرس قسمتی از‬ ‫ب رنامه را قرار دهیم که انتهای نقطه مقیم در حافظه را‬ ‫مشخص کند‪.‬‬ ‫در صورت اجرای این وقفه از بای ت ‪ CS:0000‬تا ‪CS:DX‬‬ ‫در حافظه مقیم می شود‪.‬‬

‫تغییر بردار وقفه‪:‬‬ ‫( سرویس ‪35H‬از وقفه ‪) 21H‬‬ ‫شماره سرویس ( ‪35H (=AH‬‬ ‫شماره وقفه=‪AL‬‬ ‫آدرس روال وقفه=‪ES:BX‬‬ ‫‪Int 21H‬‬ ‫تابع ‪ 35H‬از وقفه ‪ 21H‬آدرس ب رنامه اصلی وق فه را در ث بات‬ ‫‪ ES:BX‬قرار می دهد‪ .‬برای این منظور شماره وق فه را باید در‬ ‫ثبات ‪ AL‬قرار دهیم‪ (.‬تعیین آدرس روال یک وقفه)‬

‫تغییر آدرس بردار وقفه‪:‬‬ ‫سرویس ‪ 25H‬از وقفه ‪21H‬‬ ‫شماره سرویس ( ‪25H ( = AH‬‬ ‫شماره وقفه‪=AL‬‬ ‫آدرس جدید روتین وقفه‪=DS:DX‬‬ ‫‪Int 21‬‬ ‫تابع ‪ 25H‬از وقفه ‪ 21H‬آدرس یک برنامه جدید را در بردار وقف ه‬ ‫قرار می دهد‪ .‬برای این منظور در ثبات ‪ AL‬شماره وقف ه و در‬ ‫ثب ات ‪ AH‬شماره ‪ 25H‬را ق رار داده و در ثب ات ‪ DX‬آدرس‬ ‫ت فاوت مکان برنامه را قرار می دهیم‪ .‬با اجرای این وقفه مقدار‬ ‫‪ CS‬و ‪ DX‬در بردار وقفه می نشینند‪.‬‬

‫وقفه ‪ 27H‬برای مقیم کردن یک برنامه در حافظه استفاده می شود‪.‬‬ ‫برای است فاده از این وق فه در ثبات ‪ DX‬آدرس ت فاوت مکان‬ ‫انتهای برنامه را قرار می دهیم‪.‬‬ ‫این برنامه از آدرس ‪ CS:DX‬تا ‪ CS:0000‬را در حافظه مقیم می‬ ‫کند‪ .‬برای مقیم کردن یک برنامه در حافظه ابتدا یکی از برن امه‬ ‫ها را انتخاب می نماییم‪ (.‬انتخاب شماره یکی از وقفه ها بست گی‬ ‫به نیاز ما دارد‪ .‬به عنوان مثال اگر بخواهیم کلید ‪Print Screen‬‬ ‫را تغییر دهیم باید وق فه ‪ 5‬را انت خاب کنیم و اگ ر بخواهی م‬ ‫وق فه ‪ Timer‬را تغییر دهیم بایستی وقفه ‪ 8‬را انتخاب نماییم‪).‬‬ ‫پس از انتخاب وقفه باید آدرس برنامه اصلی آن را ب دست آوریم‪.‬‬ ‫این کار توسط تابع ‪ 35H‬از وقفه ‪ 21H‬امکان پذیر م ی باشد‪.‬‬ ‫سپس باید آدرس برنامه خود را به جای برنامه اص لی وقفه قرار‬ ‫دهیم ‪ .‬که این کار توسط تابع ‪ 25H‬از وقفه ‪ 21H‬ام کان پذیر‬

‫است‪ .‬پ س از آن بای د برنامه را با استفاده از تابع ‪ 27H‬بصورت‬ ‫مق یم در حافظه درآوریم‪ .‬در برنامه مقیم شده باید دقت کنیم که‬ ‫عم ل ذخیره و بازیابی ثباتها در ابتدا و انتهای برنامه و همچن ین‬ ‫ف راخوانی برنامه اصلی وقفه انجام می شود‪ .‬ضمنا در برن امه‬ ‫مقیم شده هز دستور ‪ iret‬برای اتمام برنامه استفاده می کنیم‪.‬‬

‫نکته‪:1‬‬ ‫درموقع تغییربرداروقفه ابتدا از دستور ‪)CLI )Clear Interrupt‬‬ ‫برای از کار انداختن وقفه و پس از پایان عمل تنظیم‪ ,‬از دست ور‬ ‫‪ ) STI )Set Interrupt‬برای فعال کردن وقفه استفاده می کن یم‪.‬‬ ‫انجام این کار به این دلیل است که‪:‬در موقع تنظیم ب ردار وق فه‪,‬‬ ‫ممکن است شرایط برای اجرای وقفه فراهم شود و به دلی ل ع دم‬ ‫تنظیم کامل بردار وقفه‪ ,‬کامپیوتر قفل کند‪.‬‬

‫نکته‪:2‬‬ ‫بهتر است در برنامه های مقیم در حافظه به جای است فاده از وق فه‬ ‫‪ Dos‬برای چاپ از ‪ Video Ram‬استفاده شود‪.‬‬

‫مثال‪:‬‬ ‫برنامه ای بصورت مقیم در حافظه بنویسید که کاراکتر ’*‘ همیشه‬ ‫گوشه بالی صفحه نمایش نشان داده شود؟‬

model tiny,c,Os_dos. 286. code. startup. ? Oldint dd Newint proc CLI push cs [call ds:[oldint push es push 0B800H pop es

mov es:[0],1F2AH Pop es STI Iret Newint endp :Com mov ax,3508H int 21H mov wordptr oldin,bx mov wordptr oldint[2],es mov dx,offset newint

Push cs Pop ds mov ax,2508H Int 21H mov ax,0000H mov dx,offset com Int 21H

‫وقفه ‪: 16H‬‬ ‫این وقفه برای کار با صفحه کلید و ‪ Buffer‬صفحه کلید انتخاب می‬ ‫شود‪.‬‬

‫سرویس ‪ 01H‬از وقفه ‪: 16H‬‬ ‫این سرویس به منظور کسب اطلع از وضعیت ‪ Buffer‬ص فحه‬ ‫کلید استفاده می شود‪.‬‬ ‫خروجی ‪AH=01H‬‬ ‫‪ZF=0‬‬ ‫‪Int 16H‬‬ ‫‪ZF=1‬‬

‫سرویس ‪ 02H‬از وقفه ‪: 16H‬‬ ‫این سرویس به منظور گزارش گیری از وضعی ت صف حه کلی د‬ ‫استفاده می شود‪.‬‬ ‫‪AL 7 6 5 4 3 2 1 0‬‬

‫خروجی‬

‫‪AH=02H‬‬ ‫‪Int 21H‬‬

‫بیت ‪ :0‬کلید ‪ Shift‬راست فشرده شده‪1=.‬‬ ‫بیت ‪ :1‬کلید ‪ Shift‬چپ فشرده شده‪1=.‬‬ ‫بیت ‪ :2‬کلید ‪ Ctrl‬چپ فشرده شده‪1=.‬‬ ‫بیت ‪ :3‬کلید ‪ Alt‬چپ فشرده شده‪1=.‬‬ ‫بیت ‪ :4‬کلید ‪ Scroll Lock‬روشن است‪1=.‬‬ ‫بیت ‪ :5‬کلید ‪ Num Lock‬روشن است‪1=.‬‬ ‫بیت ‪ :6‬کلید ‪ Caps Lock‬فشرده شده‪1=.‬‬ ‫بیت ‪ :7‬کلید فشرده شده‪1=.‬‬

‫مثال‪:‬‬ ‫قسمت برنامه ای بنویسید که ‪ X‬را که در حاف ظه به ط ول ‪ 1‬بایت‬ ‫می باشد‪ ,‬در حافظه ای بنام ‪ Area‬که بصورت ص عودی مرتب‬ ‫شده و طول آن ‪ 10‬بای ت می باشد‪ ,‬به روش ‪Binary Search‬‬ ‫جستجو کند؟‬ ‫‪Area db 11,12,19,36,81,91‬‬ ‫‪db 100,102,104,110‬‬ ‫‪I db -1‬‬ ‫‪X db 102‬‬

mov si,0 mov di,9 :While cmp si,di jae exit mov ax,si add ax,di shr ax,1 mov bh,0 mov bl,al [mov al,area[bx

cmp al,x jne L1 mov I,bl jmp exit :L1 cmp al,x ja L2 mov di,bx-1 jmp while :L2 mov si,bx+1

jmp while :Exit

‫مثال‪:‬‬ ‫برنامه ای بن ویسی د که ‪ 10‬بایت اطلعات را از پ ورت ‪3F7H‬‬ ‫بخواند‪ .‬سپ س میان گین اعداد دریافتی را در محلی از حافظه به‬ ‫نام ‪ avg‬قرار دهد؟‬

Avg db ? Ten db 10 mov cx,10 mov bx,0 Start: in al,3F7H

adc bl,al loop start mov ax,bx Div ten mov avg,al mov si,0 mov di,7 :L3 cmp si,di jae exit [mov al,area[si

[cmp al,area[di je L4 :L4 inc si dec di jmp L3 :Exit

‫مثال‪:‬‬ ‫یک روال به زبان اسمبلی بنویسید که ت شخیص دهد‪ BH‬ح اوی‬ ‫یک ‪ Palindram‬می باشد؟ ( عددی با بیتهای قرینه )‬ ‫(?) ‪Area db 8 dup‬‬ ‫‪Sw db 1‬‬ ‫‪mov cx,8‬‬ ‫‪mov si,0‬‬ ‫‪L:‬‬ ‫‪shl bh,1‬‬ ‫‪jnc L2‬‬ ‫‪mov area[si],1‬‬ ‫‪L2:‬‬ ‫‪inc si‬‬ ‫‪loop L‬‬

EN

Related Documents

Assembly 1
November 2019 7
Assembly
November 2019 72
Assembly
May 2020 56
Assembly
November 2019 58
Assembly
August 2019 45
Assembly
June 2020 29