متغیرها در زبان اسمبلی – آموزش Assembly

assembly variables 4602 تصویر

متغیرها در زبان اسمبلی

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 اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

درباره نویسنده: administrator

ممکن است دوست داشته باشید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *