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

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

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

l انجام عملیات حسابی (ADD و ADC - جمع و جمع با انتقال، SUB و SBB - تفریق و تفریق با قرض، MUL و IMUL - ضرب بدون علامت و علامت، DIV و IDIV - تقسیم بدون علامت و علامت، CMP - مقایسه و غیره) ;

l انجام عملیات منطقی (OR، AND، NOT، XOR، TEST، و غیره)؛

l انتقال داده (MOV - ارسال، XCHG - تبادل، IN - ورود به ریزپردازنده، OUT - خروجی از ریزپردازنده و غیره)؛

l انتقال کنترل (شاخه های برنامه: JMP - شاخه بدون قید و شرط، CALL - فراخوانی رویه، RET - بازگشت از رویه، J * - شاخه شرطی، LOOP - کنترل حلقه و غیره)؛

l پردازش رشته های کاراکتر (MOVS - انتقال، CMPS - مقایسه، LODS - دانلود، SCAS - اسکن. این دستورات معمولا با پیشوند (تغییر کننده تکرار) REP استفاده می شوند.

l قطع برنامه (INT - وقفه نرم افزار، INTO - وقفه شرطی در صورت سرریز، IRET - بازگشت از وقفه).

l کنترل ریزپردازنده (ST * و CL * - تنظیم و پاک کردن پرچم ها، HLT - توقف، WAIT - انتظار، NOP - بیکار و غیره).

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

دستورات انتقال داده

l MOV dst، src - انتقال داده (حرکت - انتقال از src به dst).

انتقال: یک بایت (اگر src و dst در قالب بایت باشند) یا یک کلمه (اگر src و dst در قالب word هستند) بین ثبات ها یا بین ثبات و حافظه و همچنین یک مقدار فوری را به یک ثبات یا حافظه می نویسد.

عملوندهای dst و src باید در قالب بایت یا کلمه یکسان باشند.

Src می تواند از نوع: r (رجیستر) - ثبت، m (حافظه) - حافظه، i (امپدانس) - مقدار فوری. Dst می تواند از نوع r, m باشد. شما نمی توانید از عملوندهای زیر در یک دستور استفاده کنید: rsegm همراه با i; دو عملوند از نوع m و دو عملوند از نوع rsegm). عملوند i همچنین می تواند یک عبارت ساده باشد:

mov AX, (152 + 101B) / 15

عبارت فقط در حین ترجمه ارزیابی می شود. پرچم ها را تغییر نمی دهد.

l PUSH src - هل دادن یک کلمه روی پشته (فشار - فشار از طریق؛ از src به پشته فشار دهید). محتویات src را به بالای پشته فشار می دهد - هر ثبات 16 بیتی (از جمله قطعات قطعه) یا دو مکان حافظه حاوی یک کلمه 16 بیتی. پرچم ها تغییر نمی کنند.

l POP dst - یک کلمه را از پشته بریزید (pop - pop؛ خواندن از پشته به dst). یک کلمه از بالای پشته خارج می شود و آن را در dst قرار می دهد - هر ثبات 16 بیتی (از جمله بخش) یا دو مکان حافظه. پرچم ها تغییر نمی کنند.

معرفی.

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

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

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

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

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

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

ویژگی های اصلی اسمبلر عبارتند از:

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

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

