210 likes | 427 Views
زبان های ماشین و برنامه سازی سیستم. زیرروال ها و ماکروها. مهدی ایل بیگی دانشگاه آزاد اسلامی دماوند. زیرروال (Subroutine). فرم کلی و نحوه فراخوانی زیر روال ها، بصورت زیر است. MAIN :---------- ---------- ---------- ---------- ---------- ---------- CALL PROCNAME ----------
E N D
زبان های ماشین و برنامه سازی سیستم • زیرروال ها و ماکروها مهدی ایل بیگی دانشگاه آزاد اسلامی دماوند
زیرروال (Subroutine) • فرم کلی و نحوه فراخوانی زیر روال ها، بصورت زیر است. MAIN :---------- ---------- ---------- ---------- ---------- ---------- CALL PROCNAME ---------- ---------- ---------- ---------- PROCNAME PROC ---------- ---------- ---------- ---------- ---------- ---------- RET PROCNAME ENDP
مکان قرارگیری زیر روال ها در برنامه Codesg segment ‘code’ Assume ss:stacksg,ds:datasg , cs:codesg Main proc far Movax,datasg Movds,ax ;----------------------------------------- ;------------------------------------------ Mov ax,4c00h Int 21h Main endp ;-------------------------------------------- ;-------------------------------------------- Codesg ends End main MAIN PROGRAM (CALL PROCEDURS) PROCEDURE DECLARATION
مثال (مکان نوشتن دو زیر روال) Codesg segment ‘code’ Assume ss:stacksg,ds:datasg , cs:codesg Main proc far Movax,datasg Movds,ax ;----------------------------------------- CALL START CALL SEARCH ;------------------------------------------ Mov ax,4c00h Int 21h Main endp ;-------------------------------------------- START PROC NEAR ;************** ;************** RET START ENDP ;-------------------------------------------- SEARCH PROC NEAR ;************** ;************** RET SEARCH ENDP ;-------------------------------------------- Codesg ends End main
روش انتقال مقادیر به روال • سه روش برا ی انتقال مقادیر به روال و بر عکس وجود دارد: • قرار دادن مقدار مورد نظر در یک ثبات. • استفاده از پشته: که در این حالت مقادیر ارسالی را با استفاده از دستور PUSH به پشته فرستاده و در داخل روال با دستور POP آنرا فراخوانی می کنیم. • استفاده از سگمنت داده ای: در این حالت آدرس خاصی از سگمنت را برای انتقال پارامترها در نظر می گیریم و در داخل روال نیز داده ها را از آدرس فوق بازیابی می کنیم. (نکته: این کار به معنای ارسال پارامتر به زیرروال نمی باشد)
زیرروال های بازگشتی • یک برنامه recursive (بازگشتی) برنامه ای است که خود را فراخوانی می کند. • پیاده سازی یک برنامه خودفراخوان یا بازگشت پذیر در اسمبلی به راحتی نوشتن هر برنامه دیگر است. فقط لازم است که در بدنه زیرروال، خود زیرروال با دستور CALL فراخوانی شود. • تنها خطر برنامه های خود فراخوان سرریز پشته است زیرا در هر فراخوانی یکبار مقدار PC در پشته ذخیره می گردد.
Codesg segment ‘code’ • Assume ss:stacksg,ds:datasg , cs:codesg • Main proc far • Movax,datasg • Movds,ax • MOV AL,X • CALL MASK1 • MOV X,AL • MOV AL,Y • CALL MASK2 • MOV Y,AL • MOV AL,X • ADD AL,Y • MOV Z,AL • Mov ax,4c00h • Int 21h • Main endp • ;------------------------------------------ • MASK1 PROC • AND AL,0FH • RET • MASK1 ENDP • MASK2 PROC • AND AL,0F0H • RET • MASK2 ENDP • Codesg ends • End main مثال برای نوشتن زیرروال
دستورات پشته • دستورالعمل Push براي ذخيره کردن دادههاي روي پشته می باشد. • فرم کلی دستور Push: • عملوند Source ميتواند هر ثباتي بجز ثبات پرچم ها (فلگ) و ثبات اشارهگر دستورالعمل ها يعني IP، باشد و همچنین ميتواند کلمهاي در حافظه اصلي را ارجاع دهد. Source نمی تواند يک عملوند بلاواسطه (عدد ثابت) باشد. Source باید ازنوع Word باشد. • دستورالعمل Pop براي بازيابي دادهها از پشته می باشد. • فرم کلی دستور Pop: • destination ميتواندکلمهاي در حافظه اصلي را ارجاع داده و يا ميتواند هر ثباتي بجز ثبات پرچمها و ثبات اشارهگر دستور العمل ها (IP) و ثبات سگمنت کد (CS) باشد. مقصد باید ازنوع Word باشد. PUSH SOURCE POP Destination
دستور PUSH و POP • این دستورات رجیستر پرچم را تغییر نمی دهند. • مثال برای دستور PUSH : PUSH AX ; Y DW ? PUSHY ; • مثال برای دستور POP: POP BX ; Y DW ? POPY ; • ذخیره سازی رجیستر AX بر روی پشته • ذخیره سازی متغییر Y بر روی پشته • قرار دادن عنصر بالای پشته درون رجیستر BX • قرار دادن عنصر بالای پشته درون متغییر Y
دستورالعمل های PUSHF , POPF, PUSHA, POPA • دستورالعمل PUSHF محتوی ثبات فلگ را روی پشته ذخیره می نماید و دستورالعمل POPF عنصر روی پشته را خارج نموده در ثبات فلگ کپی می نماید. • با استفاده از دستورالعمل POPF می توان هر مقدار دلخواهی را داخل ثبات فلگ قرار دارد. • دستورالعمل PUSHF روی فلگ ها اثر ندارد ولی دستورالعمل POPF روی فلگ ها اثر دارد. این دو دستورالعمل فاقد عملوند می باشند. • دستور PUSHA تمامی رجیسترهای AX, CX, DX, BX, SP, BP, SI, DI را در پشته ذخیره می نماید. • دستور POPA تمامی رجیسترهای AX, CX, DX, BX, SP, BP, SI, DI را از پشته بازیابی می نماید. (نکته: اشاره گر پشته SP از پشته POP می شود ولی در رجیستر SP ذخیره نمی گردد.)
Macro • تعریف یک ماکرو در بین دستورات ENDM, MACRO قرار داده می شوند. شکل تعریف یک ماکرو بصورت زیر می باشد: Macro_Name MACRO Parameters instruction instruction body ……. instruction ENDM
نکاتی در باره Macro • پارامتر ها در MACRO، نمادهای معمولی هستند که بوسیله علامت کاما (،) از یکدیگر جدا می شوند. • دستورالعمل های اسمبلی در تعریف یک ماکرو می توانند از پارامترهای آن، ثبات ها، عملوندهای بلاواسطه یا نمادهای تعریف شده در بیرون ماکروی مزبور، استفاده کنند. • ماکروها باید در ابتدای آورده شوند. • با هر بار فراخوانی ماکروها، تمامی کد داخلی ماکرو در محل فراخوانی ماکرو، کپی می شود. • توضیحات (Comments) ماکروها نیز در برنامه تکرار می شوند برای عدم تکرار توضیحات باید ابتدای آن ها (;;) را قرار دهیم.
مثال (1): ماکرویی که منتظر وارد کردن یک کرکتر می ماند PauseMACROwait_msg ; prompt user and wait for key to be pressed movdx, OFFSET wait_msg; ; “press any key ….” mov ah, 9 ; ; display string function int 21h ; ; call DOS mov ah, 1 ; ; input character function int 21h ; ; call DOS ENDM
مثال (2): چاپ یک پیکسل در مکان (x, y) Putpixel MACRO x, y, color mov ah,0ch moval,color movcx, x movdx, y int 10h endm
مثال (3): ماکروی جمع سه عدد Add3 MACRO num1, num2, num3 ; ; put sum of Three word_size parameters in AX mov ax, num1 ; ; first number add ax, num2 ; ; second number add ax, num3 ; ; Third number ENDM
دستور Local • یک برچسب نمی تواند بیش از یکبار در یک برنامه ظاهر شود. زیرا برای پرش به برچسب ها باید مشخص باشد که به کدام برچسب پرش صورت بگیرد. در واقع با داشتن چند برچسب مشابه، مشخص نیست باید به کدام برچسب پرش صورت گیرد. • بدلیل اینکه دستورات بدنه ماکروها دقیقا در کد اصلی برنامه جایگذاری می شوند، پس در صورتی که هر کدام از برچسب های درون ماکرو با برچسب های برنامه اصلی همنام باشند، دچار مشکل ارجاع خواهیم شد. البته زمانی که یک ماکرو را چندین بار در برنامه اصلی فراخوانی نماییم، باز هم این مشکل ایجاد می شود. • برای حل این مشکل با استفاده از دستور LOCAL هر برچسبی را که در ماکرو استفاده می نماییم بعنوان یک برچسب محلی معرفی می نماییم. حال هر زمان که ماکرو در برنامه اصلی فراخوانی شود، بجای برچسب های آن یک برچسب یکتا قرار خواهد گرفت. • دستور LOCAL بلافاصله پس از MACRO قرار می گیرد و نام برچسب ها بوسیله کاما (,) از هم جدا می شوند.
مثال: یافتن مینیمم دو عدد صحیح • ماکروی Min2، مینیمم دو عدد صحیح را پیدا نموده و نتیجه را در AX قرار می دهد. Min2 MACRO first, second LOCAL cmp_label, end_if ; ; put smaller of two words in the AX register mov ax, first ; ; first value cmp_label: cmp ax, second ; ; Compare first and second values jleend_if; ; exit if so mov ax, second ; ; otherwise load second value end_if: ENDM
ساخت کتابخانه (Library) • می توان ماکروهایی پرکاربرد را در یک فایل جداگانه با پسوند ASM یا LIB، نوشت و این فایل را به عنوان یک فایل کتابخانه ای در برنامه های متعدد استفاده نمود. • برای فراخوانی یک فایل کتابخانه ای از شبه دستور INCLUDE به فرمت زیر استفاده می نماییم: • نکته: شبه دستور INCLUDE در ابتدای برنامه و قبل از همه دستورات آورده می شود. می توان چندین فایل کتابخانه ای را به هیمین ترتیب در برنامه استفاده نمود. INCLUDE FILENAME.ASM
;This MACRO set cursor at location ROW,COLUMN CURSOR MACRO ROW,COLUMN MOV AH,02 ;;Set cursor function MOV BH,0 ;;Page 0 MOV DH,ROW ;;DH=ROW position MOV DL,COLUMN ;;DL=COLUMN position INT 10H;;Invoke interrupt ENDM ;;End of MACRO ; --------------------- ;This MACRO display STRING on mointor DISPL1 MACRO STRING MOV AH,09 ;;Set string function LEA DX,STRING ;;DX=STRING INT 21H ;;Invoke interrupt ENDM ;;End of MACRO ; --------------------- ;This MACRO clear monitor CLE_SC MACRO MOV AX, 0700H;;Set clear function MOV BH, 199;;Red on black MOV CX, 0;;CX=Up left corner MOV DX, 184FH;;DX=Down right corner INT 10H ;;Invoke interrupt ENDM ;;End of MACRO ; --------------------- مثال:فایل کتابخانه ای با سه ماکرو
INCLUDE mymacro.asm ;----------------------------------------------- .MODEL SMALL .STACK 64 ;Define stack .DATA ;Define data segment MSG1 DB 'test of include in MACRO','$‘ X DB 10 Y DB 50 ;----------------------------------------------- .CODE ;Define code segment MAIN PROC FAR MOV AX,@data ;1- Set data segment MOV DS,AX ;2- address CLE_SC ;3-Using MACRO CLE_SC CURSOR X, Y ;4-Using MACRO CURSOR DISPL1 MSG1 ;5-Using MACRO DISPL1 MOV AX,4C00H ;5- End of INT 21H ;6- processing MAIN ENDP ; End of procedure END MAIN ; End of program نحوهاستفاده از فایل کتابخانه ای