Vous êtes sur la page 1sur 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
‫خروجی‬ Test.obj
2. c:\asm> tlink test ; /t /v 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‬‬
‫‪Ax‬‬ ‫‪Z‬‬
‫‪bx‬‬ ‫‪s‬‬
‫‪CS: code segment‬‬ ‫ثباتها‬ ‫‪.‬‬ ‫‪p‬‬
‫‪.‬‬ ‫‪t‬‬
‫ثباتهای ‪Flag‬‬ ‫‪Ip‬‬ ‫‪I‬‬
‫‪sp‬‬ ‫‪c‬‬
‫‪SS:‬‬
‫‪DS: data segment‬‬ ‫‪Stack segment‬‬
‫برنامه ‪ ،TD‬محیطی شبیه زبان ‪ C‬دارد‪.‬‬
‫• کلید ‪ F9‬عمل ‪ Run‬انجام می شود‪.‬‬
‫• کلید ‪ ،F4‬عمل اجرای برنامه‪ ،‬از ابتدای برنامه تا محل کنونی‬
‫مکان نما را انجام میدهد‪.‬‬
‫• کلید ‪ ،F7‬می توان برنامه را دستور به دستور اجرا کرد‪( .‬حتی‬
‫دستورات درون روالها را نیز اجرا می کند)‪.‬‬
‫• کلید ‪ ،F8‬عمل اجرای دستور به دستور برنامه را انجام می دهد‪.‬‬
‫(با این تفاوت که روالها در یک ؟ اجرا می کند)‪.‬‬
‫دستور العمل از یک سری کد تشکیل شده است‪ .‬خواهیم دید که‬
‫زبان ماشین‪ ،‬متشکل از دستورالعمل هایی است که هر کدام با یک‬
‫کد مشخ ص م ی شوند ‪ .‬که ای ن کده ا‪ ،‬توس ط ارقام ‪ ،0,1‬ب ه واحد‬
‫پردازشگر مرکزی ارسال می شوند‪.‬‬
‫در ص ورتی ک ه بخواهی م برنام ه ای را ب ه زبان ماشی ن بنویسم‪،‬‬
‫بایستی تمام دستورالعمل ها و اطلعات را به صورت کد ‪ 0,1‬به‬
‫واح د پردازشگ ر مرکزی ارس ال کنیم‪ .‬ام ا برنام ه نویس ی ب ه این‬
‫طریق مشکل است‪ ،‬بنابراین زبانی به نام زبان اسمبلی ابداع شد ‪.‬‬
‫که هر یک از دستورالعمل های آن‪ ،‬معادل یک دستورعمل زبان‬
‫ماشین می باشد‪ .‬بنابراین یک زبان سطح پایین می باشد‪.‬‬
‫اما با استفاده از زبان اسمبلی می توان از تمامی امکانات سیستم‬
‫استفاده کرد‪ .‬در ‪ CPU‬قسمتهایی به نام ثبات ‪ Register‬وجود دارد‪.‬‬
‫گروه بندی ثباتها‪:‬‬
‫‪ -1‬ثباتهای عمومی‪ :‬ازاین ثباتها بیشترازثباتهای دیگردراسمبلی‬
‫استفاده می شود و تعداد این ثباتها‪ ،‬چهارعدد می باشد که با نامهای‬
‫‪ DX , CX , BX , AX‬قابل دستیابی می باشند‪.‬‬
‫هریک ازاین ثباتها‪ ،‬خود به دو دسته تقسیم می شوند‪:‬‬
‫‪8 bit‬‬ ‫‪8 bit‬‬ ‫‪Ah‬‬
‫‪AX‬‬
‫(‪AH )high‬‬ ‫(‪AL )Low‬‬ ‫‪Al‬‬
‫بعضی از دستورالعملهای زبان ماشین‪ ،‬بطورخاص‪ ،‬نیاز به یکی‬
‫ازاین ثباتها دارد‪ .‬اما در مورد بعضی از دستورالعملها‪ ،‬استفاده از‬
‫هر یک از این ثباتها‪ ،‬تفاوتی نمی کند‪.‬‬
‫‪ :AX‬برای انجام محاسبات استفاده می شود‪( .‬ضرب و تقسیم)‬
‫‪ :BX‬به عنوان ثبات پایه جهت آدرس دهی استفاده میشود‪.‬‬
‫‪ :CX‬به عنوان ثبات شماره استفاده میشود‪.‬‬
‫‪ :DX‬بیشتر برای عملیات رشته ای استفاده میشود‪.‬‬
‫ناحیه ‪Segment‬‬
‫هر آدرس از حافظه اصلی که قابل قسمت بر عدد ‪ 16‬باشد‪ ،‬یک‬
‫ناحیه تلقی می شود‪ .‬برای آدرس دهی به حافظه اصلی‪ ،‬بدین ترتیب‬
‫عمل می کنیم‪:‬‬
‫ابتدا باید مشخص شود که این آدرس‪ ،‬در کدام ناحیه قرار دارد سپس‬
‫مقدار تفاوت آن قسمت را با ابتدای ناحیه محاسبه کرده و آن را به‬
‫عنوان آدرس ‪ Offset‬در نظر می گیریم‪ .‬سپس هر آدرس از حافظه‬
‫را می توان با یک آدرس ‪ Segment‬و ‪ Offset‬مشخص نمود‪.‬‬
‫نکات‪:‬‬
‫• هر یک از آدرسهای‪ Segment‬و‪ Offset‬حدود یک کلمه اند‪.‬‬
‫• آدرس دهی برای یک بایت از حافظه منجصر به فرد نیست و‬
‫بستگی به آدرس ‪ Segment‬دارد‪.‬‬
‫• در هر ‪ Segment‬می توان از ‪ KB 64‬حافظه‪ ،‬استفاده کرد‪.‬‬
‫• در زبان اسمبلی هر یک از عملیاتی که می خواهیم انجام دهیم‬
‫باید در ثباتها انجام شود‪ .‬به عنوان مثال‪ ،‬اگر بخواهیم دو عدد را با‬
‫هم جمع نماییم‪ ،‬عدد اول را به یک ثبات منتقل می کنیم‪ ،‬سپس عدد‬
‫دوم را اضافه می کنیم‪.‬‬
‫ثباتهای ناحیه‬
‫‪1.CS‬‬ ‫‪Code Segment‬‬
‫دستورات برنامه در این قطعه قرار دارند‪.‬‬
‫نکته‪ :‬هر برنامه‪ ،‬لزوما باید یک ‪ CS‬داشته باشند‪ ،‬اما قسمتهای‬
‫دیگر ضرورتی ندارند‪.‬‬
‫‪2. SS‬‬ ‫‪Stack Segment‬‬
‫آدرس های محلهای بازگشت در موقع فراخوانی زیر برنامه ها‪،‬‬
‫در این ناحیه ذخیره می شوند‪.‬‬
‫‪3. DS‬‬ ‫‪Data Segment‬‬
‫اگر برنامه نیاز به تعریف متغییر داشته باشد‪،‬این ناحیه را داریم‪.‬‬
‫‪5. ES‬‬ ‫‪Extra Segment‬‬
‫برای ذخیره اطلعات و دسترسی به حافظه فوقانی مثل ‪Video‬‬
‫‪ Ram‬از این ناحیه استفاده می شود‪.‬‬
‫مثال‪ :‬اگر ‪ ds=7FA2H‬و ‪ offset=438EH‬باشد‪ ،‬مطلوب است‬
‫‪ )B‬محاسبه آدرس منطقی‬ ‫َ‪ )A‬محاسبه آدرس فیزیکی‬
‫‪ )C‬تعیین پایین ترین و بالترین ‪ Rang‬آدرس دهی‬
‫‪Shiftl)ds(= 7FA20‬‬ ‫‪(A‬‬ ‫‪7FA2:438E)H( ( B‬‬
‫‪+ 438E‬‬
‫(‪83DAE)H‬‬
‫ثباتهای شاخص‬
‫در بعضی از دستورالعملهای زبان اسمبلی برای انتقال رشته ها‬
‫و کار با حافظه از ثباتهای شاخص (‪ )di , si‬استفاده می کنیم و‬
‫بسیار حائز اهمیت اند‪.‬‬

‫ثبات ‪)IP )Instruction Points‬‬


‫ای ن ثبات آدرس دس تورالعمل جاری زبان ماشی ن که در حال‬
‫اجرا می باشد را در خود ذخیره می کند‪ .‬با تغییر دادن این ثبات‬
‫می توانیم کاری کنیم که برنامه از هر محل دیگری قابل اجرا‬
‫باشد‪.‬‬
‫ثبات پرچم (‪ 16‬بیتی)‬
‫هر یک از بیتهای این ثبات‪ ،‬در مواقع خاصی مقدار می گیرند‪.‬‬
‫بعنوان مثال‪ ،‬این ثبات دارای بیتی به نام بیت ‪ 0‬می باشد که در‬
‫صورت ‪ 0‬شدن نتیجه محاسبات‪ ،‬مقدار آن بیت‪ ،‬چک می شود‪.‬‬
‫ضمنا دارای بیتی به نام ‪( OverFlow‬سرریز ) می باشد که در‬
‫صورت سرریز شدن محاسبات‪ ،‬مقدار این بیت ‪ 1‬می شود‪.‬‬
‫محتویات این بیتها‪ ،‬توسط زبان ماشین قابل تغییر هستند و توسط‬
‫اکثر دستورات زبان اسمبلی‪ ،‬محتویات این بیتها تغییر می کند‪.‬‬
:‫شکل کلی این ثبات به صورت زیر است‬
1 1 1 12 11 10 9 8 7 6 5 4 3 2 1 0
5 4 3
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=0‬‬ ‫وقفه ها غیر فعال‬ ‫‪IF=1‬‬ ‫وقفه ها فعال‬
‫‪ :Direct Flag‬از این بیت‪ ،‬معمول برای اعمال رشته ای استفاده می‬
‫شود‪ .‬جهت مقایسه یا انتقال رشته ها را نیز مشخص می کند‪.‬‬
‫‪DF=1‬‬ ‫‪Right to Left‬‬ ‫‪DF=0‬‬ ‫‪Left to Right‬‬
‫‪ :Overflow‬در صورتی که عمل محاسباتی دارای سرریز باشد‪،‬‬
‫مقدار این بیت‪ 1 ،‬در غیر این صورت ‪ 0‬خواهد بود‪.‬‬

‫ثبات ‪)SP )Stack Pointer‬‬


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

