برنامه به زبان اسمبلی مشخصات کلی سیستم فرمان زبان اسمبلر برای IBM-PC (مجموعه دستورات اساسی، روش های اساسی آدرس دهی عملوندها). ساختار برنامه به زبان اسمبلر دستورات زبان اسمبلی

اطلاعات کلیدر مورد زبان اسمبلی

زبان اسمبلی نمادین می تواند تا حد زیادی معایب برنامه نویسی زبان ماشین را از بین ببرد.

مزیت اصلی آن این است که در زبان اسمبلی همه عناصر برنامه به صورت نمادین ارائه می شوند. مسئولیت تبدیل نام دستورات نمادین به کدهای باینری آنهاست برنامه ویژه- اسمبلر که برنامه نویس را از کارهای پر زحمت رها می کند و خطاهای اجتناب ناپذیر را از بین می برد.

اسامی نمادینی که هنگام برنامه نویسی به زبان اسمبلی وارد می شوند معمولاً معنای برنامه را منعکس می کنند و مخفف دستورات عملکرد اصلی آنها را منعکس می کند. به عنوان مثال: PARAM - پارامتر، TABLE - جدول، MASK - mask، ADD - جمع، SUB - تفریق و غیره. و غیره. چنین نام هایی برای یک برنامه نویس به راحتی قابل یادآوری است.

برای برنامه نویسی به زبان اسمبلی، لازم است ابزارهای پیچیده ای نسبت به برنامه نویسی به زبان ماشین داشته باشید: به سیستم های کامپیوتری مبتنی بر میکرو کامپیوتر یا رایانه شخصی با مجموعه نیاز دارید. دستگاه های جانبی(صفحه کلید الفبایی، نمایش کاراکترها، درایو شناور و دستگاه چاپ)، و همچنین سیستم های مقیم یا متقابل برنامه نویسی برای انواع مورد نیاز ریزپردازنده ها. زبان اسمبلی به شما این امکان را می دهد که به طور موثر برنامه های پیچیده تری را نسبت به زبان ماشین (حداکثر 1 تا 4 کیلوبایت) بنویسید و اشکال زدایی کنید.

زبان‌های اسمبلی ماشین‌گرا هستند، یعنی وابسته به زبان ماشین و ساختار ریزپردازنده مربوطه هستند، زیرا در آنها به هر دستورالعمل ریزپردازنده یک نام نمادین خاص اختصاص داده شده است.

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

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

با استفاده از زبان اسمبلی، برنامه نویس می تواند پارامترهای زیر را تنظیم کند:

یادداشت (نام نمادین) هر دستور زبان ماشین ریزپردازنده؛

یک قالب استاندارد برای خطوط یک برنامه نوشته شده به زبان اسمبلی؛

قالب برای نشان دادن به طرق مختلفانواع آدرس دهی و فرمان؛

قالب برای تعیین ثابت های کاراکتر و ثابت های اعداد صحیح در سیستم های اعداد مختلف.

شبه دستوراتی که فرآیند مونتاژ (ترجمه) یک برنامه را کنترل می کنند.

در زبان اسمبلی یک برنامه خط به خط نوشته می شود یعنی برای هر دستور یک خط اختصاص داده می شود.

برای میکروکامپیوترهایی که بر اساس رایج ترین انواع ریزپردازنده ها ساخته شده اند، ممکن است انواع مختلفی از زبان اسمبلی وجود داشته باشد، اما معمولاً یکی از آنها به طور گسترده در عمل استفاده می شود - این به اصطلاح زبان اسمبلی استاندارد است.

برنامه نویسی در سطح دستورالعمل ماشین حداقل سطحی است که می توان برنامه ها را در آن نوشت. سیستم دستورالعمل های ماشین باید برای اجرای اقدامات لازم با صدور دستورالعمل ها به سخت افزار کامپیوتر کافی باشد.

هر دستور ماشین از دو بخش تشکیل شده است:

· اتاق عمل - تعیین "چه باید کرد"؛

· عملوند - تعریف اشیاء پردازشی، "با چه باید کرد".

دستور ماشین ریزپردازنده که به زبان اسمبلی نوشته شده است، یک خط با شکل نحوی زیر است:

عملگر(های) فرمان/دستورالعمل برچسب ;نظرات

در این حالت، فیلد مورد نیاز در خط یک فرمان یا دستورالعمل است.

برچسب، فرمان/دستورالعمل و عملوندها (در صورت وجود) با حداقل یک فاصله یا کاراکتر تب از هم جدا می شوند.

اگر دستور یا دستوری باید در خط بعدی ادامه یابد، از کاراکتر بک اسلش استفاده می شود: \.

به طور پیش فرض، زبان اسمبلی هنگام نوشتن دستورات یا دستورات، حروف بزرگ و کوچک را تشخیص نمی دهد.

آدرس دهی مستقیم: آدرس موثر مستقیماً توسط فیلد افست دستورالعمل ماشین تعیین می شود که می تواند 8، 16 یا 32 بیت باشد.

mov eax, sum ; eax = جمع

اسمبلر sum را با آدرس مربوطه ذخیره شده در بخش داده جایگزین می کند (به طور پیش فرض توسط ثبات ds آدرس داده می شود) و مقدار ذخیره شده در مجموع را در ثبات eax قرار می دهد.

آدرس دهی غیر مستقیمبه نوبه خود دارای انواع زیر است:

· آدرس دهی پایه غیر مستقیم (ثبت نام).

· آدرس دهی غیر مستقیم اولیه (ثبت نام) با افست.

آدرس دهی غیرمستقیم نمایه.

آدرس دهی شاخص پایه غیر مستقیم.

آدرس دهی پایه غیر مستقیم (ثبت نام).با این آدرس‌دهی، آدرس مؤثر عملوند را می‌توان در هر یک از ثبات‌های عمومی منظور کرد، به جز sp/esp و bp/ebp (این‌ها ثبات‌های خاصی برای کار با بخش پشته هستند). از نظر نحوی در یک دستور، این حالت آدرس دهی با قرار دادن نام ثبات در آن بیان می شود براکت های مربع.

mov eax, ; eax = *esi; * ارزش esi در آدرس esi

معرفی.

زبانی که به آن نوشته شده است برنامه اصلی، تماس گرفت ورودزبان و زبانی که برای اجرا توسط پردازنده به آن ترجمه شده است در روزهای تعطیلزبان. فرآیند تبدیل زبان ورودی به زبان خروجی نامیده می شود پخش.از آنجایی که پردازنده ها قادر به اجرای برنامه ها به زبان ماشین باینری هستند که برای برنامه نویسی استفاده نمی شود، ترجمه همه برنامه های منبع ضروری است. شناخته شده دو راهپخش: تألیف و تفسیر.

در تلفیقیبرنامه منبع ابتدا به طور کامل به یک برنامه معادل در زبان خروجی به نام ترجمه می شود هدف - شیبرنامه و سپس اجرا می شود. این فرآیند با استفاده از ابزار ویژه اجرا می شود برنامه ها،تماس گرفت کامپایلرکامپایلری که زبان ورودی آن شکل نمادینی برای نمایش زبان ماشین (خروجی) کدهای باینری است، نامیده می شود. مونتاژ کننده

در تفاسیرهر خط از متن در برنامه منبع تجزیه و تحلیل (تفسیر) می شود و دستور مشخص شده در آن بلافاصله اجرا می شود. اجرای این روش به عهده دارد برنامه مترجمتفسیر زمان زیادی می برد. برای افزایش کارایی، به جای پردازش هر خط، مفسر ابتدا همه را تبدیل می کند تیمرشته ها به کاراکترها (

). دنباله ایجاد شده از نمادها برای انجام عملکردهای اختصاص داده شده به برنامه اصلی استفاده می شود.

زبان اسمبلی مورد بحث در زیر با استفاده از کامپایل پیاده سازی شده است.

ویژگی های زبان.

ویژگی های اصلی اسمبلر:

● به جای کدهای باینری، زبان از نام های نمادین استفاده می کند - یادگاریبه عنوان مثال، برای دستور افزودن (

) یادگاری استفاده می شود

