قواعد نحوی در زبان اسمبلی
یک برنامه اسمبلی را می توان به سه بخش تقسیم کرد:
- بخش data
- بخش bss
- بخش text
بخش data
بخش data به منظور اعلان داده های اولیه و یا ثوابت استفاده می شود. این داده ها در زمان اجرای برنامه تغییر نمی کنند. شما می تواند مقادیر ثابت، نام فایل، اندازه بافر و غیره را در این بخش اعلان کنید.
سینتکس مربوط به اعلان این بخش به صورت زیر است:
section.data
بخش bss
بخش bss برای اعلام متغیرها استفاده می شود. سینتکس مربوط به اعلان این بخش به صورت زیر است:
section.bss
بخش text
بخش text به منظور نگه داری کد واقعی برنامه استفاده می شود. این بخش باید با اعلان سراسری _start شروع شود. اعلان _start به هسته می گوید که برنامه باید از این نقظه شروع شود. سینتکس مربوط به اعلان این بخش به صورت زیر است:
section.text global _start _start:
کامنت
در زبان اسمبلی برای نوشتن کامنت ها از ; استفاده می شود. هر کامنت می تواند شامل تمامی کاراکترهای قابل چاپ باشد. کامنت ها ممکن است در یک خط نوشته شوند، مانند نمونه زیر:
; This program displays a message on screen و یا به همراه یک دستورالعمل نوشته شوند: add eax, ebx ; adds ebx to eax
دستورات زبان اسمبلی
برنامه هایی که با زبان اسمبلی نوشته می شوند شامل سه نوع دستور هستند:
- دستورالعمل های اجرایی
- دستورالعمل های اسمبلر
- ماکروها
دستورالعمل های اجرایی به پردازنده می گویند که چه کاری باید انجام دهد. هر دستورالعمل یک کد عملیاتی (opcode) دارد. هر دستورالعمل اجرایی، یک دستورالعمل زبان ماشین تولید می کند. دستورالعمل های اسمبلر، جنبه های مختلف فرآیند مونتاژ را به اسمبلر می گویند. این ها دستورات قابل اجرا نیستند و دستورالعمل ماشین نیز تولید نمی کنند. ماکروها اساسا مکانیسم جایگزینی متن هستند.
سینتکس دستورات زبان اسمبلی
دستورات اسمبلی هر کدام در یک خط جدا نوشته می شوند و همگی آن ها از فرمت زیر پیروی می کنند:
[label] mnemonic [operands] [;comment]
بخش هایی که داخل براکت قرار گرفته اند، اختیاری می باشند. یک دستورالعمل ابتدایی دارای دو بخش است، یکی نام دستور (mnemonic) که باید اجرا شود و دیگری عملوندهای (operands) دستور می باشد.
در زیر نمونه هایی از دستورات زبان اسمبلی را مشاهده می کنید:
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” را در صفحه نمایش چاپ می کند:
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
امتحان کنید
زمانی که کد بالا توسط کامپایلر اسمبلی و اجرا شود، نتیجه زیر را تولید خواهد کرد:
Hello, world!
کامپایل و لینک کردن یک برنامه اسمبلی در NASM
مطمئن شوید که مسیر NASM و Id در متغیر محیطی PATH تنظیم شده است. سپس مراحل زیر را برای کامپایل و لینک کردن برنامه فوق دنبال کنید:
- کد بالا را با استفاده از یک ویرایشگر متن تایپ کنید و آن را با نام asm ذخیره کنید.
- به پوشه ای که فایل فوق را ذخیره کرده اید بروید.
- برای مونتاژ کردن فایل فوق دستور nasm -f elf hello.asm را تایپ کنید.
- اگر خطایی رخ داده باشد در این مرحله به شما گفته می شود. در غیر این صورت یک فایل object با نام o ساخته می شود.
- برای لینک کردن و ایجاد یک فایل اجرایی دستور ld -m elf_i386 -s -o hello hello.o را تایپ کنید.
- برنامه را با تایپ کردن ./hello اجرا کنید.
اگر همه مراحل به درستی انجام شود، پیام Hello World را مشاهده خواهید کرد.
نوشته قواعد نحوی در زبان اسمبلی – آموزش Assembly اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.