منها کردن (

ضرب (

بخش ها (

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

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

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

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

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

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

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

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

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

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

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

فیلد برچسب.

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

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

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

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

در برخی از نسخه‌های زبان اسمبلی، دونقطه تنها پس از برچسب‌های دستوری قرار می‌گیرد، اما نه پس از برچسب‌های داده، و طول برچسب را می‌توان به ۶ یا ۸ کاراکتر محدود کرد.

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

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

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

یادداشت برای بارگیری رجیستر از حافظه انتخاب شده است

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

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

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

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

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

فیلد عملوند.

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

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

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

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

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

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

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

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

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

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

● شناسه ها،

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

اولین حروف B،

H; برای یک جفت انباشتگر و ثبت علائم -

; برای شمارنده فرمان -

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

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

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

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

● عبارات،

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

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

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

در نسخه زبان

استفاده شده توسط

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

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

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

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

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

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

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

برای نوع

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

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

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

به ترتیب.

فیلد نظرات

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

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

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

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

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

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

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

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

برای خانواده

.

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

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

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

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

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

تعریف کلان

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

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

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

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

● عنوان

یک ماکرو که شامل یک نام است

شبه فرمان

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

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

● تیم

پایان ها

ماکروها

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

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

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

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

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

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

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

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

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

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

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

ماکروهای پارامتری شده

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

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

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

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

برنامه 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 دارد.

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

اولین گذر.

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

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

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

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

جدول نام نمادین

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

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

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

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

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

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

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

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

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

پاس دوم

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

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

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

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

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

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

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

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

مبحث 1.4 یادگاری اسمبلر. ساختار و فرمت دستورات انواع آدرس دهی مجموعه دستورات ریزپردازنده

طرح:

1 زبان اسمبلی مفاهیم اساسی

2 نمادهای زبان اسمبلی

3 انواع دستورات اسمبلر

4 بخشنامه مجمع

5 مجموعه دستورالعمل پردازنده

1 iزبان اسمبلی. مفاهیم اساسی

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

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

جملات اسمبلی چهار نوع هستند:

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

2) ماکروها -جملات متن برنامه که به روشی خاص شکل گرفته اند، در حین پخش با جملات دیگری جایگزین می شوند.

3) بخشنامه ها،که دستورالعمل هایی برای مترجم اسمبلر برای انجام برخی اقدامات است. دستورالعمل ها هیچ آنالوگ در نمایندگی ماشین ندارند.

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

­ ساختار یک برنامه اسمبلی نحو اسمبلر.

جملاتی که برنامه را تشکیل می‌دهند می‌توانند یک ساختار نحوی مربوط به یک فرمان، ماکرو، دستورالعمل یا نظر باشند. برای اینکه مترجم اسمبلر آنها را تشخیص دهد، باید طبق قوانین نحوی خاصی شکل بگیرند. بهترین راه برای انجام این کار استفاده از یک توصیف رسمی از نحو زبان مانند قوانین دستور زبان است. رایج ترین روش ها برای توصیف یک زبان برنامه نویسی مانند این - نمودارهای نحویو فرم های توسعه یافته Backus-Naur.برای استفاده عملی راحت تر است نمودارهای نحویبرای مثال، سینتکس جملات اسمبلر را می توان با استفاده از نمودارهای نحوی که در شکل های 10، 11، 12 زیر نشان داده شده است، توصیف کرد.

شکل 10 - قالب جمله اسمبلی


­ شکل 11 - فرمت دستورالعمل ها

­ شکل 12 - فرمت دستورات و ماکروها

در این ارقام:

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

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

­ Opcode (COP) و دستورالعمل - آنها نامهای یادگاری دستورالعمل ماشین مربوطه، فرمان ماکرو یا دستورالعمل مترجم هستند.

­ عملوندها -بخش‌هایی از دستور، ماکرو یا دستور اسمبلر که اشیاء مورد دستکاری را تعیین می‌کند. عملوندهای اسمبلر با عباراتی با ثابت های عددی و متنی، برچسب ها و شناسه های متغیر با استفاده از علائم عملیات و برخی کلمات رزرو شده توصیف می شوند.

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

­ 2 نمادهای زبان اسمبلی

کاراکترهای مجاز هنگام نوشتن متن برنامه عبارتند از:

1) تمام حروف لاتین: A-Z,a-z... در این حالت، حروف بزرگ و کوچک معادل در نظر گرفته می شوند.

2) اعداد از 0 قبل از 9 ;

3) نشانه ها ? , @ , $ , _ , & ;

4) جداکننده ها , . () < > { } + / * % ! " " ? = # ^ .

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

واژگانهستند:

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

2) رشته های کاراکتر - دنباله ای از شخصیت های محصور در نقل قول های تک یا دو.

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

4) اعداد اعشاری برای شناسایی خود نیازی به علامت اضافی ندارند، برای مثال 25 یا 139. برای شناسایی در کد منبع برنامه اعداد باینریلازم است پس از ثبت صفرها و یک های تشکیل دهنده آنها، لاتین را قرار دهید. ب” برای مثال 10010101 ب.

