متغیرها در زبان اسمبلی
NASM دستورالعمل های مختلفی را به منظور رزرو فضای حافظه برای ذخیره سازی متغیرها فراهم می کند. دستورالعمل define که به صورت D نوشته می شود برای اختصاص فضای ذخیره سازی استفاده می شود.
اختصاص فضای ذخیره سازی برای داده های مقداردهی شده
در زیر سینتکس مربوط به نحوه تخصیص فضای ذخیره سازی برای داده های مقداردهی شده را مشاهده می کنید:
[variable-name] define-directive initial-value [,initial-value]...
نام متغیر، شناسه ای برای هر فضای ذخیره سازی می باشد. اسمبلر یک مقدار offset را برای هر نام متغیر تعریف شده در بخش داده تعریف می کند.
در زیر ۵ نوع اصلی دستوراتی که برای تعریف متغیر در زبان اسمبلی استفاده می شوند را مشاهده می کنید:
دستور | هدف | فضای ذخیره سازی |
DB | تعریف بایت | اختصاص یک بایت |
DW | تعریف یک کلمه | اختصاص دو بایت |
DD | تعریف یک Doubleword | اختصاص چهار بایت |
DQ | تعریف یک Quadword | اختصاص هشت بایت |
DT | تعریف ده بایت | اختصاص ده بایت |
مثال های زیر، چگونگی استفاده از این دستورات در زبان اسمبلی را نشان می دهد:
choice DB 'y' number DW 12345 neg_number DW -12345 big_number DQ 123456789 real_number1 DD 1.234 real_number2 DQ 123.456
توجه داشته باشید که:
- هر بایت از کاراکتر به عنوان مقدار ASCII و به صورت هگزادسیمال ذخیره می شود.
- هر مقدار اعشاری به طور خودکار به معادله باینری ۱۶ بیتی تبدیل می شود و به عنوان یک عدد هگزادسیمال ذخیره می شود.
- پردازنده از دستور little-endian برای مرتب سازی بایت ها استفاده می شود.
- اعداد منفی به مکمل ۲ تبدیل می شوند.
- اعداد short و long با استفاده از به صورت ۳۲ یا ۶۴ بیتی نمایش داده می شوند.
مثال زیر نحوه تعریف و استفاده از متغیرها را در یک برنامه اسمبلی نشان می دهد:
section .text global _start ;must be declared for linker (gcc) _start: ;tell linker entry point mov edx,1 ;message length mov ecx,choice ;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 choice DB 'y'
امتحان کنید
زمانی که کد بالا توسط کامپایلر اسمبلی و اجرا شود، نتیجه زیر را تولید خواهد کرد:
y
اختصاص فضای ذخیره سازی برای داده های مقداردهی نشده
دستورالعمل reverse که به صورت RES نوشته می شود، به منظور رزرو فضای ذخیره سازی برای داده های مقداردهی نشده استفاده می شود. دستورالعمل رزرو تنها یک عملوند می گیرد که عداد واحد های فضای ذخیره سازی را مشخص می کند. هر دستور define یک دستور مرتبط reverse دارد.
در زیر ۵ دستورالعمل reverse اصلی را مشاهده می کنید:
دستور | هدف |
RESB | رزور یک بایت |
RESW | رزرو یک Word |
RESD | رزرو Doubleword |
RESQ | رزرو یک Quadword |
REST | رزرو ده بایت |
تعریف چندگانه
در یک برنامه شما می تواند داده ها را به صورت چندگانه تعریف کنید. مانند نمونه زیر:
choice DB 'Y' ;ASCII of y = 79H number1 DW 12345 ;12345D = 3039H number2 DD 12345679 ;123456789D = 75BCD15H
در تعریف چندگانه، اسمبلر حافظه را به صورت پیوسته اختصاص می دهد.
مقداردهی چندگانه
دستور TIMES اجازه می دهد تا یک مقدار را چندین بار در یک متغیر قرار دهیم. برای مثال، یک آرایه با نام marks و اندازه ۹ می تواند با استفاده از عبارت زیر تعریف و با مقدار صفر مقداردهی شود:
marks TIMES 9 DW 0
دستور TIME برای تعریف آرایه ها و جداول مفید است. مثال زیر ۹ ستاره را روی صفحه نمایش چاپ می کند.
section .text global _start ;must be declared for linker (ld) _start: ;tell linker entry point mov edx,9 ;message length mov ecx, stars ;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 stars times 9 db '*'
امتحان کنید
زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:
*********
نوشته متغیرها در زبان اسمبلی – آموزش Assembly اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.