آموزش Assembly | متغیرها و ثوابت

تعریف متغیرها

متغیر در اسمبلی به یک مکان مشخص در حافظه گفته می‌شود که برای نگهداری یک مقدار (عدد، کاراکتر یا آدرس) در طول اجرای برنامه رزرو شده است. برخلاف زبان‌های سطح بالا که خودشان نوع متغیر را مدیریت می‌کنند، در اسمبلی شما باید خودتان مشخص کنید که این متغیر چه اندازه‌ای داشته باشد و چه مقدار اولیه‌ای در آن قرار بگیرد.

برای تعریف یک متغیر در اسمبلی، از دستورالعمل‌های تعریف داده (Data Definition) استفاده می‌کنیم. این دستورالعمل‌ها به اسمبلر می‌گویند که چند بایت از حافظه را برای این متغیر رزرو کند و مقدار اولیه‌ی آن چه باشد. رایج‌ترین این دستورالعمل‌ها عبارتند از:

  • DB (Define Byte): یک بایت (۸ بیت) حافظه رزرو می‌کند. برای نگهداری اعداد کوچک (بین ۰ تا ۲۵۵ یا ‎-۱۲۸ تا ۱۲۷) یا یک کاراکتر استفاده می‌شود.
  • DW (Define Word): دو بایت (۱۶ بیت) حافظه رزرو می‌کند. برای اعدادی که در یک بایت جا نمی‌شوند مناسب است.
  • DD (Define Doubleword): چهار بایت (۳۲ بیت) حافظه رزرو می‌کند. برای اعداد بزرگ‌تر یا آدرس‌های ۳۲ بیتی به کار می‌رود.

ساختار کلی تعریف یک متغیر به این صورت است:

نام_متغیر  دستورالعمل_تعریف  مقدار_اولیه

برای مثال، اگر بخواهیم یک متغیر به نام age تعریف کنیم که مقدار اولیه‌اش ۲۵ باشد، می‌نویسیم:

age DB 25

در اینجا اسمبلر یک بایت از حافظه را با نام age رزرو می‌کند و عدد ۲۵ را داخل آن قرار می‌دهد. هر جای برنامه که به age اشاره کنیم، در واقع به همان خانه‌ی حافظه اشاره کرده‌ایم.

اگر بخواهیم یک کاراکتر را در متغیر ذخیره کنیم، مثلاً حرف A، می‌توانیم بنویسیم:

letter DB 'A'

اسمبلر کاراکتر A را به کد اسکی آن (که ۶۵ است) تبدیل کرده و در آن بایت قرار می‌دهد.

گاهی ممکن است بخواهیم متغیری تعریف کنیم که هنوز مقدار مشخصی برایش نداریم و فقط می‌خواهیم فضای حافظه‌اش رزرو شود. در این حالت به‌جای مقدار اولیه، از علامت سؤال ? استفاده می‌کنیم:

counter DB ?

این یعنی یک بایت حافظه برای counter رزرو شده، اما مقدار آن تعیین نشده و می‌تواند هر چیزی باشد. برنامه‌نویس باید قبل از خواندن این متغیر، خودش مقداری داخل آن قرار دهد، وگرنه مقدار نامشخصی خوانده می‌شود.

برای مقادیر بزرگ‌تر که در یک بایت جا نمی‌شوند، از DW استفاده می‌کنیم:

population DW 50000

و برای اعدادی که حتی از ۶۵۵۳۵ هم بزرگ‌تر هستند، از DD کمک می‌گیریم:

bigNumber DD 1000000

نکته‌ی مهمی که باید به آن توجه کنید این است که اندازه‌ی متغیر را باید خودتان مدیریت کنید. اگر متغیری را با DB تعریف کنید اما بخواهید عددی بزرگ‌تر از ۲۵۵ در آن ذخیره کنید، آن عدد به‌درستی نگهداری نخواهد شد و بخشی از آن از دست می‌رود. بنابراین هنگام تعریف متغیر همیشه به محدوده‌ی مقداری که می‌خواهید ذخیره کنید دقت کنید.

نکته‌ی دیگر این است که نام متغیرها در اسمبلی قوانینی دارد. نام باید با یک حرف یا کاراکتر خاص (مثل زیرخط _) شروع شود، نباید با اعداد شروع شود، نباید یکی از کلمات رزرو شده‌ی زبان اسمبلی باشد (مثل دستورات MOV، ADD یا نام رجیسترها)، و در بیشتر اسمبلرها به بزرگی و کوچکی حروف حساس نیست.

در نهایت، توجه داشته باشید که متغیرها در اسمبلی برخلاف زبان‌های سطح بالا فقط یک برچسب روی یک مکان حافظه هستند. هیچ نوع داده یا محافظتی همراه آن‌ها نیست و کاملاً به عهده‌ی برنامه‌نویس است که اندازه و نوع استفاده‌ی از آن‌ها را درست مدیریت کند.

پرسش و پاسخ این درس

برای ثبت پرسش ابتدا در سایت وارد شوید.

  • 1
  • 2
  • 3