5) اعداد هگزادسیمال وقتی نوشته می شوند قراردادهای بیشتری دارند:

اول، آنها از اعداد تشکیل شده اند 0...9 ، حروف کوچک و بزرگ الفبای لاتین آ,ب, ج,د,ه,fیا آ,ب,سی,دی,E,اف.

ثانیاً، ممکن است مترجم در تشخیص اعداد هگزا دسیمال مشکل داشته باشد، زیرا آنها می توانند فقط از ارقام 0 ... 9 (مثلاً 190845) تشکیل شده باشند یا با یک حرف الفبای لاتین شروع شوند (به عنوان مثال، ef15). برای اینکه به مترجم "توضیح" دهد که یک نشانه داده شده یک عدد اعشاری یا یک شناسه نیست، برنامه نویس باید یک عدد هگزادسیمال را به روشی خاص انتخاب کند. برای انجام این کار، در انتهای دنباله ارقام هگزادسیمال که یک عدد هگزادسیمال را تشکیل می دهند، حرف لاتین را بنویسید. ساعت". این یک پیش نیاز است. اگر یک عدد هگزادسیمال با یک حرف شروع شود، در مقابل آن یک صفر اول نوشته می شود: 0 ef15 ساعت

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

امکان انجام طبقه بندی عملوندهای زیر وجود دارد:

­ عملوندهای ثابت یا فوری؛

­ عملوندهای آدرس

­ عملوندهای متحرک؛

شمارنده آدرس

­ عملوند ثبت؛

­ عملوندهای پایه و شاخص؛

­ عملوندهای ساختاری؛

سوابق.

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

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

­ 3 انواع دستورات اسمبلر

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

­ عملگرهای حسابی؛

­ اپراتورهای شیفت؛

­ عملگرهای مقایسه؛

­ عملگرهای منطقی؛

­ عملگر شاخص؛

­ تایپ override operator;

­ عملگر تعریف مجدد بخش؛

­ عملگر نامگذاری نوع ساختار؛

­ عملگر برای بدست آوردن جزء سگمنت آدرس عبارت.

­ عملگر برای بدست آوردن افست یک عبارت.

1 دستورالعمل های اسمبلر

­ دستورالعمل های اسمبلر عبارتند از:

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

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

­ با یک بخش کد؛

­ با یک بخش پشته؛

­ با یک بخش داده؛

­ با سه بخش داده اضافی.

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


­ شکل 13 - توصیف نحوی یک قطعه در اسمبلر

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

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

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

­ دستورالعمل هایی برای خروجی به لیست فایل های موجود.

­ دستورالعمل های خروجی بلوک های مونتاژ شرطی؛

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

­ دستورالعمل هایی برای خروجی اطلاعات در مورد ارجاعات متقابل به فهرست؛

­ دستورالعمل هایی برای تغییر قالب فهرست

2 مجموعه دستورات پردازنده

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

بیایید گروه های اصلی تیم ها را در نظر بگیریم.

­ شکل 14 - طبقه بندی دستورالعمل های اسمبلر

تیم ها عبارتند از:

1 دستورات انتقال داده این دستورات جایگاه بسیار مهمی را در مجموعه دستورات هر پردازنده ای اشغال می کنند. آنها عملکردهای اساسی زیر را انجام می دهند:

­ ذخیره محتویات رجیسترهای داخلی پردازنده در حافظه؛

­ کپی کردن محتوا از یک ناحیه از حافظه به قسمت دیگر؛

­ نوشتن در دستگاه های I / O و خواندن از دستگاه های I / O.

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

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

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

­ دستورات عملیات نقطه ثابت (جمع، تفریق، ضرب، تقسیم)؛

­ دستورات ممیز شناور (جمع، تفریق، ضرب، تقسیم)؛

­ دستورات پاکسازی؛

­ دستورات افزایش و کاهش؛

­ دستور مقایسه

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

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

5 دستور افزایش (یک افزایش) و کاهش

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

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

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

­ منطقی AND، منطقی OR، مدول اضافه 2 (Exclusive OR);

­ تغییرات منطقی، حسابی و چرخه ای؛

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

­ تنظیم و پاک کردن بیت ها (پرچم ها) ثبت وضعیت پردازنده ( PSW).

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

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

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

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