تفریق (

ضرب (

بخش ها (

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

هر عبارت مطابقت دارد یک فرمان ماشین(کد)، یعنی یک مکاتبه یک به یک بین دستورات ماشین و اپراتورها در یک برنامه زبان اسمبلی وجود دارد.

● زبان دسترسی را فراهم می کند به همه اشیاو تیم ها زبان های سطح بالا این توانایی را ندارند. به عنوان مثال، زبان اسمبلی به شما امکان می دهد بیت های ثبت پرچم و زبان سطح بالا را بررسی کنید (به عنوان مثال،

) این توانایی را ندارد. توجه داشته باشید که زبان های برنامه نویسی سیستم ها (به عنوان مثال C) اغلب یک موقعیت متوسط ​​را اشغال می کنند. از نظر دسترسی، آنها به زبان اسمبلی نزدیکتر هستند، اما نحو یک زبان سطح بالا را دارند.

● زبان اسمبلی یک زبان جهانی نیستهر گروه خاص از ریزپردازنده ها مونتاژ کننده مخصوص به خود را دارند. زبان های سطح بالا این اشکال را ندارند.

برخلاف زبان های سطح بالا، نوشتن و اشکال زدایی یک برنامه در زبان اسمبلی زمان زیادی می برد. با وجود این، زبان اسمبلی دریافت کرده است استفاده گستردهبه دلیل شرایط زیر:

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

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

در اکثر برنامه ها، تنها درصد کمی از کل کد، درصد زیادی از زمان اجرای برنامه را بر عهده دارد. به طور معمول، 1٪ از برنامه 50٪ از زمان اجرا و 10٪ از برنامه مسئول 90٪ از زمان اجرا است. بنابراین برای نوشتن یک برنامه خاص در شرایط واقعی هم از اسمبلر و هم یکی از زبان های سطح بالا استفاده می شود.

فرمت اپراتور در زبان اسمبلی.

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

فیلد برچسب.

ستون 1 برای فیلد برچسب اختصاص داده شده است. برچسب یک نام نمادین یا شناسه است. آدرس هاحافظه لازم است تا بتوانید:

● یک انتقال مشروط یا بدون قید و شرط به دستور انجام دهید.

● به مکانی که داده ها در آن ذخیره می شوند دسترسی پیدا کنید.

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

در برخی از نسخه‌های زبان اسمبلی، دونقطه تنها بعد از برچسب‌های دستورالعمل قرار می‌گیرند، نه بعد از برچسب‌های داده، و طول برچسب ممکن است به 6 یا 8 کاراکتر محدود شود.

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

قسمت کد عملیات

این فیلد حاوی کد یادگاری برای یک فرمان یا شبه فرمان است (به زیر مراجعه کنید). کد یادگاری فرمان توسط توسعه دهندگان زبان انتخاب می شود. به زبان اسمبلی

mnemonic برای بارگیری یک ثبات از حافظه انتخاب می شود

، و برای ذخیره محتویات رجیستر در حافظه - یک یادگاری

). در زبان های اسمبلی

برای هر دو عملیات می توانید به ترتیب از یک نام استفاده کنید

اگر انتخاب نام‌های یادگاری دلخواه باشد، نیاز به استفاده از دو دستورالعمل ماشین توسط معماری پردازنده تعیین می‌شود.

حافظه رجیسترها نیز به نسخه اسمبلر بستگی دارد (جدول 5.2.1).

فیلد عملوند.

اینجا واقع شده است اطلاعات تکمیلی، برای انجام عملیات لازم است. در قسمت عملوند دستورات پرش، آدرسی که پرش باید به آن انجام شود و همچنین آدرس‌ها و رجیسترهایی که عملوند فرمان ماشین هستند، نشان داده شده است. به عنوان مثال، عملوندهایی را ارائه می دهیم که می توانند برای پردازنده های 8 بیتی استفاده شوند

● داده های عددی،

در سیستم های اعداد مختلف ارائه شده است. برای نشان دادن سیستم اعداد مورد استفاده، ثابت با یکی از دنبال می شود حروف لاتین: که در،

بر این اساس، سیستم های اعداد باینری، اکتال، هگزادسیمال، اعشاری (

لازم نیست آن را یادداشت کنید). اگر اولین رقم یک عدد هگزادسیمال A، B، C باشد،

سپس یک 0 ناچیز (صفر) در جلو اضافه می شود.

● کدهای ثبت ریزپردازنده داخلی و سلول های حافظه

M (منابع یا گیرندگان اطلاعات) به شکل حروف A، B، C،

M یا آدرس های آنها در هر سیستم شماره (به عنوان مثال، 10B - آدرس ثبت نام

در سیستم باینری)؛

● شناسه ها،

برای ثبت جفت هواپیما،

حروف اول B هستند،

N; برای یک جفت آکومولاتور و ثبت ویژگی -

; برای پیشخوان برنامه -

برای نشانگر پشته -

● برچسب هایی که آدرس عملوندها یا دستورالعمل های بعدی را در شرطی نشان می دهند

(در صورت احراز شرط) و انتقال های بی قید و شرطبرای مثال، عملوند M1 در دستور

به معنای نیاز به انتقال بدون قید و شرط به دستور است که آدرس آن در قسمت برچسب با شناسه M1 مشخص شده است.

● عبارات،

که با پیوند دادن داده های مورد بحث در بالا با استفاده از عملگرهای حسابی و منطقی ساخته می شوند. توجه داشته باشید که روش رزرو فضای داده به نسخه زبان بستگی دارد. توسعه دهندگان زبان اسمبلی برای

کلمه را تعریف کنید) و بعدا وارد شد گزینه جایگزین.

که از همان ابتدا در زبان پردازنده ها بود

در نسخه زبان

استفاده شده

ثابت را تعریف کنید).

پردازنده ها عملوندهای با طول های مختلف را پردازش می کنند. برای تعریف آن، توسعه دهندگان اسمبلر تصمیمات مختلفی گرفتند، به عنوان مثال:

