saalek110
Well-Known Member
ادامه صفحه چهار:
ماكرو ها:
Macros
سينتكس هاي زير براي توربو اسمبلر مناسب است.
ماكرو شبيه زيربرنامه مقداري كد است ولي يك فرق مهم دارد با آن.
فرقش اينه كه موقع كامپايل يك نسخه از زيربرنامه در ميان كدها وجود دارد و هر قسمت از برنامه كه بهش نياز داشته باشه كنترل را روي زير برنامه مي اندازد تا كدهاي زيربرنامه اجرا شود و بعد كنترل به برنامه صدا زننده برمي گردد ولي در مورد ماكرو اصل مطلب اين است كه هر جا كه ما ماكرو را صدا مي زنيم موقع كامپايل يك نسخه از ماكرو كدهايش آنجا نوشته ميشه.
سينتكس :
يك ماكروي مفيد:
و عكس آن:
گفتيم كه خوبه كه مواقعي كه نياز است همه رجيسترها را براي حفظ آنها push و بعد انجام كارمان pop كنيم. با صدا زدن ماكروهاي بالا اين كار خيلي ساده انجام ميشه.
طرز صدا كردن دو ماكروي بالا را در زير مي بينيم:
ماكرو دو مشكل مي تواند ايجاد كند. يكي اين كه چون مدام يك نسخه ازش به برنامه داره اضافه ميشه بايد حواسمان به حجم برنامه باشه و ديگه اين كه ليبل ها اگر به كار روند داراي ليبل هاي هم نام مي شويم. پس براي حل آن از دستور local استفاده مي كنيم.
سينتكس:
كه name عبارت است از نام متغير يا ليبل لوكال(منطقه اي) ما.
يك ماكرو براي مثال در زير آورده مي شود. اين ماكرو به راحتي يك پيام چاپ مي كند.
ماكرو همچنين مي تواند پارامتر بگيرد.
مثال:
براي استفاده از اين ماكرو بايد مثالي پيدا كرد كه بعدا اين كار را مي كنيم.
صفحه چهار هم تمام شد. البته نياز به تمرينات و توضيحات بيشتري داشت اين صفحه ولي براي اينكه سريع اين سايت تمام بشه وقت نشد اين كار را بكنيم. بعدا از منابع ديگر تمرين مي كنيم.
ماكرو ها:
Macros
سينتكس هاي زير براي توربو اسمبلر مناسب است.
ماكرو شبيه زيربرنامه مقداري كد است ولي يك فرق مهم دارد با آن.
فرقش اينه كه موقع كامپايل يك نسخه از زيربرنامه در ميان كدها وجود دارد و هر قسمت از برنامه كه بهش نياز داشته باشه كنترل را روي زير برنامه مي اندازد تا كدهاي زيربرنامه اجرا شود و بعد كنترل به برنامه صدا زننده برمي گردد ولي در مورد ماكرو اصل مطلب اين است كه هر جا كه ما ماكرو را صدا مي زنيم موقع كامپايل يك نسخه از ماكرو كدهايش آنجا نوشته ميشه.
سينتكس :
کد:
Name_of_macro macro
;
;a sequence of instructions
;
endm
يك ماكروي مفيد:
کد:
SaveRegs macro
push ax
push bx
push cx
push dx
endm
کد:
RestoreRegs macro
pop dx
pop cx
pop bx
pop ax
endm
گفتيم كه خوبه كه مواقعي كه نياز است همه رجيسترها را براي حفظ آنها push و بعد انجام كارمان pop كنيم. با صدا زدن ماكروهاي بالا اين كار خيلي ساده انجام ميشه.
طرز صدا كردن دو ماكروي بالا را در زير مي بينيم:
کد:
SaveRegs
; some other instructions
RestoreRegs
ماكرو دو مشكل مي تواند ايجاد كند. يكي اين كه چون مدام يك نسخه ازش به برنامه داره اضافه ميشه بايد حواسمان به حجم برنامه باشه و ديگه اين كه ليبل ها اگر به كار روند داراي ليبل هاي هم نام مي شويم. پس براي حل آن از دستور local استفاده مي كنيم.
سينتكس:
کد:
LOCAL name
يك ماكرو براي مثال در زير آورده مي شود. اين ماكرو به راحتي يك پيام چاپ مي كند.
کد:
OutMsg macro SomeText
local PrintMe,SkipData
jmp SkipData
PrintMe db SomeText,'$'
SkipData:
push ax dx cs
mov dx,OFFSET cs:PrintMe
mov ah,9
int 21h
pop cs dx ax
endm
ماكرو همچنين مي تواند پارامتر بگيرد.
مثال:
کد:
AddMacro macro num1,num2,result
push ax ; save ax from being destroyed
mov ax,num1 ; put num1 into ax
add ax,num2 ; add num2 to it
mov result,ax ; move answer into result
pop ax ; restore ax
endm
صفحه چهار هم تمام شد. البته نياز به تمرينات و توضيحات بيشتري داشت اين صفحه ولي براي اينكه سريع اين سايت تمام بشه وقت نشد اين كار را بكنيم. بعدا از منابع ديگر تمرين مي كنيم.