­ دستورات پرش بدون قید و شرط؛

­ دستورات پرش شرطی

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

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

دستورالعمل های پرش مشروط همیشه باعث پرش نمی شود، اما فقط زمانی که شرایط مشخص شده برآورده شود. این شرایط معمولاً مقادیر پرچم‌ها در ثبت وضعیت پردازنده هستند ( PSW ). یعنی شرط انتقال نتیجه عملیات قبلی است که مقادیر پرچم ها را تغییر می دهد. در مجموع می توان از 4 تا 16 چنین شرایط پرش وجود داشته باشد. چند نمونه از دستورات پرش شرطی:

­ انتقال اگر برابر با صفر باشد.

­ انتقال اگر برابر با صفر نباشد.

­ پرش در صورت سرریز شدن؛

­ پرش اگر سرریز وجود ندارد.

­ انتقال اگر بزرگتر از صفر باشد.

­ پرش اگر کمتر یا مساوی صفر باشد.

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

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

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

نتیجه:

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

هنگام نوشتن متن برنامه، تمام حروف لاتین کاراکترهای معتبر هستند: A-Z,a-z... در این حالت، حروف بزرگ و کوچک معادل در نظر گرفته می شوند. ارقام از 0 قبل از 9 ; نشانه ها ? , @ , $ , _ , & ; جداکننده ها , . () < > { } + / * % ! " " ? = # ^ .

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

سیستم فرماندهی به 8 گروه اصلی تقسیم می شود.

­ سوالات کنترلی:

1 زبان اسمبلی چیست؟

2 برای نوشتن دستورات در زبان اسمبلی از چه نمادهایی می توان استفاده کرد؟

3 برچسب ها و هدف آنها چیست؟

4 ساختار دستورات اسمبلر را توضیح دهید.

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

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

ساختار دستور زبان اسمبلی یک دستورالعمل زبان اسمبلی به مترجم می گوید که ریزپردازنده چه اقداماتی را باید انجام دهد. دستورالعمل های اسمبلر پارامترهایی هستند که در متن برنامه مشخص شده اند و بر فرآیند اسمبلی یا ویژگی های فایل خروجی تأثیر می گذارند. عملوند مقدار اولیه داده ها (در بخش داده) یا عناصری را که باید با دستور (در بخش کد) اعمال شوند، تعریف می کند. یک دستورالعمل می تواند دارای یک یا دو عملوند یا بدون عملوند باشد. تعداد عملوندها به طور ضمنی توسط کد دستوری مشخص می شود. اگر دستور یا دستوری باید در خط بعدی ادامه یابد، از کاراکتر بک اسلش استفاده می شود: "". به طور پیش فرض، اسمبلر در نوشتن دستورات و دستورات، حروف بزرگ و کوچک را تشخیص نمی دهد. نمونه هایی از دستورات و دستورات تعداد db 1; نام، دستورالعمل، یک عملوند mov eax، 0; دستور، دو عملوند

شناسه‌ها دنباله‌ای از کاراکترهای معتبر هستند که برای نشان دادن نام متغیرها و نام‌های برچسب استفاده می‌شوند. شناسه می تواند شامل یک یا چند کاراکتر زیر باشد: تمام حروف الفبای لاتین. اعداد از 0 تا 9؛ کاراکترهای خاص: _، @، $،؟ ... یک نقطه می تواند به عنوان اولین کاراکتر برچسب استفاده شود. نام اسمبلرهای رزرو شده (دستورالعمل ها، اپراتورها، نام دستورات) نمی توانند به عنوان شناسه استفاده شوند. اولین کاراکتر شناسه باید یک حرف یا کاراکتر خاص باشد. حداکثر طول شناسه 255 کاراکتر است، اما مترجم 32 کاراکتر اول را می پذیرد و بقیه را نادیده می گیرد. تمام برچسب هایی که در خطی نوشته می شوند که حاوی دستورالعمل اسمبلر نیست باید با علامت ":" پایان یابد. برچسب، فرمان (دستورالعمل) و عملوند لازم نیست در موقعیت خاصی در رشته شروع شوند. توصیه می شود برای خوانایی بهتر برنامه، آنها را در یک ستون یادداشت کنید.

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

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

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

