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

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

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

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

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

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

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

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

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

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

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

فرمت استاندارد برای خطوط یک برنامه که در اسمبلر توضیح داده شده است.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

آدرس دهی مستقیم: آدرس موثر مستقیماً توسط فیلد افست دستورالعمل ماشین تعیین می شود که اندازه آن می تواند 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 یا آدرس آنها در هر سیستم شماره (به عنوان مثال، 10V - آدرس ثبت نام

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

● شناسه ها،

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

اولین حروف B

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

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

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

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

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

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

● عبارات،

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

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

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

در نسخه زبان

استفاده شده

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

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

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

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

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

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

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

برای نوع

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

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

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

به ترتیب.

فیلد نظرات

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

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

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

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

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

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

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

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

برای خانواده

.

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

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

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

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

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

تعریف کلان

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

یک ماکرو ساختار زیر را دارد:

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

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

● سرصفحه

ماکرو حاوی نام

شبه فرمان

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

● نقطه چین بدنکلان؛

● تیم

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

تعاریف کلان

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

اولین گذر.

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

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

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

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

جدول نمادها

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

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

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

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

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

جدول بخشنامه ها

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

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

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

پاس دوم

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

تلفیقی برنامه‌ها برای حل حیاتی‌ترین وظایف (برنامه‌ای که به زبان ماشین‌گرا کامپایل می‌شود معمولاً کارآمدتر است - 30 تا 60 درصد کوتاه‌تر و سریع‌تر از برنامه‌هایی که در نتیجه ترجمه از زبان‌های سطح بالا به دست می‌آیند)

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

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

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

اعداد فقط اعداد صحیح هستند. تمیز دادن:

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

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

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

RAM، رجیسترها، نمایش داده ها

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

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

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

مدل برنامه MPS مطابق شکل 1

حافظه پورت MP

اس ز AC پ سی

تصویر 1

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

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

B، C، D، E، H، L- رجیسترهای هدف عمومی 8 بیتی (RON). حافظه درونینماینده مجلس برای ذخیره اطلاعات پردازش شده و همچنین نتایج عملیات طراحی شده است. هنگام پردازش کلمات 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 افزایش می یابد.

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

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

0В00 - 0ВВ0 - منطقه آدرس برای ضبط داده ها. (رم).

0BB0 آدرس شروع پشته است. (رم).

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

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

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

فرمت داده

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

D7 D6 D5 D4 D3 D2 D1 D0

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

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

فرمت فرمان

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

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

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

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

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

شکل 4

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

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


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

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

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

فوری؛

ثبت نام؛

غیر مستقیم

پشته.

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

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

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

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

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

سیستم فرمان

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

گروه های زیر از دستورات وجود دارد:

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

حسابی؛

بازی فکری;

دستورات پرش؛

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


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

سمبل کاهش
ADDR آدرس 16 بیتی
داده ها داده 8 بیتی
داده 16 داده 16 بیتی
بندر آدرس ورودی/خروجی 8 بیتی (دستگاه های ورودی/خروجی)
BYTE 2 بایت فرمان دوم
BYTE 3 بایت فرمان سوم
R، R1، R2 یکی از رجیسترها: A, B, C, D, E, H, L
RP یکی از جفت های ثبت: B - یک جفت هواپیما را تنظیم می کند. D - یک جفت DE را تنظیم می کند. H - یک جفت HL را مشخص می کند
RH اولین ثبت جفت
RL ثبت دوم جفت
Λ ضرب بولی
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 (رجیستر اکومولاتور) - باتری. در ضرب و تقسیم، در عملیات I/O و در برخی عملیات روی رشته ها استفاده می شود.

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 (رجیستر قطعه پشته) استفاده می شود - ثبت قطعه پشته A حاوی آدرس بخش پشته است.

    بخش داده های اضافیداده هایی که باید پردازش شوند می توانند در سه بخش داده اضافی باشند. به طور پیش فرض، داده ها در بخش داده در نظر گرفته می شوند. هنگام استفاده از بخش‌های داده اضافی، آدرس‌های آنها باید با استفاده از پیشوندهای بازتعریف بخش خاص در دستور مشخص شود. آدرس‌های بخش‌های داده اضافی باید در رجیسترهای 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 نشان دهنده ثبات FLAGS 16 بیتی است که هنگام اجرای برنامه های نوشته شده برای ریزپردازنده i086 و i286 استفاده می شود.

شکل 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 آدرس مطلق سلول را می دهد). برای مثال، اگر مقدار 1234h در ثبات CS ذخیره شود، جفت آدرس 1234h:507h یک آدرس مطلق برابر با 16*1234h+507h =12340h+507h = 12847h تعریف می کند. چنین جفتی به عنوان یک کلمه دوتایی و (در مورد اعداد) به شکل "معکوس" نوشته می شود: کلمه اول شامل افست و دوم - بخش است که هر یک از این کلمات به نوبه خود در "معکوس" نشان داده می شود. فرم. برای مثال، جفت 1234h:5678h به این صورت نوشته می شود:| 78 | 56| 34 | 12|.

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

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

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

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

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

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

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

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

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

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

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

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

برچسب ها

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

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

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

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

تیم ها

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

بخشنامه ها

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

عملوندها

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

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

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

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

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

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

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

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

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

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

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

مثالی از یک برنامه "doing nothing" در زبان اسمبلی:

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

RET
پایان شروع

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




بالا