‫ثبات ‪)BP )Base Pointer‬‬


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

‫نرم افزاری‬ ‫سخت افزاری‬

‫کاربر‬ ‫سیستم‬ ‫خارجی‬ ‫داخلی‬

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

‫وقفه های سخت افزاری‪:‬‬


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

‫دستور ‪:Int‬‬
‫این دستور‪ ،‬برای اجرا کردن یک وقفه استفاده می شود‪ .‬شکل کلی‬
‫این دستور به صورت زیر است‪.‬‬
‫‪Int‬‬ ‫شماره وقفه‬
‫نکته بسیار مهم‪:‬‬
‫قبل از اینکه خواسته باشیم از دستور ‪ Int‬استفاده کنیم بایستی یک‬
‫سری از مقادیر اولیه را به بعضی از ثباتها بدهیم‪ ،‬مخصوصا‬
‫ثبات ‪ ah‬که شماره سرویس وقفه در آن قرار می گیرد‪.‬‬
‫سرویس ها‬
‫‪ 00‬فعال کردن ‪mouse‬‬ ‫‪00‬‬
‫‪ 01‬نشان دادن ‪mouse‬‬ ‫مثال‬ ‫‪01‬‬
‫‪02‬‬ ‫‪33H‬‬ ‫‪02‬‬ ‫وقفه‬
‫‪03‬‬ ‫‪03‬‬
‫…‬ ‫…‬
‫(در صورت نیاز دادن مقادیر اولیه به بعضی از ثباتها)‬ ‫‪ =Ah .1‬شماره سرویس‬
‫شماره وقفه = ‪int‬‬ ‫‪ .2‬استفاده از دستور‬
‫مثال‬
‫برنامه ای بنویسید که نام خانوادگی تان را روی صفحه نمایش نشان‬
‫دهد‪( .‬با ساختار ‪ com.‬در‪ Assembler‬نوشته شود)‬
‫‪.Model Tiny,c,os-dos‬‬
‫‪.286‬‬ ‫نکات‪:‬‬
‫‪.code‬‬
‫‪.startup‬‬ ‫• وقفه ‪ ،21h‬مربوط به صفحه‬
‫‪Jmp l1‬‬ ‫نمایش است‪.‬‬
‫’‪Str1 db “sharifi”,’$‬‬ ‫• آدرس رشته ای که قرار است‬
‫‪L1:‬‬ ‫چاپ شود در‪ dx‬قرار می گیرد‪.‬‬
‫‪mov dx,offset str1‬‬
‫‪mov ah,09h‬‬ ‫• سرویس ‪ 09h‬از وقفه ‪ 21h‬برای‬
‫‪int 21h‬‬ ‫چاپ رشته بکار می رود‪.‬‬
‫‪.exit‬‬
‫‪end‬‬ ‫• بازگشت به ‪( dos‬اگر نباشد‬
‫برنامه پس از اجرا قفل می کند)‪.‬‬
‫برنامه اشکال زدایی ‪Debug‬‬
‫وسیله ای است برای اشکال زدایی برنامه ها و یا ایجاد کردن برنامه‬
‫هایی به زبان ماشین و همچنین‪ ،‬اجرای وقفه ها و تغییر دادن ثباتها‬
‫در کامپیوترهایی با سیستم عامل ‪ Dos‬یا ‪ Windows‬کار می کنند‪.‬‬
‫برای اجرای این برنامه بایستی کلمه ‪ Debug‬را در جلوی اعلن‬
‫سیستم عامل تایپ کنیم‪ .‬در صورتی که بخواهیم فایلی را اشکال‬
‫زدایی نماییم‪ ،‬نام فایل را در جلوی این دستور نیز ذکر می کنیم‪.‬‬
‫‪ Debug‬فقط برای اشکال زدایی فایلهای ‪ exe, .com.‬کاربرد دارد‪.‬‬
‫پس از ورود به ‪ ،Debug‬خط تیره (_) پایین صفحه نشان دهنده‬
‫آمادگی ‪ Debug‬برای دستورات می باشد‪.‬‬
‫دستورات مربوط به ‪Debug‬‬
‫‪ :)R )Register‬با استفاده از این دستود‪ ،‬محتویات ثباتها را به‬
‫همراه ؟ بیتهای ثبات ‪ Flag‬می توان بر روی صفحه نمایش مشاهده‬
‫نمود‪ .‬اما اگر در جلوی این دستور‪ ،‬نام یک ثبات تایپ شود‪ ،‬ضمن‬
‫نشان دادن محتویات آن‪ ،‬امکان دادن مقدار جدید را به ما خوهد داد‪.‬‬
‫‪-R‬‬ ‫مثال ‪1‬‬
‫…… ‪ax = 0000 bx = 0010‬‬
‫…… ‪ds = 4cf2‬‬
‫‪-R cx‬‬ ‫مثال ‪2‬‬
‫مقدار فعلی ‪cx :‬‬
‫‪ :)H )Hex Arithmetic‬در صورتی که دو عدد در مبنای هگزاد‬
‫دس یمال در جلوی دس تور ذک ر کنی م‪ ،‬مجموع و اختلف آنها را‬
‫عدد دوم عدد اول ‪-H‬‬ ‫‪.‬‬ ‫کند‬ ‫می‬ ‫چاپ‬ ‫و‬ ‫محاسبه‬