مدل های حافظه قبل از اعلام بخش ها، باید مدل حافظه را با استفاده از یک دستورالعمل مشخص کنید. MODEL modifier memory_model, call_convention, OS_type, stack_parameter مدل های حافظه پایه زبان اسمبلی: مدل حافظه کد آدرس دهی داده ها آدرس دهی سیستم عامل کد و درهم آمیختن داده ها TINY NEAR MS-DOS مجاز SMALL NEAR NEAR MS-DOS, Windows No MEDIUM MS-DOS NEAR Windows بدون کامپکت در نزدیکی دور MS-DOS، ویندوز بدون MS-DOS دور بزرگ، ویندوز بدون MS-DOS بسیار دور، ویندوز بدون NEAR Windows 2000، Windows XP، Windows Allowed FLAT NEAR NT،

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

مدل های حافظه مدل مسطح یک پیکربندی برنامه غیربخشی را در نظر می گیرد و فقط در سیستم عامل های 32 بیتی استفاده می شود. این مدل شبیه مدل کوچک است زیرا داده ها و کدها در یک بخش 32 بیتی قرار می گیرند. برای توسعه یک برنامه برای مدل تخت قبل از دستورالعمل. مسطح مدل یکی از بخشنامه ها باید قرار گیرد:. 386،. 486،. 586 یا. 686. انتخاب دستورالعمل انتخاب پردازنده مجموعه دستورالعمل های موجود هنگام نوشتن برنامه ها را تعیین می کند. حرف p بعد از دستور انتخاب پردازنده، حالت محافظت شده کار را نشان می دهد. آدرس دهی داده ها و کد نزدیک است و همه آدرس ها و نشانگرها 32 بیتی هستند.

مدل های حافظه MODEL modifier memory_model, call_convention, OS_type, stack_parameter پارامتر اصلاح کننده برای تعریف انواع سگمنت ها استفاده می شود و می تواند مقادیر زیر را بگیرد: استفاده از 16 (بخش های مدل انتخاب شده به عنوان 16 بیت استفاده می شود) استفاده از 32 (بخش های مدل انتخاب شده به عنوان 32 بیتی استفاده می شود). پارامتر call_convention برای تعیین نحوه ارسال پارامترها هنگام فراخوانی یک رویه از زبان‌های دیگر، از جمله زبان‌های سطح بالا (C ++، Pascal) استفاده می‌شود. پارامتر می تواند مقادیر زیر را بگیرد: C، BASIC، FORTRAN، PASCAL، SYSCALL، STDCALL.

مدل های حافظه MODEL modifier memory_model، call_convention، os_type، stack_parameter OS_type پیش فرض OS_DOS است و در حال حاضر تنها مقدار پشتیبانی شده برای این پارامتر است. Stack_parameter روی NEARSTACK تنظیم شده است (رجیستر SS DS است، مناطق داده و پشته در یک بخش فیزیکی قرار دارند) FARSTACK (رجیستر SS با DS برابر نیست، مناطق داده و پشته در بخش های فیزیکی مختلف قرار دارند). پیش فرض NEARSTACK است.

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

نمونه ای از برنامه "هیچ کاری انجام ندادن". 686 P. MODEL FLAT، STDCALL. داده ها. کد شروع: شروع مجدد پایان. DATA یک بخش برنامه حاوی داده است. این برنامه از پشته استفاده نمی کند، بنابراین. STACK وجود ندارد. ... CODE - بخشی از برنامه حاوی کد. START یک برچسب است. END START - پایان برنامه و پیامی به کامپایلر مبنی بر اینکه برنامه باید از برچسب START شروع شود. هر برنامه باید حاوی یک دستورالعمل END باشد تا پایان کد منبع برنامه را مشخص کند. تمام خطوطی که دستور END را دنبال می کنند نادیده گرفته می شوند. برچسب مشخص شده بعد از دستورالعمل END نام ماژول اصلی را که برنامه از آن شروع به اجرا می کند به مترجم می گوید. اگر برنامه حاوی یک ماژول باشد، برچسب بعد از دستورالعمل END را می توان حذف کرد.