ثبات های II با طول های مختلف نام های مختلفی دارند: EAX - برای قرار دادن عملوندهای 32 بیتی (نوع

) AX - برای 16 بیت (نوع

و AN - برای 8 بیت (نوع

● برای پردازنده ها

پسوندها به هر کد عملیات اضافه می شوند: پسوند

برای نوع

; پسوند ".B" برای نوع

کدهای عملیاتی مختلف برای عملوندهای با طول های مختلف استفاده می شود، به عنوان مثال، برای بارگذاری یک بایت، نیم کلمه (

) و کلمات را با استفاده از کدهای عملیاتی به یک ثبات 64 بیتی تبدیل کنید

به ترتیب.

فیلد نظرات

در این قسمت توضیحاتی در مورد اقدامات برنامه ارائه شده است. نظرات بر عملکرد برنامه تأثیر نمی گذارد و برای انسان در نظر گرفته شده است. آنها ممکن است برای اصلاح یک برنامه مورد نیاز باشند، که بدون چنین نظراتی ممکن است حتی برای برنامه نویسان با تجربه کاملاً غیرقابل درک باشد. یک نظر با یک نماد شروع می شود و برای توضیح و مستندسازی برنامه ها استفاده می شود. کاراکتر شروع یک نظر می تواند این باشد:

● نقطه ویرگول (;) در زبان های پردازنده های شرکت

علامت تعجب(!) در زبان هایی برای

قبل از هر خط نظر جداگانه، یک کاراکتر اصلی وجود دارد.

شبه دستورات (دستورالعمل).

در زبان اسمبلی دو نوع دستور اصلی وجود دارد:

پایه ایدستورالعمل هایی که معادل کد ماشین پردازنده هستند. این دستورات تمام پردازش های مورد نظر برنامه را انجام می دهند.

شبه دستوراتیا بخشنامه ها،طراحی شده برای خدمات فرآیند ترجمه یک برنامه به یک زبان ترکیبی کد. به عنوان مثال در جدول 5.2.2 برخی از شبه دستورات از اسمبلر را نشان می دهد

برای خانواده

.

هنگام برنامه نویسی، شرایطی وجود دارد که طبق الگوریتم، یک زنجیره از دستورات باید بارها تکرار شود. برای رهایی از این وضعیت می توانید:

● دنباله دستورات مورد نیاز را هر زمان که ظاهر شد بنویسید. این رویکرد منجر به افزایش حجم برنامه می شود.

● این دنباله را در یک رویه (زیر روال) مرتب کنید و در صورت لزوم آن را فراخوانی کنید. این خروجی اشکالاتی دارد: هر بار که باید یک دستور فراخوانی رویه خاص و یک دستور بازگشت را اجرا کنید، که اگر دنباله کوتاه و مکرر استفاده شود، می تواند سرعت برنامه را تا حد زیادی کاهش دهد.

ساده ترین و روش موثرتکرار مکرر یک زنجیره از دستورات شامل استفاده از کلان،که می تواند به عنوان یک شبه فرمان طراحی شده برای ترجمه مجدد گروهی از دستورات که اغلب در یک برنامه یافت می شود، نمایش داده شود.

یک ماکرو یا کلان فرمان با سه جنبه مشخص می شود: تعریف کلان، وارونگی کلان و گسترش کلان.

تعریف کلان

این نامی است برای توالی تکرار مکرر دستورات برنامه که برای ارجاعات در متن برنامه استفاده می شود.

تعریف کلان دارای ساختار زیر است:

فهرست عبارات؛ تعریف کلان

در ساختار داده شده تعریف کلان، سه بخش قابل تشخیص است:

● عنوان

ماکرو، از جمله نام

شبه فرمان

و مجموعه ای از پارامترها؛

● با نقطه مشخص شده است بدنکلان؛

● تیم

فارغ التحصیلی

تعاریف کلان

مجموعه پارامترهای تعریف ماکرو شامل لیستی از تمام پارامترهای داده شده در قسمت عملوند برای گروه انتخاب شده از دستورالعمل ها است. اگر این پارامترها قبلاً در برنامه داده شده بودند، نیازی به نشان دادن آنها در هدر تعریف کلان نیست.

برای جمع آوری مجدد گروه انتخاب شده از دستورات، یک درخواست تجدید نظر شامل نام استفاده می شود

دستورات ماکرو و لیستی از پارامترها با مقادیر دیگر.

هنگامی که اسمبلر در طول فرآیند کامپایل با یک تعریف کلان مواجه می شود، آن را در جدول تعریف ماکرو ذخیره می کند. در حضورهای بعدی در برنامه نام (

) یک ماکرو، اسمبلر آن را با بدنه ماکرو جایگزین می کند.

استفاده از نام ماکرو به عنوان کد عملیاتی نامیده می شود معکوس کلان(تماس ماکرو)، و جایگزینی آن با بدنه ماکرو - گسترش کلان

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

گسترش ماکرو در طول فرآیند اسمبلی اتفاق می افتد، نه در طول اجرای برنامه. روش هایی برای دستکاری رشته کاراکترها به آنها اختصاص داده شده است کلان به معنی.

فرآیند مونتاژ انجام می شود در دو پاس:

● در اولین گذر، تمام تعاریف ماکرو حفظ می شوند و فراخوانی های ماکرو گسترش می یابند. در این حالت، برنامه اصلی خوانده می شود و به برنامه ای تبدیل می شود که در آن تمام تعاریف ماکرو حذف می شود و هر فراخوانی ماکرو با بدنه ماکرو جایگزین می شود.

● پاس دوم برنامه حاصل را بدون ماکرو پردازش می کند.

ماکروها با پارامترها

برای کار با توالی های مکرر دستورات، که پارامترهای آن می تواند مقادیر متفاوتی داشته باشد، تعاریف ماکرو ارائه شده است:

● با واقعیپارامترهایی که در قسمت عملوند فراخوانی ماکرو قرار می گیرند.

● با رسمیمولفه های. در طول گسترش ماکرو، هر پارامتر رسمی که در بدنه ماکرو ظاهر می شود با پارامتر واقعی مربوطه جایگزین می شود.

استفاده از ماکروها با پارامترها

برنامه 1 شامل دو توالی مشابه از دستورات است که تفاوت آنها در این است که اولی P و را تعویض می کند.

و دومی

برنامه 2 شامل یک ماکرو با دو پارامتر رسمی P1 و P2 است. در طول گسترش ماکرو، هر کاراکتر P1 در بدنه ماکرو با اولین پارامتر واقعی جایگزین می شود (P,

، و نماد P2 با دومین پارامتر واقعی جایگزین می شود (

) از برنامه شماره 1. در تماس ماکرو

برنامه 2 مشخص شده است: P،

اولین پارامتر واقعی،

دومین پارامتر واقعی

برنامه 1

برنامه 2

MOV EBX,Q MOV EAX,Pl

MOV Q، EAX MOV EBX، P2

MOV P,EBX MOV P2,EAX

قابلیت های گسترده

بیایید به برخی از ویژگی های زبان پیشرفته نگاه کنیم

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

برچسب محلی اعلام شده است (

) و به لطف قابلیت های پیشرفته، اسمبلر به طور خودکار هر بار که ماکرو گسترش می یابد، یک برچسب متفاوت تولید می کند.

به شما امکان می دهد ماکروها را در ماکروهای دیگر تعریف کنید. این ویژگی پیشرفته در ترکیب با پیوند شرطی یک برنامه بسیار مفید است. در نظر بگیریم

IF WORDSIZE GT 16 M2 MACRO

ماکرو M2 را می توان در هر دو قسمت عبارت تعریف کرد

با این حال، تعریف بستگی به این دارد که برنامه روی کدام پردازنده مونتاژ شده است: 16 بیتی یا 32 بیتی. اگر M1 فراخوانی نشود، ماکرو M2 اصلا تعریف نمی شود.

یکی دیگر از ویژگی های پیشرفته این است که ماکروها می توانند ماکروهای دیگر از جمله خودشان را فراخوانی کنند - بازگشتیزنگ زدن. در مورد دوم، برای جلوگیری از یک حلقه بی پایان، ماکرو باید پارامتری را به خود منتقل کند که با هر بسط تغییر می کند و همچنین بررسیاین پارامتر و زمانی که پارامتر به مقدار معینی رسید، بازگشت را پایان دهید.

در مورد استفاده از ابزارهای ماکرو در اسمبلر.

هنگام استفاده از ماکروها، اسمبلر باید بتواند دو عملکرد را انجام دهد: ذخیره تعاریف کلانو گسترش چالش های کلان

ذخیره تعاریف ماکرو

همه نام های ماکرو در یک جدول ذخیره می شوند. هر نام با یک اشاره گر به ماکرو مربوطه همراه است تا در صورت لزوم بتوان آن را فراخوانی کرد. برخی اسمبلرها یک جدول جداگانه برای نام های ماکرو دارند، برخی دیگر یک جدول کلی دارند که همراه با نام های ماکرو، تمام دستورالعمل ها و دستورالعمل های ماشین در آن قرار دارند.

هنگام برخورد با ماکرو در هنگام مونتاژ ایجاد شده است:

عنصر جدول جدیدبا نام ماکرو، تعداد پارامترها و یک اشاره گر به جدول تعریف ماکرو دیگری که بدنه ماکرو در آن ذخیره می شود.

● لیست رسمیمولفه های.

بدنه ماکرو، که به سادگی یک رشته از کاراکترها است، خوانده می شود و در جدول تعریف ماکرو ذخیره می شود. پارامترهای رسمی که در بدنه حلقه رخ می دهند علامت گذاری می شوند شخصیت خاص.

نمایش داخلی یک ماکرو

از مثال بالا برای برنامه 2 (ص 244) است:

MOV EAX، MOV EBX، MOV MOV و

که در آن نقطه ویرگول به عنوان کاراکتر بازگشتی کالسکه و علامت & به عنوان کاراکتر پارامتر رسمی استفاده می شود.

گسترش تماس های ماکرو

هر زمان که در هنگام اسمبلی با تعریف ماکرو مواجه شد، در جدول ماکرو ذخیره می شود. هنگامی که یک ماکرو فراخوانی می شود، اسمبلر به طور موقت خواندن داده های ورودی از دستگاه ورودی را متوقف می کند و شروع به خواندن بدنه ماکرو ذخیره شده می کند. پارامترهای رسمی استخراج شده از بدنه ماکرو با پارامترهای واقعی جایگزین شده و توسط فراخوان ارائه می شود. پارامترهای آمپرساند و قبل از اسمبلر به اسمبلر اجازه می دهد آنها را تشخیص دهد.

با وجود این واقعیت که نسخه های زیادی از اسمبلر وجود دارد، فرآیندهای مونتاژ ویژگی های مشترکی دارند و از بسیاری جهات مشابه هستند. عملکرد یک اسمبلر دو پاس در زیر مورد بحث قرار گرفته است.

مونتاژ کننده دو پاس.

یک برنامه از تعدادی عبارت تشکیل شده است. بنابراین، به نظر می رسد که هنگام مونتاژ، می توانید از دنباله اقدامات زیر استفاده کنید:

● آن را به زبان ماشین ترجمه کنید.

● کد ماشین حاصل را به یک فایل و قسمت مربوطه از فهرست را به فایل دیگری منتقل کنید.

● رویه های فهرست شده را تکرار کنید تا کل برنامه ترجمه شود.

با این حال، این رویکرد موثر نیست. یک مثال به اصطلاح مشکل است لینک فوروارداگر دستور اول یک پرش به عبارت P باشد که در انتهای برنامه قرار دارد، اسمبلر نمی تواند آن را ترجمه کند. او ابتدا باید آدرس اپراتور P را مشخص کند و برای این کار باید کل برنامه را بخواند. هر خواندن کامل برنامه منبع نامیده می شود گذربیایید نشان دهیم که چگونه می‌توانید با استفاده از دو پاس، مشکل پیوند پیش‌بینی را حل کنید:

در اولین پاس شما باید جمع آوری کنیدو تمام تعاریف نمادها (از جمله برچسب ها) را در جدول ذخیره کنید و در پاس دوم، هر عملگر را بخوانید و مونتاژ کنید. این روش نسبتاً ساده است، اما یک گذر دوم از برنامه اصلی نیاز به زمان اضافی صرف شده برای عملیات I/O دارد.

● در اولین پاس شما باید تبدیلبرنامه را در یک فرم میانی قرار داده و در یک جدول ذخیره کنید و پاس دوم را نه بر اساس برنامه اصلی، بلکه مطابق جدول انجام دهید. این روش مونتاژ باعث صرفه جویی در زمان می شود، زیرا پاس دوم عملیات I/O را انجام نمی دهد.

اولین گذر.

گل پاس اول- یک جدول نماد بسازید. همانطور که در بالا ذکر شد، یکی دیگر از اهداف اولین پاس حفظ تمام تعاریف ماکرو و گسترش فراخوان‌ها همانطور که ظاهر می‌شوند است. در نتیجه، هم تعریف نماد و هم گسترش کلان در یک گذر اتفاق می‌افتد. نماد می تواند هر دو باشد برچسب،یا معنی،که یک نام خاص با استفاده از دستور -you به آن اختصاص داده شده است:

مقدار - اندازه بافر

اسمبلر با اختصاص معنی به نام های نمادین در قسمت برچسب فرمان، اساساً آدرس هایی را که هر دستور در طول اجرای برنامه خواهد داشت، مشخص می کند. برای این منظور، اسمبلر در طول فرآیند مونتاژ ذخیره می کند شمارنده آدرس دستورالعمل(

) به عنوان یک متغیر خاص. در ابتدای اولین گذر، مقدار متغیر ویژه 0 تنظیم می شود و پس از هر دستور پردازش شده به طول آن دستور افزایش می یابد. به عنوان مثال در جدول 5.2.3 یک قطعه برنامه را نشان می دهد که طول دستورات و مقادیر شمارنده را نشان می دهد. در اولین پاس، جداول تولید می شوند نام های نمادین، دستورالعمل هاو کدهای عملیاتی،و در صورت لزوم تحت اللفظیجدول. Literal ثابتی است که اسمبلر به طور خودکار حافظه را برای آن ذخیره می کند. بیایید فوراً توجه کنیم که پردازنده‌های مدرن حاوی دستورالعمل‌هایی با آدرس‌های فوری هستند، بنابراین اسمبلرهای آنها از لفظ پشتیبانی نمی‌کنند.

جدول نام نماد

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

● طول فیلد داده مرتبط با نماد.

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

● اطلاعاتی در مورد اینکه آیا می توان به نماد از خارج از رویه دسترسی داشت یا خیر.

نام های نمادین برچسب هستند. آنها را می توان با استفاده از عملگرها مشخص کرد (به عنوان مثال،

جدول دستورالعمل.

این جدول تمام دستورات یا شبه فرمان هایی را که هنگام مونتاژ یک برنامه با آنها مواجه می شوند، فهرست می کند.

جدول کد عملیات

برای هر کد عملیات، جدول دارای ستون های جداگانه است: تعیین کد عملیات، عملوند 1، عملوند 2، مقدار هگزادسیمال کد عملیات، طول فرمان و نوع فرمان (جدول 5.2.5). کدهای عملیات بسته به تعداد و نوع عملوندها به گروه هایی تقسیم می شوند. نوع فرمان شماره گروه را تعیین می کند و روشی را مشخص می کند که برای پردازش همه دستورات در آن گروه فراخوانی می شود.

پاس دوم

گل پاس دوم- ایجاد یک برنامه شی و چاپ، در صورت لزوم، پروتکل مونتاژ. اطلاعات خروجی لازم برای پیوند دهنده برای پیوند رویه هایی که در زمان های مختلف در یک فایل اجرایی مونتاژ شده اند.

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

برنامه منبع ممکن است حاوی خطاهایی باشد، به عنوان مثال:

نماد داده شده تعریف نشده است یا بیش از یک بار تعریف شده است.

● کد عملیاتی با نامی نامعتبر نمایش داده می شود (به دلیل اشتباه تایپی)، عملوندهای کافی ندارد، یا عملوندهای زیادی دارد.

● بدون اپراتور

برخی اسمبلرها می توانند یک نماد تعریف نشده را شناسایی کرده و آن را جایگزین کنند. با این حال، در بیشتر موارد، زمانی که اسمبلر با یک عبارت خطا مواجه می شود، یک پیغام خطا را روی صفحه نمایش می دهد و تلاش می کند تا روند مونتاژ را ادامه دهد.

مقالات اختصاص داده شده به زبان اسمبلی.

مبحث 2.5 مبانی برنامه نویسی پردازنده

با افزایش طول برنامه، به خاطر سپردن کدهای عملیات مختلف به طور فزاینده ای دشوار می شود. Mnemonics در این زمینه کمک می کند.

زبان رمزگذاری دستور نمادین نامیده می شود مونتاژ کننده.

زبان اسمبلیزبانی است که در آن هر گفته دقیقاً با یک فرمان ماشین مطابقت دارد.

مونتاژتبدیل یک برنامه از زبان اسمبلی، یعنی تهیه برنامه به زبان ماشین با جایگزینی نام های نمادین عملیات با کدهای ماشین، و آدرس های نمادین با اعداد مطلق یا نسبی، و همچنین ترکیب برنامه های کتابخانه و تولید دنباله ای از دستورالعمل های نمادین با تعیین پارامترهای خاص، نامیده می شود. در تیم های خرد این برنامهمعمولاً در رام قرار دارد یا از برخی رسانه های خارجی وارد رم می شود.

زبان اسمبلی دارای چندین ویژگی است که آن را از زبان های سطح بالا متمایز می کند:

1. این مطابقت یک به یک بین دستورات زبان اسمبلی و دستورالعمل های ماشین است.

2. یک برنامه نویس به زبان اسمبلی به تمام اشیاء و دستورالعمل های موجود در ماشین هدف دسترسی دارد.

درک اصول برنامه نویسی در زبان های ماشین گرا برای موارد زیر مفید است:



درک بهتر معماری رایانه شخصی و استفاده شایسته تر از رایانه.

توسعه ساختارهای منطقی‌تر الگوریتم‌ها برای برنامه‌هایی برای حل مسائل کاربردی؛

امکان مشاهده و تصحیح برنامه های اجرایی با پسوند exe و .com که از هر زبان سطح بالا کامپایل شده اند در صورت از دست دادن برنامه های منبع (با فراخوانی برنامه های مشخص شده در دیباگر برنامه DEBUG و دیکامپایل نمایش آنها در اسمبلی زبان)؛

کامپایل برنامه هایی برای حل بحرانی ترین مسائل (برنامه ای که به زبان ماشین محور نوشته شده است معمولاً مؤثرتر است - 30 تا 60 درصد برنامه هایی که در نتیجه ترجمه از زبان های سطح بالا به دست می آیند کوتاهتر و سریعتر هستند)

برای پیاده سازی رویه های موجود در برنامه اصلی در قالب قطعات جداگانه در صورتی که آنها را نتوان به زبان سطح بالا استفاده کرد یا با استفاده از رویه های سرویس سیستم عامل اجرا کرد.

یک برنامه به زبان اسمبلی فقط می تواند بر روی یک خانواده از رایانه ها اجرا شود، در حالی که برنامه ای که به زبان سطح بالا نوشته شده است به طور بالقوه می تواند بر روی ماشین های مختلف اجرا شود.

الفبای زبان اسمبلی از کاراکترهای ASCII تشکیل شده است.

اعداد فقط اعداد صحیح هستند. وجود دارد:

اعداد باینری با حرف B خاتمه می یابند.

اعداد اعشاری که با حرف D ختم می شوند.

اعداد هگزادسیمال با حرف H ختم می شوند.

RAM، رجیسترها، ارائه داده ها

برای یک سری معین از MP، از یک زبان برنامه نویسی فردی استفاده می شود - زبان اسمبلی.

زبان اسمبلی جایگاهی میانی را بین کدهای ماشین و زبان‌های سطح بالا اشغال می‌کند. برنامه نویسی به این زبان ساده تر است. یک برنامه در زبان اسمبلی از قابلیت های یک ماشین خاص (به طور دقیق تر، MP) استفاده موثرتری می کند تا یک برنامه در یک زبان سطح بالا (که برای یک برنامه نویس ساده تر از اسمبلر است). بیایید با استفاده از مثال زبان اسمبلی برای MP KR580VM80 به اصول اولیه برنامه نویسی در زبان های ماشین گرا نگاه کنیم. یک متدولوژی کلی برای برنامه نویسی در زبان استفاده می شود. تکنیک های فنی خاص برای ضبط برنامه ها با ویژگی های معماری و سیستم فرمان MP هدف مرتبط است.

مدل نرم افزارسیستم ریزپردازنده مبتنی بر MP KR580VM80

مدل نرم افزاری MPS مطابق شکل 1

حافظه پورت MP

اس ز A.C. پ سی

تصویر 1

از دیدگاه برنامه نویس، MP KR580VM80 دارای رجیسترهای قابل دسترسی برنامه زیر است.

آ– رجیستر اکومولاتور 8 بیتی. این ثبت نام اصلی MP است. هر عملیاتی که در یک ALU انجام می شود شامل قرار دادن یکی از عملوندها برای پردازش در انباشته است. نتیجه یک عملیات در ALU نیز معمولاً در A ذخیره می شود.

B، C، D، E، H، L- رجیسترهای هدف عمومی 8 بیتی (GPR). حافظه درونینماینده مجلس برای ذخیره اطلاعات پردازش شده و همچنین نتایج عملیات طراحی شده است. هنگام پردازش کلمات 16 بیتی، رجیسترها جفت های BC، DE، HL را تشکیل می دهند و رجیستر دوگانه اولین حرف - B، D، H نامیده می شود. در یک جفت ثبات، بالاترین، اولین ثبات است. ثبات های H و L دارای خاصیت خاصی هستند که هم برای ذخیره داده ها و هم برای ذخیره آدرس های 16 بیتی سلول های RAM استفاده می شود.

FL– ثبت پرچم (ثبت ثبت علامت) رجیستر 8 بیتی که در آن پنج علامت از نتیجه انجام عملیات حسابی و منطقی در MP ذخیره می شود. فرمت FL مطابق تصویر

بیت C (CY - حمل) - حمل، در صورت وجود حمل از مرتبه بالای بایت هنگام انجام عملیات حسابی، روی 1 تنظیم کنید.

بیت P (تعادل) - برابری، اگر تعداد یک ها در بیت های حاصل زوج باشد، روی 1 تنظیم کنید.

رقم AC یک انتقال اضافی است که برای ذخیره ارزش حمل از تتراد درجه پایین نتیجه طراحی شده است.

بیت Z (صفر) - اگر نتیجه عملیات 0 باشد، روی 1 تنظیم کنید.

بیت S (نشانه) - در صورت منفی بودن نتیجه روی 1 و در صورت مثبت بودن روی 0 تنظیم می شود.

SP- اشاره گر پشته، یک ثبات 16 بیتی، طراحی شده برای ذخیره آدرس سلول حافظه که در آن آخرین بایت درج شده در پشته نوشته شده است.

RS– شمارنده برنامه (برنامه شمارنده)، یک ثبات 16 بیتی، طراحی شده برای ذخیره آدرس دستور بعدی که باید اجرا شود. محتویات شمارنده برنامه بلافاصله پس از واکشی بایت دستورالعمل بعدی به طور خودکار 1 افزایش می یابد.

ناحیه حافظه اولیه آدرس 0000Н – 07FF شامل برنامه کنترل و برنامه های نمایشی است. این قسمت ROM است.

0800 – 0AFF - منطقه آدرس برای ضبط برنامه های تحت مطالعه. (رم).

0В00 – 0ВВ0 - ناحیه آدرس برای نوشتن داده ها. (رم).

0ВВ0 - آدرس شروع پشته. (رم).

پشته یک ناحیه سازماندهی شده ویژه از RAM است که برای ذخیره موقت داده ها یا آدرس ها در نظر گرفته شده است. آخرین عدد نوشته شده در پشته ابتدا ظاهر می شود. نشانگر پشته آدرس آخرین سلول پشته ای که اطلاعات در آن نوشته شده را ذخیره می کند. هنگامی که یک برنامه فرعی فراخوانی می شود، آدرس بازگشت به برنامه اصلی به طور خودکار در پشته ذخیره می شود. به عنوان یک قاعده، در ابتدای هر زیربرنامه، محتویات تمام ثبات های درگیر در اجرای آن در پشته ذخیره می شوند و در پایان زیربرنامه از پشته بازیابی می شوند.

فرمت داده و ساختار دستور زبان اسمبلی

حافظه MP KR580VM80 آرایه ای از کلمات 8 بیتی به نام بایت است که هر بایت آدرس 16 بیتی خود را دارد که موقعیت آن را در دنباله سلول های حافظه مشخص می کند. MP می تواند 65536 بایت حافظه را آدرس دهی کند که می تواند هم در ROM و هم در RAM باشد.

فرمت داده

داده ها به صورت کلمات 8 بیتی در حافظه ذخیره می شوند:

D7 D6 D5 D4 D3 D2 D1 D0

کم اهمیت ترین بیت بیت 0 و مهم ترین بیت بیت 7 است.

یک فرمان با فرمت آن مشخص می شود، یعنی تعداد بیت های اختصاص داده شده برای آن، که بایت به بایت به فیلدهای عملکردی خاصی تقسیم می شوند.

فرمت فرمان

فرمت های MP KR580VM80 یک، دو یا سه بایت است. دستورات چند بایتی باید در زبان های مجاور قرار گیرند. فرمت فرمان بستگی به ویژگی های عملیات در حال انجام دارد.

اولین بایت دستور حاوی کد عملیات است که به شکل یادگاری نوشته شده است.

فرمت فرمان و اقداماتی که باید توسط MP بر روی داده ها در حین اجرای آن انجام شود و روش آدرس دهی را تعیین می کند و همچنین ممکن است حاوی اطلاعاتی در مورد مکان داده ها باشد.

بایت دوم و سوم ممکن است حاوی داده هایی باشد که عملیات روی آنها انجام می شود یا آدرس هایی که مکان داده ها را نشان می دهد. داده هایی که بر روی آنها اقدامات انجام می شود عملوند نامیده می شود.

فرمت فرمان تک بایتی مطابق شکل 2

شکل 4

در دستورات زبان اسمبلی، کد عملیات دارای شکل کوتاه شده ای از نوشتن کلمات انگلیسی است - یک نماد یادگاری. Mnemonics (از یونانی mnemonic - هنر به خاطر سپردن) به خاطر سپردن دستورات با هدف کاربردی آنها آسان تر می شود.

قبل از اجرا، برنامه منبع با استفاده از یک برنامه ترجمه به نام اسمبلر به زبان ترکیب کد - زبان ماشین ترجمه می شود، به این شکل در حافظه MP قرار می گیرد و سپس هنگام اجرای دستور استفاده می شود.


روش های آدرس دهی

همه کدهای عملوند (ورودی و خروجی) باید در جایی قرار گیرند. آنها را می توان در رجیسترهای داخلی MP (راحت ترین و گزینه سریع). می توانند در آن قرار گیرند حافظه سیستم(متداول ترین گزینه). در نهایت، آنها را می توان در دستگاه های I/O (نادرترین مورد) قرار داد. مکان عملوندها توسط کد دستورالعمل تعیین می شود. وجود داشته باشد روش های مختلف، که با آن کد دستورالعمل می تواند تعیین کند که عملوند ورودی را کجا و عملوند خروجی را در کجا قرار دهد. به این روش ها روش های آدرس دهی می گویند.

برای MP KR580VM80، روش های آدرس دهی زیر وجود دارد:

مستقیم؛

ثبت نام؛

غیر مستقیم؛

انباشته.

مستقیم آدرس دهی فرض می کند که عملوند (ورودی) بلافاصله پس از کد دستورالعمل در حافظه قرار دارد. عملوند معمولاً یک ثابت است که باید به جایی فرستاده شود، به چیزی اضافه شود، و غیره. و بایت بالا در بایت فرمان سوم.

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

ثبت نام آدرس دهی فرض می کند که عملوند (ورودی یا خروجی) در ثبات داخلی MP است. در دستورات تک بایتی استفاده می شود

غیر مستقیم آدرس دهی (ضمنی) فرض می کند که رجیستر داخلی MP شامل خود عملوند نیست، بلکه آدرس آن در حافظه است.

پشته آدرس دهی فرض می کند که دستور حاوی آدرس نیست. آدرس دهی سلول های حافظه با استفاده از محتویات ثبات SP 16 بیتی (اشاره گر پشته).

سیستم فرمان

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

گروه های زیر از دستورات متمایز می شوند:

انتقال داده ها؛

حسابی؛

بازی فکری;

دستورات پرش؛

دستورات ورودی/خروجی، کنترل و پشته.


نمادها و اختصارات مورد استفاده در هنگام توصیف دستورات و نوشتن برنامه ها

سمبل کاهش
ADDR آدرس 16 بیتی
داده ها داده 8 بیتی
داده 16 داده 16 بیتی
بندر آدرس دستگاه ورودی/خروجی 8 بیتی
BYTE 2 بایت دوم دستور
BYTE 3 بایت سوم فرمان
R، R1، R2 یکی از رجیسترها: A, B, C, D, E, H, L
R.P. یکی از جفت های ثبات: B - جفت BC را مشخص می کند. D - یک جفت DE را مشخص می کند. H – جفت HL را مشخص می کند
RH اولین ثبت جفت
R.L. ثبت دوم جفت
Λ ضرب منطقی
V اضافه منطقی
اضافه کردن مدول دو
م یک سلول حافظه که آدرس آن محتویات جفت ثبت HL را مشخص می کند، یعنی M = (HL)

1. معماری کامپیوتر……………………………………………………………………………

    1.1. ثبت می کند.

    1.1.1 ثبت های عمومی.

1.1.2. ثبت بخش ها

1.1.3 ثبت پرچم

1.2. سازماندهی حافظه

1.3. ارائه داده ها

1.3.1 انواع داده ها

1.3.2 نمایش کاراکترها و رشته ها

2. دستورات برنامه در اسمبلر ………………………………………

    1. دستورات زبان اسمبلی

2.2. حالت های آدرس دهی و فرمت های دستورالعمل ماشین

3. عملگرهای شبه………………………………………………………………

3.1 دستورالعمل های تعریف داده

3.2 ساختار یک برنامه اسمبلر

3.2.1 بخش های برنامه. بخشنامه را فرض کنید

3.2.3 دستورالعمل تقسیم بندی ساده شده

4. مونتاژ و تنظیم برنامه ………………………………

5. دستورات انتقال داده…………………………………………………

    5.1 دستورات عمومی

    5.2 دستورات پشته

5.3 دستورات ورودی/خروجی

5.4 دستورات ارسال آدرس

5.5 پرچم دستورات ارسال

6. دستورات حسابی…………………………………………………

    6.1 عملیات حسابی روی اعداد صحیح باینری

6.1.1 جمع و تفریق

6.1.2 دستور افزایش و کاهش یک گیرنده

6.2 ضرب و تقسیم

6.3 تغییر علامت

7. عملیات منطقی………………………………………………

8. شیفت ها و شیفت های چرخه ای……………………………………………………

9. عملیات رشته…………………………………………………………….

10. منطق و سازماندهی برنامه ها………………………………………

10.1 پرش های بی قید و شرط

10.2 پرش های مشروط

10.4 رویه ها در زبان اسمبلی

10.5 وقفه های INT

10.6 نرم افزار سیستم

10.6.1.1 خواندن صفحه کلید.

10.6.1.2 نمایش کاراکترها روی صفحه

10.6.1.3 پایان دادن به برنامه ها.

10.6.2.1 انتخاب حالت های نمایش

11. حافظه دیسک……………………………………………………………………

11.2 جدول توزیع فایل

11.3 عملیات ورودی/خروجی دیسک

11.3.1 نوشتن یک فایل روی دیسک

11.3.1.1 داده های ASCIIZ

11.3.1.2 شماره فایل

11.3.1.3 ایجاد یک فایل دیسک

11.3.2 خواندن یک فایل دیسک

معرفی

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

اسمبلر فرم مناسبی از دستورات است که مستقیماً برای اجزای رایانه شخصی است و نیاز به آگاهی از خصوصیات و قابلیت های مدار مجتمع حاوی این مؤلفه ها، یعنی ریزپردازنده رایانه شخصی دارد. بنابراین، زبان اسمبلی مستقیماً با سازماندهی داخلی رایانه شخصی مرتبط است. و تصادفی نیست که تقریباً تمام کامپایلرهای زبان سطح بالا از دسترسی به سطح اسمبلی برنامه نویسی پشتیبانی می کنند.

یک عنصر از آموزش یک برنامه نویس حرفه ای لزوماً مطالعه اسمبلر است. این به این دلیل است که برنامه نویسی به زبان اسمبلی نیاز به دانش معماری رایانه شخصی دارد که به شما امکان می دهد برنامه های کارآمدتری را به زبان های دیگر ایجاد کنید و آنها را با برنامه های زبان اسمبلی ترکیب کنید.

این کتابچه راهنمای برنامه نویسی به زبان اسمبلی برای کامپیوترهای مبتنی بر ریزپردازنده های اینتل را مورد بحث قرار می دهد.

این آموزش برای همه کسانی که به معماری پردازنده و مبانی برنامه نویسی به زبان اسمبلی علاقه دارند، در درجه اول برای توسعه دهندگان محصولات نرم افزاری، می باشد.

    معماری PC

معماری کامپیوتر یک نمایش انتزاعی از یک کامپیوتر است که ساختار، مدار و سازماندهی منطقی آن را منعکس می کند.

همه رایانه های مدرن دارای برخی ویژگی های معماری مشترک و فردی هستند. ویژگی های فردی برای یک مدل کامپیوتری خاص منحصر به فرد است.

مفهوم معماری کامپیوتر شامل:

    بلوک دیاگرام کامپیوتر؛

    ابزارها و روش های دسترسی به عناصر بلوک دیاگرام رایانه؛

    مجموعه و در دسترس بودن رجیسترها؛

    سازماندهی و روشهای رسیدگی؛

    روش ارائه و قالب داده های کامپیوتری؛

    مجموعه ای از دستورالعمل های ماشین کامپیوتری؛

    فرمت های دستورالعمل ماشین؛

    وقفه در رسیدگی

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

      ثبت می کند.

در داخل ریزپردازنده، اطلاعات در گروهی از 32 رجیستر (16 کاربر، 16 سیستم)، به یک درجه یا درجه دیگر، برای استفاده توسط برنامه نویس موجود است. از آنجایی که دفترچه راهنما به برنامه نویسی برای ریزپردازنده 8088-i486 اختصاص دارد، منطقی ترین آن است که این موضوع را با بحث در مورد ثبات های داخلی ریزپردازنده که برای کاربر در دسترس است شروع کنیم.

رجیسترهای کاربر توسط برنامه نویس برای نوشتن برنامه ها استفاده می شود. این ثبت ها عبارتند از:

    هشت رجیستر 32 بیتی (رجیسترهای هدف عمومی) EAX/AX/AH/AL، EBX/BX/BH/BL، ECX/CX/CH/CL، EDX/DX/DLH/DL، EBP/BP، ESI/SI، EDI/DI، ESP/SP؛

    شش رجیستر قطعه 16 بیتی: CS، DS، SS، ES، FS، GS.

    رجیسترهای وضعیت و کنترل: ثبت پرچم EFLAGS/FLAGS و ثبت اشاره گر فرمان EIP/IP.

بخش هایی از یک ثبات 32 بیتی از طریق یک اسلش نشان داده می شوند. پیشوند E (Extended) نشان دهنده استفاده از یک ثبات 32 بیتی است. برای کار با بایت ها، از ثبات هایی با پیشوندهای L (کم) و H (بالا) استفاده می شود، به عنوان مثال، AL، CH - نشان دهنده بایت های کم و زیاد قسمت های 16 بیتی ثبات ها است.

        ثبت های عمومی

EAX/AX/AH/AL (رجیستر اکومولاتور) – باتری. در ضرب و تقسیم، در عملیات ورودی/خروجی و در برخی عملیات رشته ای استفاده می شود.

EBX/BX/BH/BL – ثبت پایه(رجیستر پایه)، اغلب هنگام آدرس دهی داده ها در حافظه استفاده می شود.

ECX/CX/CH/CL – پیشخوان(رجیستر شمارش)، به عنوان شمارنده برای تعداد تکرارهای حلقه استفاده می شود.

EDX/DX/DH/DL – ثبت داده ها(رجیستر داده)، برای ذخیره داده های میانی استفاده می شود. در برخی تیم ها استفاده از آن اجباری است.

همه رجیسترها در این گروه امکان دسترسی به قسمت های "پایین" خود را می دهند. فقط قسمت های 16 و 8 بیتی پایینی این ثبات ها می توانند برای خودآدرس دهی استفاده شوند. 16 بیت بالای این ثبات ها به عنوان اشیاء مستقل در دسترس نیستند.

برای پشتیبانی از دستورات پردازش رشته ای که امکان پردازش متوالی زنجیره های عناصر با طول 32، 16 یا 8 بیت را فراهم می کند، از موارد زیر استفاده می شود:

ESI/SI (رجیستر فهرست منبع) – فهرست مطالب منبع. حاوی آدرس عنصر منبع فعلی است.

EDI/DI (رجیستر شاخص مقصد) – فهرست مطالب گیرنده(گیرنده). شامل آدرس فعلی در خط مقصد است.

در معماری ریزپردازنده، یک ساختار داده - پشته - در سطح سخت افزار و نرم افزار پشتیبانی می شود. دستورالعمل های ویژه و رجیسترهای ویژه ای برای کار با پشته وجود دارد. لازم به ذکر است که پشته به سمت آدرس های کوچکتر پر می شود.

ESP/SP (رجیستر نشانگر پشته) – ثبت نام اشاره گر پشته. شامل یک اشاره گر به بالای پشته در بخش پشته فعلی است.

EBP/BP (رجیستر نشانگر پایه) – ثبت اشاره گر پایه پشته. طراحی شده برای سازماندهی دسترسی تصادفی به داده ها در داخل پشته.

1.1.2. ثبت بخش ها

مدل نرم افزار ریزپردازنده شش عدد دارد ثبت بخش ها: CS، SS، DS، ES، GS، FS. وجود آنها به دلیل سازماندهی خاص و استفاده از رم توسط ریزپردازنده های اینتل است. سخت افزار ریزپردازنده سازمان ساختاری برنامه متشکل از بخش هابرای نشان دادن بخش های موجود در این لحظهثبت های بخش در نظر گرفته شده است. ریزپردازنده انواع بخش زیر را پشتیبانی می کند:

    بخش کد.حاوی دستورات برنامه است. برای دسترسی به این بخش، از ثبات CS (ثبت قطعه کد) استفاده کنید - ثبت کد بخش. این شامل آدرس بخش دستورالعمل ماشین است که ریزپردازنده به آن دسترسی دارد.

    بخش دادهحاوی داده های پردازش شده توسط برنامه است. برای دسترسی به این بخش، از ثبات DS (رجیستر قطعه داده) استفاده کنید - ثبت داده های بخش، که آدرس بخش داده برنامه فعلی را ذخیره می کند.

    بخش پشته.این بخش ناحیه ای از حافظه است که پشته نامیده می شود. ریزپردازنده پشته را طبق اصل سازماندهی می کند - اول "در" ، اول "خارج". برای دسترسی به پشته، از رجیستر SS (ثبت قطعه پشته) استفاده کنید - ثبت قطعه پشته، حاوی آدرس بخش پشته است.

    بخش داده های اضافیداده های پردازش شده را می توان در سه بخش داده اضافی قرار داد. به طور پیش فرض، داده ها در بخش داده در نظر گرفته می شوند. هنگام استفاده از بخش های داده اضافی، آدرس های آنها باید به صراحت با استفاده از پیشوندهای نادیده گرفتن بخش ویژه در دستور مشخص شود. آدرس‌های بخش‌های داده اضافی باید در رجیسترهای ES، GS، FS (ثبت‌کننده‌های بخش داده توسعه‌یافته) موجود باشد.

        کنترل و ثبت وضعیت

ریزپردازنده شامل چندین ثبات است که حاوی اطلاعاتی در مورد وضعیت خود ریزپردازنده و برنامه ای است که دستورات آن در حال حاضر در خط لوله بارگذاری شده است. این:

ثبت اشاره گر دستورالعمل EIP/IP.

    ثبت پرچم EFLAGS/FLAGS.

با استفاده از این ثبات ها می توانید اطلاعاتی در مورد نتایج اجرای دستور به دست آورید و بر وضعیت خود ریزپردازنده تأثیر بگذارید.

EIP/IP (رجیستر نشانگر دستورالعمل) – اشاره گر تیم ها. رجیستر EIP/IP دارای عرض 32 بیت یا 16 بیت است و شامل افست دستورالعمل بعدی است که باید نسبت به محتویات ثبات بخش CS در بخش دستورالعمل فعلی اجرا شود. این رجیستر مستقیماً در دسترس نیست، اما با استفاده از دستورالعمل های پرش قابل تغییر است.

EFLAGS/FLAGS (ثبت پرچم) – ثبت نام پرچم ها. اندازه بیت 32/16 بیت. تک تک بیت های این رجیستر هدف عملکردی خاصی دارند و پرچم نامیده می شوند. پرچم بیتی است که در صورت برآورده شدن شرایط، مقدار 1 ("مجموعه پرچم") و در غیر این صورت مقدار 0 ("پرچم پاک شد") را می گیرد. قسمت پایین این رجیستر کاملا شبیه رجیستر FLAGS برای i8086 است.

1.1.3 ثبت پرچم

ثبت پرچم 32 بیتی است و EFLAGS نام دارد (شکل 1). تک تک بیت های رجیستر دارای هدف عملکردی خاصی هستند و به آنها پرچم می گویند. به هر یک از آنها یک نام خاص (ZF، CF و غیره) اختصاص داده شده است. 16 بیت پایینی EFLAGS نشان دهنده ثبت پرچم 16 بیتی FLAGS است که هنگام اجرای برنامه های نوشته شده برای ریزپردازنده های i086 و i286 استفاده می شود.

Fig.1 ثبت پرچم

برخی از پرچم ها معمولاً پرچم های شرط نامیده می شوند. هنگامی که دستورات اجرا می شوند، آنها به طور خودکار تغییر می کنند و ویژگی های خاصی از نتیجه خود را ثبت می کنند (مثلاً اینکه آیا برابر با صفر است). پرچم های دیگر را پرچم های ایالتی می نامند. آنها از برنامه تغییر می کنند و بر رفتار بیشتر پردازنده تأثیر می گذارند (مثلاً وقفه ها را مسدود می کنند).

پرچم های وضعیت:

CF (حمل پرچم) - حمل پرچم. اگر هنگام جمع کردن اعداد صحیح، یک واحد حمل ظاهر شود که در شبکه بیتی "مناسب" نباشد، یا اگر هنگام تفریق اعداد بدون علامت، اولین آنها کمتر از دومی باشد، مقدار 1 را می گیرد. در دستورات shift، بیتی که خارج از شبکه بیت است وارد CF می شود. CF همچنین ویژگی‌های دستور ضرب را نشان می‌دهد.

OF (پرچم سرریز) - پرچم سرریز. اگر هنگام جمع یا تفریق اعداد صحیح علامت دار، نتیجه حاصل از مقدار مجاز در قدر مطلق فراتر رود، روی 1 تنظیم کنید (مانتیسا سرریز شد و به رقم علامت "بالا" رفت).

ZF (پرچم صفر) - پرچم صفر. اگر نتیجه دستور 0 باشد، 1 را تنظیم کنید.

SF (پرچم علامت) - پرچم امضا کردن. اگر یک عملیات روی اعداد علامت دار نتیجه منفی ایجاد کرد، روی 1 تنظیم کنید.

PF (پرچم برابری) - پرچم برابری. اگر نتیجه دستور بعدی دارای تعداد زوج باینری باشد، برابر با 1 است. معمولاً فقط برای عملیات I/O در نظر گرفته می شود.

AF (پرچم حمل کمکی) - پرچم حمل اضافی. ویژگی های انجام عملیات روی اعداد اعشاری باینری را رفع می کند.

پرچم های ایالتی:

DF (پرچم جهت) - پرچم جهت. جهت مشاهده خطوط را در دستورات خط تنظیم می کند: وقتی DF=0، خطوط "به جلو" (از ابتدا تا انتها) مشاهده می شوند، زمانی که DF=1 - در جهت مخالف.

IOPL (سطح امتیاز ورودی/خروجی) – سطح امتیاز I/O.در حالت حفاظت شده عملکرد ریزپردازنده برای کنترل دسترسی به دستورات I/O بسته به امتیاز کار استفاده می شود.

NT (وظیفه تودرتو) - پرچم تودرتو وظیفهدر حالت حفاظت شده عملکرد ریزپردازنده استفاده می شود تا این واقعیت را ثبت کند که یک وظیفه در داخل دیگری قرار دارد.

پرچم سیستم:

IF (پرچم وقفه) - پرچم قطع. وقتی IF=0 باشد، پردازشگر به وقفه های دریافتی پاسخ نمی دهد و وقتی IF=1، انسداد وقفه حذف می شود.

TF (پرچم دام) - پرچم ردیابی. هنگامی که TF=1، پس از اجرای هر دستور، پردازنده یک وقفه ایجاد می کند (شماره 1)، که می تواند هنگام اشکال زدایی برنامه برای ردیابی آن استفاده شود.

RF (پرچم رزومه) – پرچم رزومه. هنگام پردازش وقفه های ثبت اشکال زدایی استفاده می شود.

VM (حالت مجازی 8086) – پرچم مجازی 8086 1-پردازنده در حالت مجازی 8086 کار می کند. 0-پردازنده در حالت واقعی یا محافظت شده کار می کند.

AC (بررسی تراز) – پرچم کنترل ترازطراحی شده برای کنترل تراز در هنگام دسترسی به حافظه.

      سازماندهی حافظه

حافظه فیزیکی که ریزپردازنده به آن دسترسی دارد نامیده می شود رم (یا حافظه دسترسی تصادفی - رم). RAM زنجیره ای از بایت است که آدرس منحصر به فرد خود را دارد (شماره آن) که نامیده می شود فیزیکیمحدوده مقادیر آدرس فیزیکی از 0 تا 4 گیگابایت است. مکانیزم مدیریت حافظه کاملاً سخت افزاری است.

سخت افزار ریزپردازنده از چندین مدل استفاده از RAM پشتیبانی می کند:

    مدل تقسیم شده. در این مدل، حافظه برای برنامه‌ها به بخش‌های حافظه پیوسته (بخش) تقسیم می‌شود و خود برنامه فقط می‌تواند به داده‌هایی که در این بخش‌ها قرار دارند دسترسی داشته باشد.

    مدل صفحه. در این حالت RAM به عنوان مجموعه ای از بلوک ها با اندازه ثابت 4 کیلوبایت در نظر گرفته می شود. کاربرد اصلی این مدل مربوط به سازمان است حافظه مجازی، که به برنامه ها اجازه می دهد از فضای حافظه بیشتری نسبت به حافظه فیزیکی استفاده کنند. برای یک ریزپردازنده Pentium، اندازه حافظه مجازی ممکن می تواند به 4 ترابایت برسد.

استفاده و پیاده سازی این مدل ها به حالت عملکرد ریزپردازنده بستگی دارد:

    حالت آدرس واقعی (حالت واقعی).حالت مشابه عملکرد پردازنده i8086 است. برای عملکرد برنامه های توسعه یافته برای مدل های اولیه پردازنده ضروری است.

    حالت محافظت شده.حالت محافظت شده به شما امکان می دهد چند کار را انجام دهید پردازش اطلاعاتحفاظت از حافظه با استفاده از مکانیزم امتیاز چهار سطحی و سازماندهی صفحه بندی آن.

    حالت مجازی 8086.در این حالت اجرای چندین برنامه برای i8086 امکان پذیر می شود. در این مورد، برنامه های حالت واقعی می توانند کار کنند.

تقسیم بندی مکانیزم آدرس دهی است که وجود چندین فضای آدرس مستقل را تضمین می کند. سگمنت یک بلوک حافظه مستقل و با پشتیبانی سخت افزاری است.

هر برنامه به طور کلی می تواند از هر تعداد بخش تشکیل شده باشد، اما دسترسی مستقیم به سه بخش اصلی دارد: کد، داده و پشته - و از یک تا سه بخش داده اضافی. سیستم عامل بخش های برنامه را در RAM در آدرس های فیزیکی خاص قرار می دهد و سپس مقادیر این آدرس ها را در ثبات های مناسب قرار می دهد. در داخل یک سگمنت، برنامه به آدرس‌های مربوط به ابتدای بخش به صورت خطی دسترسی پیدا می‌کند، یعنی از آدرس 0 شروع می‌شود و به آدرسی برابر با اندازه قطعه ختم می‌شود. آدرس نسبی یا جانبداری،که ریزپردازنده برای دسترسی به داده های داخل یک قطعه استفاده می کند نامیده می شود تاثير گذار.

تشکیل یک آدرس فیزیکی در حالت واقعی

در حالت واقعی، دامنه تغییرات در آدرس فیزیکی از 0 تا 1 مگابایت است. حداکثر اندازه بخش 64 کیلوبایت است. هنگام تماس با یک خاص آدرس حقیقی RAM با آدرس ابتدای سگمنت و افست داخل سگمنت تعیین می شود. آدرس شروع بخش از ثبت بخش مربوطه گرفته شده است. در این حالت، ثبت بخش فقط حاوی 16 بیت مهم از آدرس فیزیکی ابتدای قطعه است. چهار بیت کم از دست رفته آدرس 20 بیتی با جابجایی مقدار ثبات بخش به چپ با 4 بیت به دست می آید. عملیات شیفت به صورت سخت افزاری انجام می شود. مقدار 20 بیتی حاصل، آدرس فیزیکی واقعی مربوط به ابتدای بخش است. به این معنا که آدرس فیزیکیبه عنوان یک جفت "segment:offset" مشخص می شود، که در آن "segment" 16 بیت اول آدرس شروع بخش حافظه است که سلول به آن تعلق دارد، و "offset" آدرس 16 بیتی این سلول است که از آن شمارش می شود. ابتدای این بخش حافظه (مقدار 16 * بخش +offset آدرس مطلق سلول را می دهد). برای مثال، اگر رجیستر CS مقدار 1234h را ذخیره کند، جفت آدرس 1234h:507h یک آدرس مطلق برابر با 16*1234h+507h =12340h+507h = 12847h تعریف می کند. چنین جفتی به عنوان یک کلمه دوگانه و (در مورد اعداد) به شکل "معکوس" نوشته می شود: کلمه اول شامل یک افست و دوم - یک بخش است و هر یک از این کلمات به نوبه خود در یک نشان داده می شود. فرم "معکوس" برای مثال، جفت 1234h:5678h به این صورت نوشته می شود:| 78 | 56| 34 | 12|.

این مکانیسم برای تولید یک آدرس فیزیکی امکان جابجایی نرم افزار را امکان پذیر می کند، یعنی مستقل از آدرس های بارگذاری خاص در RAM.

برنامه نویسی در سطح دستورالعمل ماشین حداقل سطحی است که می توان برنامه ها را در آن نوشت. سیستم دستورالعمل های ماشین باید برای اجرای اقدامات لازم با صدور دستورالعمل ها به سخت افزار کامپیوتر کافی باشد.

هر دستور ماشین از دو بخش تشکیل شده است:

  • عملیاتی - تعیین "چه باید کرد"؛
  • عملوند - تعریف اشیاء پردازشی، "با چه باید کرد".

دستور ماشین ریزپردازنده که به زبان اسمبلی نوشته شده است، یک خط با شکل نحوی زیر است:

برچسب فرمان/دستورالعمل عملوند(های) ;نظرات

در این حالت، فیلد مورد نیاز در خط یک فرمان یا دستورالعمل است.

برچسب، فرمان/دستورالعمل و عملوندها (در صورت وجود) با حداقل یک فاصله یا کاراکتر تب از هم جدا می شوند.

اگر دستور یا دستوری باید در خط بعدی ادامه یابد، از کاراکتر بک اسلش استفاده می شود: \.

به طور پیش فرض، زبان اسمبلی هنگام نوشتن دستورات یا دستورات، حروف بزرگ و کوچک را تشخیص نمی دهد.

خطوط نمونه کد:

db 1 بشمار نام، دستورالعمل، یک عملوند
mov eax,0 ؛ فرمان، دو عملوند
cbw ; تیم

برچسب ها

برچسب در زبان اسمبلی می تواند شامل نمادهای زیر باشد:

  • تمام حروف الفبای لاتین؛
  • اعداد از 0 تا 9؛
  • کاراکترهای ویژه: _، @، $، ?.

نقطه می تواند به عنوان اولین کاراکتر برچسب استفاده شود، اما برخی از کامپایلرها استفاده از این کاراکتر را توصیه نمی کنند. نام Assembler رزرو شده (دستورالعمل ها، عملگرها، نام دستورات) را نمی توان به عنوان برچسب استفاده کرد.

اولین کاراکتر در برچسب باید یک حرف یا کاراکتر خاص (اما نه یک عدد) باشد. حداکثر طولبرچسب ها - 31 کاراکتر. تمام برچسب‌هایی که روی خطی نوشته می‌شوند که حاوی دستورالعمل اسمبلر نیست، باید با دونقطه پایان یابد:

تیم ها

تیم به مترجم می گوید که ریزپردازنده چه عملی را باید انجام دهد. در یک بخش داده، یک فرمان (یا دستورالعمل) یک فیلد، فضای کاری یا ثابت را تعریف می کند. در بخش کد، یک فرمان یک عمل را مشخص می کند، مانند جابجایی (mov) یا اضافه کردن (افزودن).

دستورالعمل ها

اسمبلر تعدادی اپراتور دارد که به شما امکان می دهد روند مونتاژ و لیست را کنترل کنید. این عملگرها نامیده می شوند بخشنامه ها . آنها فقط در طول فرآیند مونتاژ برنامه عمل می کنند و بر خلاف دستورات، کد ماشین تولید نمی کنند.

عملوندها

عملوند – شیئی که دستور ماشین یا دستور زبان برنامه نویسی روی آن اجرا می شود.
یک دستورالعمل ممکن است یک یا دو عملوند داشته باشد یا اصلاً عملوند نداشته باشد. تعداد عملوندها به طور ضمنی توسط کد دستورالعمل مشخص شده است.
مثال ها:

  • بدون عملوند ret ;بازگشت
  • یک عملوند inc ecx؛ افزایش ecx
  • دو عملوند eax را اضافه می کنند، 12، 12 را به eax اضافه می کنند

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

عملوندها می توانند باشند

  • شناسه ها؛
  • رشته‌هایی از کاراکترها که در گیومه‌های تک یا دوتایی محصور شده‌اند.
  • اعداد صحیح در سیستم های اعداد باینری، اکتال، اعشاری یا هگزادسیمال.
شناسه ها

شناسه ها - دنباله ای از کاراکترهای معتبر که برای نشان دادن اشیاء برنامه مانند کدهای عملیات، نام متغیرها و نام برچسب ها استفاده می شود.

قوانین ثبت شناسه ها

  • شناسه می تواند از یک یا چند کاراکتر تشکیل شده باشد.
  • به عنوان نماد می توانید از حروف الفبای لاتین، اعداد و برخی کاراکترهای خاص استفاده کنید: _، ?، $، @.
  • یک شناسه نمی تواند با یک کاراکتر رقمی شروع شود.
  • طول شناسه می تواند تا 255 کاراکتر باشد.
  • مترجم 32 کاراکتر اول شناسه را می پذیرد و بقیه را نادیده می گیرد.
نظرات

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

ساختار برنامه مونتاژ

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

نمونه‌ای از برنامه «هیچ کاری نکن» در زبان اسمبلی:

686P
.MODEL FLAT STDCALL
.داده ها
کد
شروع:

RET
پایان شروع

این برنامه فقط شامل یک دستور ریزپردازنده است. این دستور RET است. این تضمین می کند که برنامه به درستی خاتمه می یابد. به طور کلی از این دستور برای خروج از یک رویه استفاده می شود.
بقیه برنامه مربوط به عملکرد مترجم است.
0.686P - دستورات حالت محافظت شده Pentium 6 (Pentium II) مجاز است. این دستورالعمل مجموعه پشتیبانی شده از دستورالعمل های اسمبلر را انتخاب می کند که مدل پردازنده را نشان می دهد. حرف P که در انتهای دستورالعمل مشخص شده است به مترجم اطلاع می دهد که پردازنده در حالت محافظت شده کار می کند.
.MODEL FLAT, stdcall - مدل flat memory. این مدل حافظه در اتاق عمل استفاده می شود سیستم ویندوز. stdcall
.DATA یک بخش برنامه حاوی داده است.
.CODE یک بلوک برنامه حاوی کد است.
START - برچسب. در اسمبلر، تگ ها نقش زیادی دارند که نمی توان در مورد زبان های سطح بالا مدرن گفت.
END START - پایان برنامه و پیامی به مترجم مبنی بر اینکه اجرای برنامه باید با برچسب START آغاز شود.
هر ماژول باید حاوی یک دستورالعمل END برای علامت گذاری پایان باشد کد منبعبرنامه ها. تمام خطوطی که از دستورالعمل END پیروی می کنند نادیده گرفته می شوند. اگر دستور END را حذف کنید، یک خطا ایجاد می شود.
برچسب مشخص شده پس از دستورالعمل END نام ماژول اصلی را که اجرای برنامه از آن آغاز می شود به مترجم می گوید. اگر برنامه شامل یک ماژول باشد، برچسب بعد از دستورالعمل END را می توان حذف کرد.




بالا