‫‪-H‬‬ ‫‪5F‬‬ ‫‪2B‬‬


‫کدهای ثبات وضعیت‬

Flag Code when set )=1( Code when reset )=0(


Of )Overflow( OV )Overflow( NV )No Overflow(
Df )Direction( DN )Down( UP )Up(
If )Interrupt( EI )Enable Interrupt( DI )Disable Interrupt(
Sf )Sign( NG )negative( PL )Plus or Positive(
Zf )Zero( ZR )Zero( NZ )Not Zero(
Af )Auxiliary( AC)Auxiliary Carry( NA )Not Auxiliary(
Pf )Parity( PE )Parity Even( PO )Parity Odd(
Cf )Carry( CY )Carry( NC )Not Carry(
‫‪ :)N )Name‬اگر بخواهیم یک فایل اجرایی را در داخل ‪،Debug‬‬
‫اشکال زدایی کنیم و یا فایلی را به وجود آوریم و یا بر روی دیسک‬
‫ذخیره کنیم‪ ،‬توسط این دستور می توانیم نام آن را مشخص کنیم‪.‬‬

‫‪com.‬نام فایل ‪-N‬‬

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

‫دستورات برنامه‬
‫‪-R cx‬‬ ‫نمایش محتویات ثبات ‪ cx‬و امکان‬
‫‪01F2‬‬ ‫تعویض مقدار آن‬
‫‪ g‬تعداد بایت ‪:N‬‬
‫‪-N test.exe‬‬
‫‪-W‬‬
‫‪ :)U )Unassemble‬با استفاده از این دستور‪ ،‬می توانیم لیستی (به‬
‫زبان اسمبلی) از دستورات موجود در حافظه را مشاهده نماییم‪( .‬اگر‬
‫برنامهای در حافظه موجود باشد یعنی قبل ‪ Load‬شده باشد)‪ .‬شکل‬
‫کلی این دستور به صورت زیر است‪:‬‬

‫>‪U <Student address> <End address‬‬


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

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

‫> تعداد دستورات < >‪-T <= Start Address‬‬


‫‪-T =100 5‬‬

‫اجرای دستورات از آدرس ‪ 100‬به تعداد ‪ 5‬دستور‬

‫دستورات زبان اسمبلی‬