مترجم زبان اسمبلی مترجم یک برنامه یا ابزار فنی است که برنامه ای را در یکی از زبان های برنامه نویسی به برنامه ای در زبان مقصد، به نام کد شی، تبدیل می کند. علاوه بر پشتیبانی از یادداشت دستورالعمل‌های ماشین، هر مترجم مجموعه‌ای از دستورالعمل‌ها و ابزارهای کلان خود را دارد که اغلب با هیچ چیز ناسازگار هستند. انواع اصلی مترجم های زبان اسمبلی: MASM (مجموعه کننده مایکروسافت)، TASM (مونتاژ کننده بورلند توربو)، FASM (مبلر مسطح) - یک اسمبلر چند گذری رایگان نوشته شده توسط توماس گریشار (لهستانی)، NASM (مونتاژ کننده شبکه) - یک اسمبلر رایگان. برای Intel x معماری 86، توسط Simon Tatham با همکاری جولیان هال ایجاد شد و در حال حاضر توسط یک تیم توسعه کوچک در Source در حال توسعه است. ساختن. خالص.

Src = "https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt = "(! LANG: پخش برنامه به Microsoft Visual Studio 2005 1) با انتخاب File-> New-> یک پروژه ایجاد کنید پروژه و"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src = "https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt = "(! LANG: پخش برنامه به Microsoft Visual Studio 2005 2) در درخت پروژه (View-> Solution Explorer) اضافه کردن"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

ترجمه برنامه به Microsoft Visual Studio 2005 3) نوع فایل Code C ++ را انتخاب کنید، اما نام آن را با پسوند مشخص کنید. asm:

ترجمه برنامه به Microsoft Visual Studio 2005 5) گزینه های کامپایلر را تنظیم کنید. روی منوی Custom Build Rules ... در فایل پروژه کلیک راست کنید.

برنامه را به Microsoft Visual Studio 2005 ترجمه کنید و در پنجره ظاهر شده Microsoft Macro Assembler را انتخاب کنید.

ترجمه برنامه در مایکروسافت ویژوال استودیو 2005 با کلیک راست در hello بررسی کنید. asm از درخت پروژه از منوی Properties و General-> Tool: Microsoft Macro Assembler را تنظیم کنید.

Src = "https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt = "(! LANG: پخش برنامه به Microsoft Visual Studio 2005 6) فایل را با انتخاب Build-> Build hello کامپایل کنید. Prj."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

برنامه نویسی در سیستم عامل ویندوز برنامه نویسی در سیستم عامل ویندوز بر اساس استفاده از توابع API (Application Program Interface) است. تعداد آنها به 2000 می رسد. برنامه ویندوز عمدتاً از چنین تماس هایی تشکیل شده است. تمام تعاملات با دستگاه های خارجی و منابع سیستم عامل معمولاً از طریق چنین عملکردهایی انجام می شود. سیستم عامل ویندوز از مدل حافظه تخت استفاده می کند. آدرس هر مکان حافظه توسط محتویات یک ثبات 32 بیتی تعیین می شود. 3 نوع ساختار برنامه برای ویندوز وجود دارد: گفتگو (پنجره اصلی - گفتگو)، ساختار کنسول یا بدون پنجره، ساختار کلاسیک (پنجره، وایرفریم).

فراخوانی توابع API ویندوز در فایل راهنما، هر تابع API به صورت نوع function_name (FA 1، FA 2، FA 3) نمایش داده می شود. نوع - نوع مقدار بازگشتی. ФАх - لیستی از آرگومان های رسمی به ترتیبی که ظاهر می شوند. به عنوان مثال، int Message. جعبه (HWND h. Wnd، LPCTSTR lp. Text، LPCTSTR lp. Caption، UINT u. Type); این عملکرد یک پنجره با یک پیام و یک دکمه خروج (یا دکمه ها) نمایش می دهد. معنی پارامترها: h. Wnd - دسته به پنجره ای که در آن پنجره پیام ظاهر می شود، lp. متن - متنی که در پنجره ظاهر می شود، lp. عنوان - متن در عنوان پنجره، u. نوع - نوع پنجره، به ویژه، شما می توانید تعداد دکمه های خروج را تعریف کنید.

