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