‫‪ :Mov‬ازاین دستور‪ ،‬برای انتقال دادن یک مقدار به یک ثبات مورد‬
‫استفاده قرار می گیرد‪.‬‬
‫نکاتی را بایستی برای این دستور در نظر بگیریم‪.‬‬
‫‪Mov x,y‬‬ ‫‪F‬‬ ‫در ‪ mov‬نمی توان ازدو متغییر استفاده کرد‪.‬‬
‫‪Mov bl,F2F‬‬ ‫‪F‬‬ ‫‪ Bl‬یک بایتی‪ ،‬درحالیکه مقدار بیش از‪1‬بایت‪.‬‬
‫‪Mov ds,42F2H‬‬ ‫‪F‬‬ ‫نمی توان مستقیما به ‪ ds‬مقدار داد‪.‬‬
‫‪Mov ax,42F2H‬‬ ‫‪T‬‬ ‫شکل صحیح دستور بالیی‪.‬‬
‫‪Mov ds,ax‬‬
‫‪Mov di,offset area‬‬ ‫آدرس شروع ناحیه ‪ area‬در‪ DI‬قرارمی گیرد‪T .‬‬
‫‪Lea di,area‬‬ ‫آدرس یک ناحیه ازحافظه را دریک ثبات می ریزیم‬
‫’‪Mov al,’A‬‬ ‫‪T‬‬ ‫اگر خواسته باشیم مقداری را به یک ثبات‬
‫‪Mov al,65‬‬ ‫نسبت دهیم‪ ،‬می توانیم نوع آن را نیز مشخص‬
‫‪Mov al, 65decimal‬‬ ‫‪Mov al,01000001B‬‬ ‫کنیم‪.‬‬
‫‪Mov al,41hexdecimal‬‬ ‫کلیه این دستورات‪ ،‬معادلند‪.‬‬
‫وقفه ‪ :19H‬وقفه ای است که توسط آن‪ ،‬سیستم ‪ boot‬می شود‪.‬‬
‫وقفه ‪ :20H‬برای اتمام برنامه و بازگشت به ‪ Dos‬مورد استفاده قرار‬
‫می گیرد‪.‬‬
‫سرویس ‪ 4CH‬از وقفه ‪ :21H‬این سرویس‪ ،‬می تواند اجرای برنامه‬
‫را به پایان برد و باعث بازگشت به ‪ Dos‬می شود‪(.‬وقفه ‪ 20H‬با این‬
‫سرویس‪ ،‬معادل است)‬
C:\asm>Debug
-a 100 ‫تمرین‬
Debug ‫ برنامه ای در‬.1
… : 0100 int 19H
‫بنویس ید ک ه ب ا اجرای این‬
… : 0102 mov ah,4CH ‫ شدن‬Reset ‫ باعث‬،‫برنامه‬
… : 0104 int 21H ‫دستگاه شود؟‬
… : 010b
-R cx
… :6
-N Reset.com
-W
-Q
C:\asm>Dir Reset.com
‫ به مختصات‬،‫برنامه ای بنویسید که یک فایل را تشکیل دهد وقسمتی ازصفحه نمایش‬
)Debug( ‫ سطر بال ببرد؟‬5 ‫ به اندازه‬،‫داده شده را‬
C:\asm>Debug -W 2
1
-a 100 -Q
:0106 int 10H
… : 0100 mov ah,06H
:0108 int 21H
… : 0102 mov cx,aa :010a
… : 0105 mov dx,F65 -R cx
… : 0108 mov al,5 :A
… : 010a int 10H -N Curoor.com
… : 010c -W
-R cx Writing 0000A Byte
:C -@
-N Cls.com c:\asm>
‫‪ .3‬با اس تفاده از دس تورات ‪ Debug‬و اس مبلی برنام ه مربوط به‬
‫وقفه زیر را بنویسید‪:‬‬
‫سرویس ‪ 01H‬از وقفه ‪ ،10H‬اندازه مکان نما را تغییر می دهد‪.‬‬
‫اگر در ‪ ch‬خط شروع و در ‪ cl‬نقطه پایان مکان نما را تغییر دهیم‬
‫و این وقفه را اجرا نمائیم اندازه مکان نما به اندازه فاصله این دو‬
‫خط خواهد شد‪.‬‬
‫‪-N cu.com‬‬ ‫‪:E‬‬
‫‪-a 100‬‬ ‫‪1 -W‬‬ ‫‪2‬‬ ‫‪3‬‬
‫‪:0100 mov ah,01‬‬ ‫‪-N cu1.com‬‬
‫‪Writing 0000A Byte‬‬
‫‪:0102 mov ch,01‬‬ ‫@‪-‬‬ ‫‪-W‬‬
‫‪:0104 mov ch,E)14( :010C int 21H‬‬ ‫@‪-‬‬
‫‪:010a‬‬ ‫‪:010E‬‬
‫‪-R cx‬‬ ‫‪-R cx‬‬
‫‪:A‬‬
‫‪ .5‬برنامه ای بنویسیدکه مکان نما‬ ‫‪ .4‬برنامه ای بنویسیدکه مکان نما‬
‫را درموقعیت ‪ 10,10‬چاپ کند؟‬ ‫را به حالت اول برگرداند؟‬

‫‪-a 100‬‬ ‫‪-a 100‬‬


‫‪… : 0100 mov ah,02H‬‬ ‫‪… : 0100 mov ah,01H‬‬
‫‪… : 0102 mov dh,A‬‬ ‫‪… : 0102 mov ch,c‬‬
‫‪… : 0104 mov dl,A‬‬ ‫‪… : 0104 mov cl,c‬‬
‫‪… : 0106 int 10H‬‬ ‫‪… : 0106 int 10H‬‬
‫‪… : 0108 mov ah,02H‬‬ ‫‪… : 0108 int 20H‬‬
‫‪… : 010A mov dh,41‬‬
‫شبه دستورات‬
‫ی ک برنام ه اس مبلی‪ ،‬در ‪ Macro Assembler‬را م ی توان به‬
‫دستورات و شبه دستورات تقسیم کرد‪ .‬منظور از دستورات‪ ،‬همان‬
‫دستورا زبان اسمبلی می باشد و در موقع ترجمه برنامه‪ ،‬هر کدام‬
‫به یک کد زبان تبدیل می شوند‪.‬‬
‫اما شبه دستورات‪ ،‬برای کمک به برنامه ریز با آدرس های مختلف‬
‫حافظه و خوانا شدن برنامه‪،‬به برنامه اضافه می شوند‪ .‬که در موقع‬
‫ترجم ه برنام ه‪ ،‬ب ه آدرس های مورد نظ ر تبدی ل می شود‪ .‬مثل‪،‬‬
‫برای نام گذاری متغیره ا‪ ،‬شب ه دس توراتی وجود دارد ک ه توسط‬
‫آنها‪ ،‬می توانیم در طول برنامه‪ ،‬متغییرهایی را تعریف کنیم و در‬
‫موقع ترجمه برنامه‪ ،‬هر کجا که متغییری ذکر کرده باشیم‪ ،‬آدرس‬
‫آن جایگزین خواهد شد‪.‬‬
‫شبه دستور تعریف نماد‬
‫کلم ه ‪ EQU‬یا علم ت مس اوی در ‪ Macro Assembler‬توسط‬
‫مقادیر متناظر خود‪ ،‬برای تعریف بکار می رود و در موقع ترجمه‬
‫برنامه‪ ،‬نمادها با مقادیر داده شده‪ ،‬جایگزین می شوند‪.‬‬
‫مقدار ‪ EQU‬نام متغییر‬
‫‪Enter‬‬ ‫‪EQU 13‬‬
‫’‪Eoline EQU ‘$‬‬ ‫تعریف داده و متغییر‬
‫شب ه دس تورات ‪ ، DT,DQ,DD,DW,DB‬برای تعری ف متغییر‬
‫استفاده می شوند‪ .‬شکل کلی تعریف به صورت زیر است‪:‬‬
‫?‬
‫‪DB‬‬ ‫طول متغییر‬ ‫نام متغییر‬ ‫()‪Dup‬‬
‫مقدار‬
.‫هر یک از شبه دستورات گفته شده به صورت زیر بیان می شود‬

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‬بایت با مقدار اولیه متفاوت‪.‬‬
‫? ‪4.F4 db‬‬
‫‪ F4‬متغییری به طول ‪ 1‬بایت که هنوز مقدار نمی گیرد‪.‬‬
‫‪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‬‬
‫آدرس زیربرنامه ‪Call‬‬ ‫‪cs:offset‬‬
‫شبه دستور ‪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‬‬
‫شده‬
‫‪Mov bx,103‬‬
‫]‪Mov al,[bx‬‬ ‫‪al=9f‬‬
‫‪:‬دسترسي غیر مستقیم نسبي نسبت به ثبات پایه ‪5-‬‬
‫در این نوع دسترسي ‪ ،‬آدرس محلي كه محتویات آن مورد نظر‬
‫است ‪ ،‬در ثبات پایه (‪ )BX‬قرار مي گیرد و تفاوت مكان نیز‬
‫به آن اضافه مي شود ‪.‬‬
‫مثال‪:‬‬
‫‪8‬‬ ‫‪1 41 9F 2 3E‬‬
‫‪2‬‬ ‫‪7‬‬ ‫]‪Mov al,[bx+n‬‬
‫‪100 101 102 103‬‬
‫‪104 105‬‬ ‫]‪Mov al,n[bx‬‬
‫‪Mov bx,100‬‬
‫‪Mov al,[bx]+n‬‬
‫]‪Mov al,[bx+4‬‬ ‫‪al=27‬‬
‫‪:‬دسترسي نسبي نسبت به ثبات شاخص ‪6-‬‬
‫در این نوع دسترسي‪،‬محلي از حافظه را بعنوان مبدا در نظر‬
‫گرفته و تفاوت مكان آن را در یكي از ثباتهاي شاخص (‪ si‬یا‬
‫‪ )di‬قرار مي دهیم ‪.‬‬
‫محتویات محل مبدا به اضافه تفاوت مكان مورد نظر است ‪.‬‬
‫مثال‪:‬‬
‫‪‘$‘,“String db “abcdefg‬‬
‫‪Mov si,3‬‬
‫]‪‘Mov al,string[si‬‬ ‫‪al=‘d‬‬
‫‪:‬دسترسي نسبي نسبت به ثبات پایه وشاخص ‪7-‬‬
‫در این نوع دیترسي ‪ ،‬محلي از حافظه بعنوان ئمبدا در نظر‬
‫گرفته مي شود و مجموع آدرس هاي ثبات پایه و شاخص ‪،‬‬
‫‪.‬با آدرس مبدا جمع مي شود‬
‫] ‪ di‬یا ‪Area [bx][si‬‬ ‫‪SI‬‬
‫‪SI‬‬
‫‪SI‬‬ ‫‪SI‬‬
‫‪BX‬‬
‫]‪Area [ bx+si‬‬
‫‪BX‬‬
‫’‪String db “abcdefg”.’$‬‬
‫‪BX‬‬
‫‪Mov si,3‬‬
‫‪BX‬‬
‫‪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‬‬
‫………‬
‫………‬ ‫اگر توابع فرعي داشته باشیم تعريف مي كنیم‬
‫‪Turbo assembler:‬‬ ‫ساختار فایل هاي ‪com.‬‬
‫‪.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‬را آدرس دهي كند‪.‬‬
‫مثال‪:‬‬
‫‪D1‬‬ ‫‪db 32h,7fh,99h,932h‬‬
‫‪D2‬‬ ‫‪dw 67f1h‬‬
‫‪D3‬‬ ‫‪dd 22229999h‬‬
1. Mov ax,wordptr d1
ax=7f23
3. Mov bx,wordptr d1+2
bx=9299
5. Mov al,byteptr d2
D1 db 32h,7fh,99h,932h
al=f1h D2 dw 67f1h
7. Mov ax,wordptr d3 D3 dd 22229999h

ax=9999h
9. Mov ax,wordptr d2
ax=67f1h
11. Mov bx,wordptr d3+2
bx=2222h
‫دستور‪: 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‬را پس از‬
‫انجام دستورات زیر مشخص كنید ‪:‬‬
‫‪Mov al,a3h‬‬ ‫‪1 1‬‬ ‫‪Sf=0‬‬ ‫‪zf=0‬‬
‫‪a 3‬‬ ‫‪Cf=1‬‬ ‫‪of=1‬‬
‫‪Mov bl,8eh‬‬ ‫‪+8 E‬‬
‫‪Add al,bl‬‬ ‫‪al=al+bl‬‬ ‫‪3 1‬‬

‫‪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‬‬

‫‪byte*b‬‬ ‫‪AL‬‬ ‫ثبات يا حافظه‬ ‫‪AX‬‬


‫‪yte‬‬
‫‪word*wor‬‬ ‫‪AX‬‬ ‫ثبات يا حافظه‬ ‫‪DX:AX‬‬
‫‪d‬‬
‫‪Al‬‬
‫‪word*by‬‬ ‫‪=byte‬‬ ‫ثبات يا حافظه‬ ‫‪DX:AX‬‬
‫‪te‬‬ ‫‪Ah=0‬‬
‫مثال‬:
1(Mov al,20h
Mov bl,3fh
Mul bl ax=al*bl

2(X dw 2051h
Mov ax,f201h
Mul x dx:ax
=ax ‫دو بایت كم ارزش‬
=dx ‫دو بایت با ارزش‬
3)Mov ah=00h
Mov al,3bh
Mov bl,ffh
Mul bl dx:ax
=ax ‫دو بايت كم ارزش‬
=dx ‫دو بايت با ارزش‬
‫‪:‬نمونه سوال امتحان‬
‫اگر ‪x‬یك متغییر از حافظه به طول ‪ 1‬بایت و ‪ y‬یك متغییر از‬
‫حافظه به طول ‪ 1word‬باشد رابطه زیر را به زبان اسمبلي‬
‫شبیه سازي كنید ‪.‬‬
‫‪Y=x^3-3x^2+7‬‬
Mov ax , 00h or sub ax,ax
Mov al,x
Mul x ax=x^2
Mov bx,ax
Mul x ax=x^3
Mov y,ax
Mov ax,bx
Mul 3 ax=3x^2
Mov bx,y
Sub bx,ax bx=x^3-3x^2
Add bx,7 bx=x^3-3x^2+7
Mov y,bx y=x^3-3x^2+7
‫‪:‬تمرین‬
‫‪.‬ضرب دو عدد ‪ 4‬بایتي به تفكیك متغییرهاي ‪ 2‬بایتي‬

‫‪A A+1 A+2‬‬


‫‪A+3‬‬
‫‪A‬‬
‫*‬
‫‪B B+1 B+2‬‬
‫‪B+3‬‬
‫‪B‬‬
‫*‬
‫‪C+1 C+2 C+3 C+4‬‬
‫‪C+5‬‬
‫‪C‬‬ ‫‪C +AL +AL +AL‬‬
.model tiny,c,os_dos Mov byte ptr c,al
.286 Mov byte ptr c+1,ah
.code Sum ah,ah
.startup Mov al,byte ptr a+1
Jmp l1 Mul byte ptr b+1
a dd 1234567 Add byte ptr c+1,al
b dd 1234567 Mov byte ptr c+2,ah
c db 6 dup)0( Sub ah,ah
L1: Mov al,byte ptr a+2
sub ah,ah Mul byte ptr b+2
Mov ah, byte ptr a Add byte ptr c+2,al
mul byte ptr b Mov 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‬بر حسب طول متغییر ‪،‬بصورت‬
‫زیر است‪:‬‬

‫مقدار دهي اوليه‬


‫نوع متغییر‬ ‫‪AX,DX‬‬ ‫عملوند‬ ‫خارج قسمت‬ ‫باقي مانده‬
‫‪Byte/Byte Al=byte,ah‬‬ ‫ثبات يا حافظه‬ ‫‪AL‬‬ ‫‪AH‬‬
‫‪=0‬‬ ‫‪AX‬‬ ‫‪DX‬‬
‫‪Word/Wor‬‬ ‫ثبات يا حافظه‬
‫‪d‬‬ ‫‪Ax=word,d‬‬ ‫‪AL‬‬ ‫‪AH‬‬
‫ثبات يا حافظه‬
‫‪x=0‬‬
‫‪Word/Byte‬‬ ‫‪AX‬‬ ‫‪DX‬‬
‫ثبات يا حافظه‬
‫‪Ax=word‬‬
‫‪Doublewor‬‬
‫‪d/‬‬ ‫‪Dx:ax=dw‬‬
‫‪Word‬‬
‫تغییر بیتهاي ثبات وضعیت در این دستور مانند ‪ mul‬است‪.‬‬
‫‪:‬مثال‬
‫‪X db 136‬‬
‫‪Y db 17‬‬
‫? ‪R db‬‬
‫? ‪Q db‬‬
‫‪x/y =? Byte‬‬

‫باقیمانده=‪R‬‬
‫خارج قسمت=‪Q‬‬
‫جواب‬:
Mov al,x
Mov ah,0
Div y
Mov r,ah
Mov 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 ax=(5/9)*(f-
32)
Mov c,ax c=(5/9)*(f-
32)
‫دستور ‪:inc‬‬
‫یك واحد به متغییر كه ممكن است ثبات باشد یا حافظه اضافه‬
‫مي كند ‪ .‬شكل كلي این دستور بصورت زیر است‪:‬‬
‫‪Inc mem/reg‬‬
‫دستور ‪:dec‬‬
‫یك واحد از متغییر كه ممكن است ثبات یا حافظه باشد كم مي‬
‫كند ‪ .‬شكا كاي این دستور بصورت زیر است‪:‬‬
‫‪Dec mem/reg‬‬
‫مثال‪:‬‬
‫‪X db 10‬‬
‫‪Inc x‬‬ ‫‪x=11‬‬
‫نكته‪:‬‬
‫بیتهاي زیر از ثبات وضعیت با انجام دستورات ‪ 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‬‬
‫‪Mov cx,n‬‬
‫‪Lable:‬‬
‫‪……….‬‬
‫‪……….‬‬ ‫مجموعه اي از دستورات كه مي خواهیم‬
‫‪ n‬با ر تكرار شوند‪.‬‬

‫‪……….‬‬

‫‪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 JG JC CARRY
JA FLAG=1
OP1>=OP2 JGE JNC
JAE CARRYFLAG=0
OP1=OP2 JE JS
JE SIGNFLAG=1
OP1<>OP2 JNE JNS
JNE SIGNFLAG=0
OP1<OP2 JL JZ
JB ZEROFLAG=1
OP1<=OP2 JLE JNZ
JBE ZEROFLAG=0
A=ABOVE G=GREATER JP
PARITYFLAG=1
B=BELOW L=LESS JNP
‫شبیه‬‫اسمبلي‬‫زبان‬‫به‬‫زيررا‬‫پاسكال‬‫دستورات‬‫معادل‬
‫كنید‬‫سازي‬

Sum=0 Mov ax,0


Mov cx,100
Count=100 While1 :
While (sum < 500) or Cmp ax,5000
(count > 0) Jb l1
Cmp cx,0
sum = sum + count Jle exit
count = count – 1 L1 :
Add ax,cx
end while Dec cx
Jmp while1
Exit :
Mov si,0
Mov ax,0
i=0 While1: cmp ax,100
Sum=0 jae exit
mov si,1
While )sum<100( For1: cmp si,10
{ ja if1
add ax,si
for i=1 to 10 inc si
sum=sum+I jmp for1
if sum=50 then s1; If1: cmp ax,50
jae else1
else s2; 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‬‬
‫‪) ? Len‬طول رشته ي‬ ‫‪DB‬‬
‫‪ 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‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬

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

SAR AL,1 1 1 0 0 0 1 1 1

CF= 0

0 0 1 0 0 1 1 0

SAL AL,1
0 1 0 0 1 1 0 0

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

‫‪ROR AL,1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬

‫‪CF= 1‬‬

‫مثال‪:‬‬
‫برنامه اي بنويسید كه يك كاراكتراز صفحه كلید دريافت كند وآن‬
‫را به صورت مبناي دو نشان دهد ‪.‬‬
‫‪:‬تمرين‬
‫اطلعات مربوط به ‪ 15‬كارمند در‪ 15‬كلمه ي متوالي قرار‬
‫دارد )براي هر كارمند يك كلمه وهركلمه ‪ 16‬بیت است(‬
‫اولین بیت سمت راست كدجنسیت كارمند مي باشد براي‬
‫مرد يك وبراي زن صفراست قسمت برنامه اي بنويسید كه‬
‫تعداد كارمندان مرد را مشخص كند ‪.‬‬
‫‪M DB 0‬‬ ‫‪JNC L2‬‬
‫‪AREA DW 2048H ,…, 3000AH‬‬ ‫‪INC M‬‬
‫‪:‬‬ ‫‪L2:‬‬
‫‪MOV SI , 0‬‬ ‫‪ADD SI , 2‬‬
‫‪MOV CX , 15‬‬ ‫‪LOOP L1‬‬
‫‪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 Xor And Test Or Not


x,y x,y x,y x,y x
0 0 0 0 0 0 1

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‬‬
‫‪21H‬‬ ‫ثبات هاي كنترلي وقفه‬
‫‪40 – 42‬‬ ‫شمارنده و ‪Timer‬‬
‫‪60‬‬ ‫ورودي از صفحه كلید‬
‫‪201‬‬ ‫كنترلي بازي‬
‫– ‪3B0‬‬ ‫تطبیق دهنده‬
‫‪3BF‬‬
‫‪61‬‬ ‫بلندگو )بیت ‪ 0‬و‪(1‬‬
‫– ‪3D0‬‬ ‫صفحه نمايش تك رنگ و پورت موازي چاپگر‬
‫–‪3DF‬‬
‫‪3F0‬‬ ‫كنترلي ‪disk‬‬
‫‪3FD‬‬
‫دستور ‪ : IN‬اين دستوريك يا دوبايت را از ورودي خوانده و‬
‫آن را درثبات ‪ AX‬ويا ‪ AL‬قرار مي دهد ‪.‬‬
‫شكل كلي اين دستوربه صورت زير است ‪:‬‬
‫‪IN AL,Portnumber‬‬
‫‪IN AX,Portnumber‬‬
‫دستور ‪ :OUT‬ازاين دستوربراي فرستادن يك بايت يايك كلمه‬
‫از ثبات ‪ AX‬يا ‪ AL‬به پورت موردنظر استفاده مي شود ‪.‬‬
‫شكل كلي اين دستوربه صورت زير است ‪:‬‬
‫‪OUT Portnumber,AL‬‬
‫‪OUT Portnumber,AX‬‬
‫‪:‬مثال‬
‫بااستفاده از دسترسي به آدرس پورتها قسمت برنامه اي بنويسید‬
‫كه درصورت اجرا بااستفاده از پورت ‪ 61H‬تولید‬
‫‪START : MOV DX , 1000‬‬ ‫صدانمايد‪.‬‬
‫‪TOP :‬‬ ‫‪IN AL , 61H‬‬
‫‪AND AL , 0FEH‬‬
‫‪XOR AL , 02H‬‬
‫‪OUT 61H , AL‬‬
‫‪MOV CX , 1000‬‬
‫‪DELAY : LOOP DELAY‬‬
‫‪DEC DX‬‬
‫‪CMP DX ,‬‬
‫‪JNE TOP‬‬
‫تمرين ‪: 1‬‬
‫با استفاده از دسترسي به آدرس پورتها برنامه اي بنويسید كه‬
‫در صورت اجرا مشخص نمايد چاپگر آماده است يا خیر ؟‬
‫ بااستفاده از دسترسي به آدرس پورتها برنامه اي‬:2 ‫تمرين‬
. ‫ صفحه كلید بخواند‬Buffer ‫بنويسید كه يك كاراكتررا از‬
START : JE LTHREE
IN AX , 305H MOV AX , BX
MASK1 DB 0000000000001111
MOV BX , AX AND AX , MASK4
MASK2 DB 0000000011110000
AND AX , MASK1 CMP AX , MASK4
MASK3 DB 0000111100000000
CMP AX , MASK1 JE LFOUR
MASK4 DB 1111000000000000
JE LONE EXIT :
MASK_OUT1 DB 10000001
MOV AX , BX
MASK_OUT2 DB 01000010
AND AX , MASK2
MASK_OUT3 DB 00100100
CMP AX , MASK2
MASK_OUT4 DB 00011000
JE LTWO
MOV AX , BX
AND AX , MASK3
CMP AX , MASK3
LONE : LTWO :
MOV AL , MASK_OUT4 MOV AL , MASK_OUT3
OUT 307H , AL OUT 307H , AL
JMP EXIT JMP EXIT

LTHREE : LONE :
MOV AL , MASK_OUT2 MOV AL , MASK_OUT1
OUT 307H , AL OUT 307H , AL
JMP EXIT JMP EXIT
‫دستورات ‪ PUSH‬و ‪: POP‬‬
‫وقتي كه يك زيربرنامه را فراخواني مي كنیم درمواقع اجراي‬
‫زيربرنامه بهتراست كه درابتدا محتويات ثبات ها را به حالت‬
‫اول خودبرگرداند اين كاربدين منظورانجام مي شود كه ثباتها‬
‫بخصوص ثباتهاي عمومي درتمام زيربرنامه ها استفاده مي‬
‫‪.‬شوند‬
‫تغییردادن مقدار آنهادرطول زيربرنامه ممكن است اختللتي‬
‫‪.‬در برنامه ايجاد كند‬
‫دستور ‪ PUSH‬مي تواند مقدار يك ثبات يا محلي از حافظه‬
‫رادر محلي بنام ‪ STACK‬ذخیره نمايد ‪ .‬دراين محل هريك‬
‫از اطلعات جديد روي اطلعات قبلي قرار مي گیرد ‪.‬‬
‫بنابراين براي بازيابي اطلعات بايد آنهارا برعكس زمان‬
‫‪.‬ذخیره كردن بازيابي نمود‬
‫دستور ‪ POP‬براي بازيابي كردن مقداري از ‪Stack‬‬
‫وقرار دادن دريك ثبات يا متغیرحافظه استفاده مي شود ‪.‬‬
‫شكل كلي اين دستور بصورت زير است ‪:‬‬
‫‪PUSH mem/reg‬‬
‫‪POP‬‬ ‫‪mem/reg‬‬
‫سؤال ‪ :‬دستورات زير معادل كدام دستوردر اسمبلي است ؟‬
‫‪PUSH AX‬‬
‫‪PUSH BX‬‬
‫‪XCHG AX ,‬‬
‫‪POP‬‬ ‫‪AX‬‬ ‫‪BX‬‬
‫‪POP‬‬ ‫‪BX‬‬
‫دستورات زير چه كاري انجام مي دهند ؟‬
MOV AX , 30F2H
MOV BX , 1200H
MOV CX , 3022H
SP 1230 22
PUSH AX
SP 1231 30
PUSH BX
SP 1232 00
PUSH CX SP 1233 12
. SP 1234 F2
.
SP 1235 30

POP CX
12 36
POP BX
POP AX
‫مثال ‪ :‬قسمت برنامه اي بنويسید كه دربرنامه ي اصلي مقدار‬
‫‪ah‬و ‪ bh‬بعنوان پارامتر به يك پشته ارسال شوند وسپس‬
‫در زيربرنامه مقداري از‪ Stack‬خوانده شود ‪.‬‬
‫‪AL DW 203FH‬‬
‫‪BL DW 3566H‬‬
‫‪START:‬‬
‫‪PUSH AL‬‬ ‫‪IP‬‬ ‫‪BP = SP‬‬
‫‪PUSH BL‬‬
‫‪CALL P1‬‬
‫‪60‬‬
‫‪:‬‬ ‫‪BP + 2‬‬
‫‪END‬‬ ‫‪35‬‬
‫‪P1 PROC NEAR‬‬ ‫‪3F‬‬
‫‪MOV BP , SP‬‬ ‫‪BP + 4‬‬
‫‪20‬‬
‫]‪MOV BX , [BP+2‬‬
‫]‪MOV AX , [BP , 4‬‬
‫‪START‬‬
‫‪:‬‬
‫‪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 MOV AL , 80 MOV AH , 1HH
.CODE MUL BL MOV AL , ‘A’
.STARTUP ADD AL , BH MOV BL , 20
JMP H ADC AH , 0 MOV BH , 10
PUTCH PROC NEAR SHL AX , 1 CALL PUTCH
PUSH ES MOV BX , AX .EXIT0
PUSH AX MOV AX , CX END
PUSH BX MOV ES : [BX] , AX
PUSH CX POP DX
MOV CX , 0B800H POP CX
MOV ES , CX POP BX
DEC BL POP AX
DEC BH POP ES
MOV CX , AX RET PUTCH ENDP
‫تمرين ‪: 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 L:
Call putch putchm 2,2,’A’,1fH
pop bx
pop ax putchm 10,10,’B’,4fH
ENDM .Exit0
.code End
. Startup
jmp L
putch proc near

putch endp
‫دستورات رشته ای‪:‬‬
‫برای انجام دستورات رشته ای بایستی قبل از هر چیز وضعیت بیت‬
‫‪ )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 I J

SI DI

A B C D E F B C D E

”result string:”ABCDEFBCDE
:‫مثال‬
‫ کپی کند؟‬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‬پر کند؟‬

‫(?) ‪Str1 db 10 dup‬‬


‫‪mov cx,5‬‬
‫‪CLD‬‬
‫‪Lea di,str1‬‬
‫‪mov ax,2020H‬‬ ‫کد کاراکتر ‪Space‬‬

‫‪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 L2
Jne L1
mov bh,1
:L1
mov cx,5
lea si,S2
lea di,S3
Repe cmpsb
je L2
mov bh,2
‫دستورات ‪: 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‬جایگزین کند؟‬

‫”‪Str db “ABC*EF‬‬ ‫‪L1:‬‬


‫‪mov cx,6‬‬
‫‪CLD‬‬
‫‪Lea di,str‬‬
‫’*’‪mov al,‬‬
‫‪Repne scasb‬‬
‫‪Jne L1‬‬
‫‪mov byteptr [di+1],20H‬‬
‫مثال‪:‬‬
‫قسمت برنامه ای بنویسید که در یک رشت ه بن ام ‪ str‬به طول ‪20‬‬
‫بایت کاراکتر ’*‘ را جستجو کند‪ .‬به طوری که تمام کاراکترهای‬
‫’*‘ موجود در رشته را با ‪ Space‬جایگزین کند؟‬
‫(?)‪Str db 20 dup‬‬ ‫‪:Repeat‬‬
‫‪Mov cx,20‬‬ ‫‪Repne scasb‬‬
‫‪CLD‬‬ ‫‪jne L1‬‬
‫‪mov di,offset str‬‬
‫’*’‪mov al,‬‬ ‫‪mov byteptr [di+1],20H‬‬
‫‪Loop Repeat‬‬
‫‪:L1‬‬
‫برنامه های مقیم در حافظه‪:‬‬
‫یکی از کاربردهای زبان اسمبلی مقیم کردن برنامه های اجرای ی در‬
‫حافظه می باشد‪.‬‬
‫مقیم کردن یک برنامه یعنی این که‪ :‬آن را در حافظه اص لی طوری‬
‫قرار دهیم که در زمان های خاصی و در شرای ط خاص به طور‬
‫خودک ار اج را شود‪ .‬در حالی که به طور همزمان بت وانیم در‬
‫کامپیوتر برنامه های دیگری را اجرا نماییم‪.‬‬
‫همانطور که در مورد وقفه ‪ 5‬توضیح داده شد وقفه های نرم افزاری‬
‫برنامه های مقیم در حافظه هس تند که در شرای ط خاص اج را‬
‫می شوند‪.‬‬
‫برای مقی م کردن برنامه های دیگر نیز از ساخت اری مانند ساخت ار‬
‫وقفه ها می توان استفاده کرد‪.‬‬
‫برنامه های مربوط به وقفه ها در قسمت های مختلف حافظه پراکن ده‬
‫هستند‪ .‬وقتی که شرایط ب رای اج رای یک وقفه فراهم می ش ود‬
‫سیستم عامل آدرس برنامه وقفه را از ابتدای حافظه پیدا م ی کند و‬
‫سپس به آدرس آن مراجعه کرده برنامه وقفه را اجرا می کند‪.‬‬
‫آدرس برنامه های وقفه در ابتدای حاف ظه قرار گرفت ه اند و هر ‪4‬‬
‫بای ت از این قسم ت ‪ ,‬آدرس ناحیه و تف اوت م کان و آدرس‬
‫‪ Segment‬و ‪ Offset‬مربوط به یکی از وقفه ها را در بردارد‪.‬‬
‫یعنی از بایت صف رم تا بای ت سوم آدرس وقف ه صفر را تشکی ل‬
‫می دهد‪ .‬از بایت چهارم تا بایت هفتم آدرس وقفه یک و به هم ین‬
‫ترتیب آدرس بقیه وقفه ها در بایتهای بعدی قرار دارند‪.‬‬
‫‪0‬‬ ‫‪1 2 3‬‬ ‫‪4‬‬ ‫‪5 6‬‬ ‫‪7 8‬‬ ‫‪9 10‬‬ ‫‪11 ... 255 254 253 252‬‬

‫وقفه یک‬ ‫وقفه ‪255‬‬

‫وقفه صفر‬
‫وقفه دو‬
:‫مثال‬
‫ را‬5 ‫ وقفه شماره‬int ‫برنامه ای بنویسید که بدون استفاده از دستور‬
) ‫ است‬print screen ‫ مربوط به کلید‬5 ‫اجرا کند؟ ( وقفه شماره‬

.model tiny,c,os_dos mov ES,bx


.286 mov bx,4*5
.code [mov ax,ES:[bx
.startup mov dword ptr oldint,ax
Oldint dd ? [mov ax, ES:[bx+2
Start: mov dword ptr oldint+2,ax
mov bx,0 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. mov es:[0],1F2AH
286. Pop es
code. STI
startup. Iret
Newint endp
? Oldint dd
:Com
Newint proc
mov ax,3508H
CLI int 21H
push cs mov wordptr oldin,bx
[call ds:[oldint mov wordptr oldint[2],es
push es mov dx,offset newint
push 0B800H
pop es
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‬‬
‫این سرویس به منظور گزارش گیری از وضعی ت صف حه کلی د‬
‫استفاده می شود‪.‬‬

‫‪AH=02H‬‬ ‫خروجی‬ ‫‪AL 7 6 5 4 3 2 1 0‬‬


‫‪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 cmp al,x jmp while
mov di,9 jne L1
:Exit
:While mov I,bl
cmp si,di jmp exit
jae exit :L1
mov ax,si cmp al,x
add ax,di ja L2
shr ax,1 mov di,bx-1
mov bh,0 jmp while
mov bl,al :L2
[mov al,area[bx mov si,bx+1
‫مثال‪:‬‬
‫برنامه ای بن ویسی د که ‪ 10‬بایت اطلعات را از پ ورت ‪3F7H‬‬
‫بخواند‪ .‬سپ س میان گین اعداد دریافتی را در محلی از حافظه به‬
‫نام ‪ avg‬قرار دهد؟‬
Avg db ? adc bl,al [cmp al,area[di
Ten db 10 loop start je L4
mov cx,10 mov ax,bx :L4
mov bx,0 Div ten
Start: inc si
mov avg,al
in al,3F7H dec di
mov si,0
jmp L3
mov di,7
:L3 :Exit
cmp si,di
jae exit
[mov al,area[si
‫مثال‪:‬‬
‫یک روال به زبان اسمبلی بنویسید که ت شخیص دهد‪ 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

Vous aimerez peut-être aussi