فراخوانی توابع Windows API int Message. جعبه (HWND h. Wnd، LPCTSTR lp. Text، LPCTSTR lp. Caption، UINT u. Type); تقریباً تمام پارامترهای توابع API در واقع اعداد صحیح 32 بیتی هستند: HWND یک عدد صحیح 32 بیتی است، LPCTSTR یک اشاره گر 32 بیتی به یک رشته است، UINT یک عدد صحیح 32 بیتی است. پسوند "A" اغلب به نام تابع اضافه می شود تا به نسخه های جدیدتر تابع منتقل شود.

فراخوانی توابع Windows API int Message. جعبه (HWND h. Wnd، LPCTSTR lp. Text، LPCTSTR lp. Caption، UINT u. Type); هنگام استفاده از MASM، باید @N N را در انتهای نام اضافه کنید - تعداد بایت هایی که آرگومان های ارسال شده در پشته اشغال می کنند. برای توابع Win 32 API، این عدد می تواند به عنوان تعداد آرگومان های n ضربدر 4 (بایت در هر آرگومان) تعریف شود: N = 4 * n. دستور CALL assembler برای فراخوانی تابع استفاده می شود. در این حالت تمام آرگومان های تابع از طریق پشته (فرمان PUSH) به آن ارسال می شود. جهت عبور آرگومان ها: از چپ به راست - پایین به بالا. اولین آرگومان بر روی پشته فشار داده می شود u است. تایپ کنید. فراخوانی تابع مشخص شده به این صورت خواهد بود: CALL Message. جعبه [ایمیل محافظت شده]

فراخوانی توابع Windows API int Message. جعبه (HWND h. Wnd، LPCTSTR lp. Text، LPCTSTR lp. Caption، UINT u. Type); نتیجه اجرای هر تابع API معمولاً یک عدد صحیح است که در ثبات EAX برگردانده می شود. دستورالعمل OFFSET یک "تغییر بخش" یا، به زبان سطح بالا، یک "اشاره گر" به ابتدای یک خط است. دستورالعمل EQU، مانند #define در زبان C، یک ثابت را تعریف می کند. دستورالعمل EXTERN به مترجم می گوید که تابع یا شناسه خارج از ماژول داده شده است.

نمونه ای از برنامه "سلام به همه!" ... 686 P. MODEL FLAT، STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "اولین برنامه من"، 0 STR 2 DB "سلام به همه!"، 0 HW DD؟ پیام EXTERN. جعبه [ایمیل محافظت شده]: نزدیک. کد شروع: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL پیام. جعبه [ایمیل محافظت شده]شروع مجدد پایان

دستورالعمل INVOKE مترجم زبان MASM همچنین امکان ساده‌سازی فراخوانی توابع را با استفاده از ابزار ماکرو - دستورالعمل INVOKE: تابع INVOKE، parameter1، parameter2، ... در این مورد، نیازی به اضافه کردن 16@ به فراخوانی تابع؛ پارامترها دقیقا به ترتیبی که در توضیحات تابع آورده شده اند نوشته می شوند. پارامترها با استفاده از مترجم بر روی پشته فشار داده می شوند. برای استفاده از دستور العمل INVOKE، باید شرحی از نمونه اولیه تابع با استفاده از دستورالعمل PROTO به شکل: Message داشته باشید. جعبه A PROTO: DWORD,: DWORD اگر برنامه از بسیاری از توابع Win 32 API استفاده می کند، توصیه می شود از دستورالعمل شامل C: masm 32includeuser 32. inc استفاده کنید.

کار دوره

در رشته "برنامه نویسی سیستم"

مبحث شماره 4: "حل مشکلات رویه ها"

گزینه 2

دانشگاه دولتی سیبری شرقی

فن آوری و کنترل

____________________________________________________________________

کالج فناوری

ورزش

برای مقاله ترم

