همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. در این بخش به رویه ها در زبان اسمبلی (Assembly) اشاره خواهیم کرد.
رویه ها یا زیرروال ها در زبان اسمبلی بسیار مهم هستند ، زیرا برنامه های زبان اسمبلی تمایل دارند که در اندازه بزرگ باشند. رویه ها با یک نام مشخص می شوند. به دنبال این نام ، بدنه رویه تشریح شده است که کار مشخصی را انجام می دهد. پایان مراحل توسط عبارت بازگشتی نشان داده شده است.
در زیر سینتکس تعریف رویه آورده شده است.
1 2 3 4 | proc_name: procedure body ... ret |
این رویه با استفاده از دستورالعمل CALL از تابع دیگر فراخوانی می شود. دستورالعمل CALL باید نام رویه فراخوانی شده را به عنوان آرگومان همان طور که در زیر نشان داده شده است داشته باشد.
1 | CALL proc_name |
called procedure با استفاده از دستورالعمل RET کنترل را به حالت فراخوانی باز می گرداند.
بگذارید یک روال بسیار ساده به نام sum بنویسیم که متغیرهای ذخیره شده در ثبات ECX و EDX را اضافه می کند و sum موجود در ثبات EAX را برمی گرداند.
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 31 32 33 34 35 36 37 38 39 | Live Demo section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov ecx,'4' sub ecx, '0' mov edx, '5' sub edx, '0' call sum ;call sum procedure mov [res], eax mov ecx, msg mov edx, len mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov ecx, res mov edx, 1 mov ebx, 1 ;file descriptor (stdout) mov eax, 4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel sum: mov eax, ecx add eax, edx add eax, '0' ret section .data msg db "The sum is:", 0xA,0xD len equ $- msg segment .bss res resb 1 |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 | The sum is: 9 |
پشته یا stack یکی از انواع داده ساختارها است که از آن برای ذخیره و بازیابی داده ها استفاده می شود. پشته در طراحی و پیاده سازی سیستم های نرم افزاری و سخت افزاری، استفاده می شود. شیوه ی عملکرد stack بر اساس سیاست LIFO یعنی آخرین ورودی اولین خروجی، است. با دستورالعمل POP و Push اطلاعات در پشته قرار داده و برداشته مي شوند.
زبان اسمبلی دو دستورالعمل برای عملیات پشته را ارائه می دهد: PUSH و POP. این دستورالعمل ها دارای سینتکس های زیر هستند.
1 2 | PUSH operand POP address/register |
واحد نوشتن و خواندن از پشته word است، يعني هر دفعه بايد دو بايت را push يا pop نماييم. ثبات (SP (Stack pointer همیشه به بالاترين كلمه ی وارد شده در پشته اشاره می كند و در اول كار مقدار آن n است كه همان تعداد بايت های پشته است.
اجرای پشته دارای خصوصیات زیر است.
همانطور که ما در مورد ذخیره مقادیر ثبات ها در پشته قبل از استفاده از آن ها برای برخی از موارد بحث کردیم. می تواند به روش زیر انجام شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ; Save the AX and BX registers in the stack PUSH AX PUSH BX ; Use the registers for other purpose MOV AX, VALUE1 MOV BX, VALUE2 ... MOV VALUE1, AX MOV VALUE2, BX ; Restore the original values POP BX POP AX |
برنامه زیر کل کاراکترهای ASCII را نمایش می دهد. برنامه اصلی روندی به نام display را فراخوانی می کند که مجموعه کاراکترهای ASCII را نشان می دهد.
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 | section .text global _start ;must be declared for using gcc _start: ;tell linker entry point call display mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel display: mov ecx, 256 next: push ecx mov eax, 4 mov ebx, 1 mov ecx, achar mov edx, 1 int 80h pop ecx mov dx, [achar] cmp byte [achar], 0dh inc byte [achar] loop next ret section .data achar db '0' |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
رویه ها در زبان اسمبلی (Assembly) را در این بخش مورد بررسی قرار دادیم. در بخش بعدی بازگشت پذيري (recursion) را دنبال می کنیم. با آموزش زبان اسمبلی (Assembly) همراه باشید.