همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. در این قسمت از آموزش، ماکروها در زبان اسمبلی (Assembly) را توضیح خواهیم داد.
نوشتن یک ماکرو روش دیگری برای اطمینان از برنامه نویسی مدولار به زبان اسمبلی است.
ماکرو دنباله ای از دستورالعمل ها است که با یک نام اختصاص داده می شود و می تواند در هر نقطه از برنامه مورد استفاده قرار گیرد.
در NASM ، ماکروها با دستورالعمل های macro% و endmacro% تعریف می شوند.
ماکرو با دستورالعمل macro% آغاز می شود و با بخشنامه endmacro% به پایان می رسد.
نحو سینتکس تعریف ماکرو به شکل زیر است.
1 2 3 4 | %macro macro_name number_of_params <macro body> %endmacro |
number_of_params پارامترهای عدد را مشخص می کند ، macro_name نام ماکرو را مشخص می کند.
ماکرو با استفاده از نام ماکرو به همراه پارامترهای لازم فراخوانی می شود. هنگامی که شما نیاز دارید چندین بار از دنباله دستورالعمل ها در یک برنامه استفاده کنید ، می توانید آن دستورالعمل ها را در یک ماکرو قرار داده و به جای نوشتن دستورالعمل ها از آن استفاده کنید.
به عنوان مثال ، در برنامه ها نوشتن رشته ای از کاراکترها در صفحه، معمولا نیاز است. برای نمایش رشته ای از کاراکترها ، دنباله ای از دستورالعمل ها را نیاز دارید.
1 2 3 4 5 | mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel |
در مثال فوق از نمایش یک رشته کاراکتر ، رجیسترهای EAX ، EBX ، ECX و EDX توسط تابع فراخوان INT 80H استفاده شده است. بنابراین ، هر بار که نیاز به نمایش روی صفحه دارید ، باید این رجیسترها را روی پشته ذخیره کنید ، INT 80H فراخوانی کنید و سپس مقدار اصلی رجیسترها را از پشته بازیابی کنید. بنابراین ، نوشتن دو ماکرو برای ذخیره و بازیابی اطلاعات می تواند مفید باشد.
ما مشاهده کردیم که برخی از دستورالعمل هایی مانند IMUL ، IDIV ، INT و غیره ، به بعضی از اطلاعات نیاز دارند تا در برخی از رجیسترهای خاص ذخیره شوند و حتی مقادیر برگشتی را در برخی از رجیسترهای خاص ذخیره کنند. اگر برنامه قبلاً از آن دسته از رجیسترها برای نگه داری داده های مهم استفاده می کرده است ، باید داده های موجود از این رجیسترها در پشته ذخیره شده و پس از اجرای دستورالعمل بازیابی شوند.
مثال زیر تعریف و استفاده از ماکرو را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ; A macro with two parameters ; Implements the write system call %macro write_string 2 mov eax, 4 mov ebx, 1 mov ecx, %1 mov edx, %2 int 80h %endmacro section .text global _start ;must be declared for using gcc _start: ;tell linker entry point write_string msg1, len1 write_string msg2, len2 write_string msg3, len3 mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data msg1 db 'Hello, programmers!',0xA,0xD len1 equ $ - msg1 msg2 db 'Welcome to the world of,', 0xA,0xD len2 equ $- msg2 msg3 db 'Linux assembly programming! ' len3 equ $- msg3 |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 3 | Hello, programmers! Welcome to the world of, Linux assembly programming! |
در ابن بخش از آموزش زبان اسمبلی (Assembly) به بررسی ماکروها در زبان اسمبلی (Assembly) پرداختیم. در بخش بعدی مدیریت فایل راخواهیم داشت. با ما همراه باشید.