انضباط:
موضوع: حل مسائل برای رویه ها
مجری (ها): گلاوینسکایا آرینا الکساندرونا
رئیس: دامباوا سسگما ویکتورونا
خلاصه کار: مطالعه روتین ها در زبان اسمبلی،
حل مسئله با استفاده از زیر برنامه ها
1. بخش نظری: اطلاعات اولیه در مورد زبان اسمبلی (مجموعه
دستورات و غیره)، سازمان‌دهی زیربرنامه‌ها، روش‌های ارسال در پارامترها
در زیر برنامه ها
2. بخش عملی: دو زیربرنامه ایجاد کنید، یکی از آنها هر حرف داده شده را به بزرگ (از جمله برای حروف روسی) تبدیل می کند و دیگری حرف را به حروف کوچک تبدیل می کند.
هر حرف داده شده را به بزرگ و دیگری حروف را به حروف کوچک تبدیل می کند.
یک حرف را به حروف کوچک تبدیل می کند.
مهلت های پروژه طبق برنامه:
1. بخش تئوری - 30% در 7 هفته.
2. بخش عملی - 70% در 11 هفته.
3. محافظت - 100٪ در 14 هفته.
شرایط لازم برای ثبت نام:
1. تسویه حساب و یادداشت توضیحی پروژه درس ارائه شود
نسخه های الکترونیکی و چاپی.
2. حجم گزارش باید حداقل 20 صفحه تایپ شده به استثنای پیوست باشد.
3. RPZ مطابق با GOST 7.32-91 تهیه شده و توسط رئیس امضا شده است.

مدیر کار __________________

پیمانکار __________________

تاریخ صدور " 26 " سپتامبر 2017 جی.


معرفی. 2

1.1 اطلاعات اولیه در مورد زبان اسمبلی. 3

1.1.1 مجموعه دستورات. 4

1.2 سازماندهی برنامه های فرعی در زبان اسمبلی. 4

1.3 روش های ارسال پارامترها در زیر برنامه ها. 6

1.3.1 عبور پارامترها از رجیسترها .. 6

1.3.2 عبور پارامترها از پشته. 7

2 بخش عملی .. 9

2.1 بیان مشکل. 9

2.2 شرح راه حل مشکل. 9

2.3 تست برنامه .. 7

نتیجه. هشت

مراجع .. 9


معرفی

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

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

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

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

وظایف کاری:

1. مطالعه اطلاعات اولیه در مورد زبان اسمبلر (ساختار و اجزای برنامه اسمبلر، فرمت دستورات، سازماندهی زیر روال ها و غیره)؛

2. بررسی انواع عملیات بیت، قالب و منطق دستورالعمل های منطقی اسمبلر.

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

4 .. نتیجه گیری در مورد کار انجام شده تدوین کنید.

1 بخش نظری

درک زبان اسمبلی

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

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

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

مزایا و معایب

· حداقل مقدار کد اضافی (با استفاده از دستورالعمل ها و دسترسی های حافظه کمتر). در نتیجه - سرعت بالاتر و اندازه کوچکتر برنامه.

· مقادیر زیادی کد، تعداد زیادی کار کوچک اضافی.

· خوانایی ضعیف کد، مشکل در نگهداری (اشکال زدایی، اضافه کردن ویژگی ها).

· دشواری اجرای پارادایم های برنامه نویسی و هر گونه قرارداد پیچیده تر، پیچیدگی توسعه مشترک.

· کتابخانه های موجود کمتر، سازگاری کم آنها.

· دسترسی مستقیم به سخت افزار: پورت های ورودی-خروجی، رجیسترهای ویژه پردازنده.

· حداکثر "مناسب" برای پلت فرم مورد نظر (استفاده از دستورالعمل های خاص، ویژگی های فنی "سخت افزار").

عدم تحمل سایر سیستم عامل ها (به جز باینری سازگار).

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

· تعریف داده (ثابت و متغیر).

· مدیریت سازماندهی برنامه در حافظه و پارامترهای فایل خروجی.

· تنظیم حالت عملکرد کامپایلر.

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

· ماکروها.

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

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

دستورات انتقال داده (mov و غیره)

دستورات حسابی (add، sub، imul و غیره)

عملیات منطقی و بیتی (یا، و، xor، shr، و غیره)

· دستورات کنترل اجرای برنامه (jmp، حلقه، ret و غیره)

دستورات فراخوانی وقفه (گاهی اوقات به عنوان دستورات کنترل از آن یاد می شود): int

دستورات I/O به پورت ها (داخل، خروجی)

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

· Jne - حرکت اگر برابر نیست.

· Jge - پرش اگر بزرگتر یا مساوی باشد.

مقالات مرتبط برتر