همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. با سینتکس در زبان اسمبلی (Assembly) در این بخش آشنا خواهیم شد.
یک برنامه اسمبلی می تواند به سه بخش زیر تقسیم شوند.
از بخش داده ها برای اعلام داده های اولیه یا ثابت استفاده می شود. این داده در زمان اجرا تغییر نمی کند. در این بخش می توانید مقادیر مختلف ثابت ، نام فایل ها یا اندازه بافر و غیره را اعلام کنید.
سینتکس اعلان بخش data به صورت زیر است.
1 | section.data |
از بخش bss برای اعلام متغیرها استفاده می شود. سینتکس برای اعلام بخش bss به صورت زیر است.
1 | section.bss |
از بخش text برای نگه داشتن کد واقعی استفاده می شود. این بخش باید با اعلام سراسری_start شروع می شود ، که به هسته می گوید که اجرای برنامه از کجا باید شروع شود.
سینتکس برای اعلام بخش text به صورت زیر است.
1 2 3 | section.text global _start _start: |
کامنت های زبان اسمبلی با (;) شروع می شود. کامنت ها ممکن است شامل تمامی کاراکترهای قابل چاپ باشد. کامنت ها می توانند مانند نمونه ی زیر، در یک خط نوشته شوند.
1 | ; This program displays a message on screen |
یا در همان خط به همراه یک دستورالعمل ، مانند زیر باشند.
1 | add eax, ebx ; adds ebx to eax |
برنامه های نوشته شده با زبان اسمبلی، شامل سه نوع دستور می باشند.
دستورالعمل های اجرایی یا دستورالعمل های ساده به پردازنده می گویند چه کاری انجام دهد. هر دستورالعمل شامل یک کد عملیاتی (opcode) است. هر دستورالعمل اجرایی یک دستورالعمل زبان ماشین تولید می کند.
دستورالعمل های اسمبلر در مورد جنبه های مختلف روند مونتاژ به اسمبلر می گوید. این دستورات غیرقابل اجرا هستند و دستورالعمل زبان ماشین را تولید نمی کنند.
ماکروها اساساً مکانیسم جایگزینی متن هستند.
هر کدام از دستورات زبان اسمبلی در یک سطر جدا نوشته می شود. هر همه ی آن ها از قالب زیر استفاده می کند.
1 | [label] mnemonic [operands] [;comment] |
قسمت های موجود در براکت ها اختیاری است. یک دستورالعمل ابتدایی دارای دو بخش است ، قسمت اول نام دستورالعمل (یا mnemonic) است که قرار است اجرا شود و دومی آن عملوندها (operands) یا پارامترهای دستور هستند.
در زیر چند نمونه از دستورات زبان اسمبلی آمده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 | INC COUNT ; Increment the memory variable COUNT MOV TOTAL, 48 ; Transfer the value 48 in the ; memory variable TOTAL ADD AH, BH ; Add the content of the ; BH register into the AH register AND MASK1, 128 ; Perform AND operation on the ; variable MASK1 and 128 ADD MARKS, 10 ; Add 10 to the variable MARKS MOV AL, 10 ; Transfer the value 10 to the AL register |
برنامه Hello World در اسمبلی
کد زبان اسمبلی زیر رشته “Hello World” را روی صفحه نمایش می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Live Demo section .text global _start ;must be declared for linker (ld) _start: ;tells linker entry point 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 mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data msg db 'Hello, world!', 0xa ;string to be printed len equ $ - msg ;length of the string |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 | Hello, world! |
اطمینان حاصل کنید که مسیر binary nasm و ld binaries را در متغیر محیطی PATH خود تنظیم کرده اید. اکنون برای کامپایل و لینک کردن برنامه فوق اقدامات زیر را انجام دهید.
اگر همه کارها را به درستی انجام داده باشید ، “Hello World” روی صفحه نمایش مشاهده خواهید کرد.
سینتکس در زبان اسمبلی (Assembly) و موارد مربوطه ی دیگری را در این بخش بررسی نمودیم. در بخش بعدی به بررسی سگمنت های حافظه در زبان اسمبلی می پردازیم.