زنگ

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

دستورات زبان اسمبلی (سخنرانی)

طرح سخنرانی

1. گروه های اصلی عملیات.

پنتیوم.

1. گروه های اصلی عملیات

ریزپردازنده ها مجموعه ای از دستورالعمل ها را اجرا می کنند که گروه های اصلی عملیات زیر را اجرا می کنند:

عملیات حمل و نقل،

عملیات حسابی،

عملیات منطقی

عملیات شیفتی،

عملیات مقایسه و آزمایش،

عملیات بیت،

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

عملیات کنترل پردازنده

2. Mnemocodes از دستورات پردازنده پنتیوم

هنگام توصیف دستورات، معمولاً از نام‌های یادگاری آنها (کدهای یادگاری) استفاده می‌شود که برای تعیین دستور هنگام برنامه‌نویسی در زبان اسمبلی. برای نسخه‌های مختلف اسمبلر، کدهای یادگاری برخی از دستورات ممکن است متفاوت باشد. برای مثال، برای فراخوانی یک زیربرنامه، از کد حافظه استفاده می شودزنگ زدن یا JSR («پرش به زیر برنامه”). با این حال، کدهای یادگاری اکثر دستورات برای انواع اصلی ریزپردازنده ها یکسان هستند یا کمی متفاوت هستند، زیرا آنها مخفف کلمات انگلیسی متناظر هستند که عملیات در حال انجام را تعریف می کنند. یادداشت های دستوری را که برای پردازنده ها پذیرفته شده اند در نظر بگیریدپنتیوم.

دستورات فوروارد دستور اصلی این گروه دستور استMOV ، که انتقال داده را بین دو ثبات یا بین یک ثبات و یک سلول حافظه فراهم می کند. برخی از ریزپردازنده ها انتقال بین دو سلول حافظه و همچنین انتقال گروهی محتویات چندین ثبات از حافظه را اجرا می کنند. به عنوان مثال، ریزپردازنده های خانواده 68موتورولا xxx دستور را اجرا کنیدحرکت ، که انتقال از یک سلول حافظه به سلول دیگر و دستور را فراهم می کندMOVEM ، که محتویات مجموعه ای از ثبات ها را در حافظه می نویسد یا از حافظه بارگذاری می کند (تا 16 ثبات). فرمانXCHG تبادل متقابل محتویات دو ثبات پردازنده یا یک ثبات و یک سلول حافظه را انجام می دهد.

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

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

عملیات ضرب و تقسیم را می توان بر روی اعداد امضا شده (دستورها) انجام دادمن MUL، من DIV ) یا بدون امضا (دستورات MUL، DIV ). نتیجه عملیات در رجیستر قرار دارد. هنگام ضرب (دستوراتMUL , IMUL ) نتیجه دو رقمی می شود که از دو رجیستر برای تطبیق استفاده می کند. هنگام تقسیم (دستوراتDIV , IDIV ) به عنوان سود از یک عملوند دو رقمی استفاده می شود که در دو رجیستر قرار می گیرد و در نتیجه ضریب و باقیمانده به دو رجیستر نوشته می شود.

تیم ها عملیات منطقی . تقریباً همه ریزپردازنده‌ها عملیات منطقی AND، OR، Exclusive OR را انجام می‌دهند که با استفاده از دستورات روی بیت‌های عملوند همنام انجام می‌شوند. و، یا، ایکس یا . عملیات بر روی محتویات دو رجیستر، یک ثبات و یک مکان حافظه یا با استفاده از یک عملوند فوری انجام می شود. فرمان نه مقدار هر بیت از عملوند را معکوس می کند.

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

دستورات مقایسه و تست . مقایسه عملوند معمولاً با دستورالعمل انجام می شودCMP ، که تفریق عملوندها را با تنظیم مقادیر ویژگی ها انجام می دهد N، Z، V، Cدر ثبت وضعیت با توجه به نتیجه. در این حالت، نتیجه تفریق ذخیره نمی شود و مقادیر عملوندها تغییر نمی کند. تجزیه و تحلیل بعدی مقادیر مشخصه به دست آمده امکان تعیین مقدار نسبی (>،<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

برخی از ریزپردازنده ها یک فرمان آزمایشی را اجرا می کنند TST ، که یک نوع عملوند منفرد از دستورالعمل مقایسه است. هنگامی که این دستور اجرا می شود، علائم تنظیم می شوند N، Zبا توجه به علامت و مقدار (مساوی یا غیر صفر) عملوند آدرس دهی شده.

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

دستورات این گروه گزینه های مختلفی را برای تغییر بیت تست شده اجرا می کنند BT مقدار این بیت را بدون تغییر نگه می دارد. Command ب تی اس پس از تست مقدار را تنظیم می کند bn=1 و دستور ب تی سی - معنی bn=0.فرمان ب تی سی مقدار بیت bn را پس از آزمایش معکوس می کند.

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

- دستورات انتقال کنترل بدون قید و شرط؛

- دستورات پرش شرطی؛

- دستورات برای سازماندهی چرخه های برنامه؛

- دستورات وقفه؛

- دستورات تغییر ویژگی

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

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

دستورات مدیریت صفت، نوشتن - خواندن محتویات ثبت وضعیت، که صفات را ذخیره می کند، و همچنین تغییر مقادیر صفات فردی را فراهم می کند. به عنوان مثال، پردازنده های پنتیوم دستورات را اجرا می کنند LAHF و SAHF ، که بایت کم را که حاوی علائم است از ثبت وضعیت بارگیری می کند EFLAGبه بایت کم ثبت EAXو اضافه کردن بایت کم پرچم هااز ثبت نام E Aایکس.. دستورات CLC، STCمقادیر پرچم انتقال CF=0، CF=1 و دستور را تنظیم کنید CMCباعث می شود مقدار این ویژگی معکوس شود.از آنجایی که صفات جریان اجرای برنامه را در طول پرش های شرطی تعیین می کنند، معمولاً از دستورالعمل های تغییر صفت برای کنترل برنامه استفاده می شود.

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

تیم های ویژه CLI، STI سرویس درخواست های وقفه را غیرفعال و فعال کنید. در پردازنده هاپنتیوم برای این کار از یک بیت کنترل (پرچم) استفاده می شوداگردر ثبت نام پرچم ها.

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

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

برخی از پردازنده‌ها عملیات محاسباتی BCD را انجام می‌دهند یا دستورالعمل‌های تصحیح نتایج ویژه را هنگام پردازش چنین اعدادی انجام می‌دهند. بسیاری از پردازنده های با کارایی بالا شامل FPU - واحد پردازش اعدادج "نقطه شناور".

در تعدادی از پردازنده های مدرن، پردازش گروهی چند عدد صحیح یا اعداد اجرا می شود.ج "نقطه شناور" با یک فرمان واحد طبق اصل SIMD ("دستورالعمل واحد - داده های متعدد ") - "یک فرمان - داده های زیادی". اجرای همزمان عملیات بر روی چندین عملوند عملکرد پردازنده را در هنگام کار با داده های تصویری و صوتی به طور قابل توجهی افزایش می دهد. چنین عملیاتی به طور گسترده در پردازش تصویر، پردازش سیگنال صوتی و سایر برنامه ها استفاده می شود. برای انجام این عملیات، بلوک های خاصی به پردازنده ها وارد می شوند که مجموعه دستورالعمل های مربوطه را پیاده سازی می کنند که در انواع مختلف پردازنده ها (پنتیوم، آتلون) نام گرفتMMX (“ میلتیپسوند رسانه ای ”) – پسوند چند رسانه ای،SSE(" Streaming SIMD Extension ") - Streaming SIMD - افزونه، “3 دیافزونه- گسترش سه بعدی

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

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

دانشکده فن آوری کامپیوتر

با موضوع: تجزیه معنایی یک فایل EXE.

تکمیل شد:

تاشکند 2003.

پیشگفتار.

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

ساختار فایل EXE (تجزیه معنایی).

ساختار یک فایل COM

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

جداساز.

برنامه ها.

پیشگفتار

حرفه برنامه نویسی شگفت انگیز و منحصر به فرد است. در زمان ما علم و زندگی بدون آخرین تکنولوژی قابل تصور نیست. هر چیزی که با فعالیت های انسانی مرتبط است بدون فناوری رایانه کامل نیست. و این به پیشرفت و کمال بالای آن کمک می کند. بگذارید توسعه رایانه های شخصی نه چندان دور آغاز شود، اما در این مدت گام های عظیمی در محصولات نرم افزاری برداشته شد و برای مدت طولانی این محصولات به طور گسترده مورد استفاده قرار خواهند گرفت. حوزه دانش مرتبط با کامپیوتر و همچنین فناوری مربوطه رشد کرده است. اگر جنبه تجاری را در نظر نگیریم، می توان گفت که هیچ غریبه ای در این زمینه فعالیت حرفه ای وجود ندارد. بسیاری از آنها نه برای سود یا کسب درآمد، بلکه با اراده آزاد خود و از روی اشتیاق درگیر توسعه برنامه ها هستند. البته این نباید بر کیفیت برنامه تأثیر بگذارد و در این تجارت، به اصطلاح، رقابت و تقاضا برای اجرای با کیفیت، برای کار پایدار و برآورده کردن تمام نیازهای زمان ما وجود دارد. در اینجا همچنین شایان ذکر است ظاهر ریزپردازنده ها در دهه 60 که جایگزین تعداد زیادی مجموعه لامپ شدند. انواع مختلفی از ریزپردازنده ها وجود دارند که بسیار متفاوت از یکدیگر هستند. این ریزپردازنده ها از نظر ظرفیت بیت و دستورات سیستم داخلی با یکدیگر تفاوت دارند. رایج ترین آنها عبارتند از: Intel، IBM، Celeron، AMD و غیره. تمامی این پردازنده ها مربوط به معماری پیشرفته پردازنده های اینتل هستند. گسترش ریز رایانه ها به دو دلیل اصلی باعث تجدید نظر در نگرش نسبت به زبان اسمبلی شده است. اول اینکه برنامه هایی که به زبان اسمبلی نوشته می شوند به حافظه و زمان اجرا کمتری نیاز دارند. ثانیاً، دانش زبان اسمبلی و کد ماشین حاصل، درک درستی از معماری ماشین به دست می دهد، که به سختی هنگام کار با یک زبان سطح بالا ارائه می شود. در حالی که اکثر متخصصان نرم افزار به زبان های سطح بالا مانند پاسکال، سی یا دلفی توسعه می دهند که نوشتن برنامه برای آنها آسان تر است، قوی ترین و کارآمدترین نرم افزار به طور کامل یا جزئی به زبان اسمبلی نوشته می شود. زبان های سطح بالا برای جلوگیری از مسائل فنی خاص رایانه های خاص طراحی شده اند. و زبان اسمبلی نیز به نوبه خود برای مشخصات خاص پردازنده طراحی شده است. بنابراین، برای نوشتن یک برنامه به زبان اسمبلی برای یک کامپیوتر خاص، باید معماری آن را بشناسید. امروزه نوع محصول اصلی نرم افزار فایل EXE می باشد. با توجه به جنبه های مثبت این موضوع، نویسنده برنامه می تواند از مصونیت آن مطمئن باشد. اما اغلب اوقات این دور از مورد است. جدا کننده هم وجود دارد. با کمک یک disassembler می توانید وقفه ها و کدهای برنامه را پیدا کنید. برای شخصی که به اسمبلر تبحر دارد سخت نخواهد بود که کل برنامه را مطابق سلیقه خود بازسازی کند. شاید این همان جایی است که حل نشدنی ترین مشکل از آنجا ناشی می شود - ویروس. چرا مردم ویروس می نویسند؟ برخی با تعجب، برخی با عصبانیت این سوال را می پرسند، اما با این وجود هنوز افرادی هستند که نه از منظر ایجاد آسیب، بلکه به عنوان علاقه به برنامه نویسی سیستم به این کار علاقه دارند. ویروس ها به دلایل مختلفی نوشته می شوند. برخی تماس های سیستمی را دوست دارند، برخی دیگر دانش خود را در اسمبلر بهبود می بخشند. من سعی خواهم کرد همه اینها را در مقاله ترم خود توضیح دهم. همچنین نه تنها در مورد ساختار فایل EXE، بلکه در مورد زبان اسمبلی نیز می گوید.

^ زبان اسمبلی.

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

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

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

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

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

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

یک کامپیوتر مدرن معمولی (بر اساس i486 یا Pentium) از اجزای زیر تشکیل شده است (شکل 1).

برنج. 1. کامپیوتر و تجهیزات جانبی

برنج. 2. بلوک دیاگرام یک کامپیوتر شخصی

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

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

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

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

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

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

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

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

این رجیسترها را می توان به دو گروه بزرگ تقسیم کرد:

^16 ثبت سفارشی;

16 ثبت سیستم

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

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

هشت رجیستر 32 بیتی که می توانند توسط برنامه نویسان برای ذخیره داده ها و آدرس ها استفاده شوند (که به آنها رجیسترهای عمومی (RON) نیز گفته می شود):

شش بخش ثبات: cs، ds، ss، es، fs، gs.

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

پرچم ها ثبت پرچم ها/پرچم ها.

ثبت اشاره گر فرمان eip/ip.

برنج. 3. ثبت نام کاربر ریزپردازنده های i486 و Pentium

چرا بسیاری از این ثبات ها با اسلش نشان داده شده اند؟ نه، اینها رجیسترهای متفاوتی نیستند - آنها بخشی از یک ثبات بزرگ 32 بیتی هستند. آنها را می توان در برنامه به عنوان اشیاء جداگانه استفاده کرد. این کار برای اطمینان از عملکرد برنامه های نوشته شده برای مدل های ریزپردازنده 16 بیتی جوان اینتل، از i8086 انجام شد. ریزپردازنده های i486 و Pentium عمدتا دارای ثبات های 32 بیتی هستند. تعداد آنها، به استثنای رجیسترهای سگمنت، با i8086 یکسان است، اما بعد بزرگتر است، که در نامگذاری آنها منعکس شده است - آنها دارای
پیشوند e (گسترش یافته).

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

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

eax/ax/ah/al (Accumulator register) - آکومولاتور.
برای ذخیره داده های میانی استفاده می شود. در برخی از دستورات، استفاده از این ثبات اجباری است.

ebx/bx/bh/bl (رجیستر پایه) - ثبت پایه.
برای ذخیره آدرس پایه برخی از شی در حافظه استفاده می شود.

ecx/cx/ch/cl (Count register) - رجیستر شمارنده.
در دستوراتی که برخی از اعمال تکراری را انجام می دهند استفاده می شود. استفاده از آن اغلب به صورت ضمنی و در الگوریتم دستور مربوطه پنهان است.
به عنوان مثال، فرمان سازمان حلقه، علاوه بر انتقال کنترل به فرمانی که در یک آدرس خاص قرار دارد، ارزش رجیستر ecx/cx را یک‌بار تحلیل و کاهش می‌دهد.

edx/dx/dh/dl (رجیستر داده) - ثبت داده.
درست مانند رجیستر eax/ax/ah/al، داده های میانی را ذخیره می کند. برخی از دستورات به استفاده از آن نیاز دارند. برای برخی از دستورات این به طور ضمنی اتفاق می افتد.

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

esi/si (ثبت فهرست منبع) - فهرست منبع.
این رجیستر در عملیات زنجیره ای حاوی آدرس فعلی عنصر در زنجیره منبع است.

edi/di (رجیستر فهرست مقصد) - فهرست گیرنده (گیرنده).
این رجیستر در عملیات زنجیره ای حاوی آدرس فعلی در زنجیره مقصد است.

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

esp/sp (ثبت نشانگر پشته) - ثبت اشاره گر پشته.
شامل یک اشاره گر به بالای پشته در بخش پشته فعلی است.

ebp/bp (رجیستر نشانگر پایه) - ثبت اشاره گر پایه قاب پشته.
طراحی شده برای سازماندهی دسترسی تصادفی به داده ها در داخل پشته.

پشته یک منطقه برنامه برای ذخیره موقت داده های دلخواه است. البته می توان داده ها را در سگمنت داده نیز ذخیره کرد، اما در این صورت برای هر داده ذخیره شده موقت باید یک سلول حافظه جداگانه با نام ایجاد کرد که باعث افزایش حجم برنامه و تعداد نام های استفاده شده می شود. راحتی پشته این است که از ناحیه آن دوباره استفاده می شود و ذخیره داده ها در پشته و واکشی آنها از آنجا با استفاده از دستورات فشار و پاپ کارآمد بدون تعیین نام انجام می شود.
پشته به طور سنتی استفاده می شود، به عنوان مثال، برای ذخیره محتویات ثبات های مورد استفاده توسط برنامه قبل از فراخوانی یک برنامه فرعی، که به نوبه خود، از ثبات های پردازنده "برای اهداف خود" استفاده می کند. محتویات اصلی رجیسترها پس از بازگشت از زیربرنامه از پشته بیرون می‌آید. یکی دیگر از تکنیک های رایج این است که پارامترهای مورد نیاز را از طریق پشته به یک برنامه فرعی ارسال کنید. زیر روال با دانستن اینکه پارامترها به چه ترتیبی روی پشته قرار می گیرند، می تواند آنها را از آنجا گرفته و در اجرای خود استفاده کند. یکی از ویژگی‌های متمایز پشته، ترتیب خاص نمونه‌گیری از داده‌های موجود در آن است: در هر زمان، فقط عنصر بالایی در پشته موجود است، یعنی. آخرین عنصر بارگذاری شده روی پشته بیرون زدن عنصر بالایی از پشته، عنصر بعدی را در دسترس قرار می دهد. عناصر پشته در ناحیه حافظه اختصاص داده شده برای پشته قرار دارند که از پایین پشته (یعنی از حداکثر آدرس آن) شروع می شود تا آدرس های متوالی کاهش می یابد. آدرس عنصر قابل دسترسی بالا در ثبات نشانگر پشته SP ذخیره می شود. مانند هر قسمت دیگری از حافظه برنامه، پشته باید در قسمتی گنجانده شود یا یک بخش جداگانه تشکیل دهد. در هر صورت، آدرس سگمنت آن بخش در ثبات پشته سگمنت SS قرار می گیرد. بنابراین، یک جفت ثبات SS:SP آدرس یک سلول پشته موجود را توصیف می کند: SS آدرس بخش پشته را ذخیره می کند، و SP آفست آخرین داده ذخیره شده در پشته را ذخیره می کند (شکل 4، a). بیایید به این نکته توجه کنیم که در حالت اولیه، نشانگر پشته SP به سلولی اشاره می کند که در زیر پشته قرار دارد و در آن گنجانده نشده است.

شکل 4. سازمان پشته: الف - حالت اولیه، ب - پس از بارگیری یک عنصر (در این مثال، محتویات رجیستر AX)، ج - پس از بارگذاری عنصر دوم (محتویات رجیستر DS)، د - پس از تخلیه یکی عنصر، e - پس از تخلیه دو عنصر و بازگشت به حالت اولیه.

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

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

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

پاپ دی اس
پاپ تبر

پشته باید چقدر بزرگ باشد؟ این بستگی به شدت استفاده از آن در برنامه دارد. برای مثال، اگر قصد دارید یک آرایه 10000 بایتی را در پشته ذخیره کنید، پس پشته باید حداقل به این اندازه باشد. باید در نظر داشت که در برخی موارد پشته به طور خودکار توسط سیستم استفاده می شود، به ویژه هنگام اجرای دستور وقفه int 21h. با این دستور، پردازنده ابتدا آدرس برگشتی را به پشته فشار می دهد و سپس DOS محتویات ثبات ها و سایر اطلاعات مربوط به برنامه قطع شده را به آنجا می فرستد. بنابراین، حتی اگر برنامه اصلاً از پشته استفاده نکند، باز هم باید در برنامه وجود داشته باشد و حداقل چند ده کلمه داشته باشد. در مثال اول ما 128 کلمه را روی پشته قرار دادیم که قطعا کافی است.

^ ساختار برنامه مجمع

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

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

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

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

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

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

^ نحو زبان اسمبلی

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

برنج. 5. قالب جمله اسمبلر

برنج. 6. فرمت دستورالعمل ها

برنج. 7. فرمت دستورات و ماکروها

روی این نقشه ها:

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

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

کد عملیات (COP) و دستورالعمل، نام‌های یادگاری دستورالعمل ماشین، دستورالعمل کلان یا دستورالعمل مترجم مربوطه هستند.

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

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

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

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

اعداد از 0 تا 9;

نشانه ها؟، @، $، _، &;

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

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

نشانه ها عبارتند از:

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

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

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

برای توصیف وضعیت پرچم ها پس از اجرای یک دستور خاص، از انتخابی از جدول استفاده می کنیم که ساختار ثبت پرچم flags را منعکس می کند:

ردیف پایین این جدول مقادیر پرچم ها را پس از اجرای دستور فهرست می کند. در این مورد از نمادهای زیر استفاده می شود:

1 - پس از اجرای دستور، پرچم تنظیم می شود (برابر با 1).

0 - پس از اجرای دستور، پرچم مجدداً تنظیم می شود (برابر 0).

r - مقدار پرچم به نتیجه دستور بستگی دارد.

پس از اجرای دستور، پرچم تعریف نشده است.

space - پس از اجرای دستور، پرچم تغییر نمی کند.

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

r8، r16، r32 - عملوند در یکی از رجیسترهای اندازه بایت، کلمه یا کلمه دوگانه.

m8، m16، m32، m48 - عملوند در اندازه حافظه بایت، کلمه، دو کلمه یا 48 بیت.

i8، i16، i32 - عملوند فوری با اندازه بایت، کلمه یا دو کلمه.

a8، a16، a32 - آدرس نسبی (offset) در بخش کد.

دستورات (به ترتیب حروف الفبا):

*این دستورات به تفصیل توضیح داده شده است.

اضافه کردن
(افزودن)

اضافه

^ طرح کلی دستور:

افزودن مقصد، منبع

هدف: افزودن دو عملوند مبدا و مقصد در ابعاد بایت، کلمه یا دو کلمه.

الگوریتم کار:

عملوندهای مبدا و مقصد را اضافه کنید.

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

پرچم ها را تنظیم کنید

وضعیت پرچم ها پس از اجرای دستور:

کاربرد:
دستور add برای اضافه کردن دو عملوند عدد صحیح استفاده می شود. نتیجه جمع در آدرس اولین عملوند قرار می گیرد. اگر نتیجه جمع فراتر از مرزهای عملوند مقصد باشد (سرریزی رخ می دهد)، باید با تجزیه و تحلیل پرچم cf و سپس احتمالاً با استفاده از دستور adc، این وضعیت را در نظر گرفت. به عنوان مثال، بیایید مقادیر را در ثبات ax و ناحیه حافظه ch اضافه کنیم. هنگام اضافه کردن، باید احتمال سرریز را در نظر بگیرید.

ثبت نام به علاوه ثبت نام یا حافظه:

|000000dw|modregr/rm|

ثبت AX (AL) به اضافه مقدار فوری:

|0000010w|--data--|داده اگر w=1|

ثبت یا حافظه به اضافه مقدار فوری:

|100000sw|mod000r/m|--data--|داده اگر BW=01|

زنگ زدن
(زنگ زدن)

فراخوانی رویه یا وظیفه

^ طرح کلی دستور:

هدف:

انتقال کنترل به رویه نزدیک یا دور با ذخیره آدرس نقطه بازگشت در پشته.

تعویض وظیفه

الگوریتم کار:
توسط نوع عملوند تعیین می شود:

برچسب نزدیک است - محتویات نشانگر فرمان eip / ip روی پشته فشار داده می شود و یک مقدار آدرس جدید مربوط به برچسب در همان ثبات بارگذاری می شود.

برچسب دور - محتویات نشانگر فرمان eip/ip و cs روی پشته فشار داده می‌شوند. سپس مقادیر آدرس جدید مربوط به علامت دور در همان رجیسترها بارگذاری می شوند.

R16، 32 یا m16، 32 - یک رجیستر یا سلول حافظه حاوی offset ها را در بخش دستورالعمل فعلی، که در آن کنترل منتقل می شود، تعریف کنید. هنگامی که کنترل منتقل می شود، محتویات نشانگر فرمان eip/ip روی پشته فشار داده می شود.

اشاره گر حافظه - یک مکان حافظه حاوی یک اشاره گر 4 یا 6 بایتی به رویه ای که فراخوانی می شود را تعیین می کند. ساختار چنین اشاره گر 2+2 یا 2+4 بایت است. تفسیر چنین اشاره گر بستگی به حالت عملکرد ریزپردازنده دارد:

^ وضعیت پرچم ها پس از اجرای دستور (به جز سوئیچ وظیفه):

اجرای دستور بر پرچم ها تأثیر نمی گذارد

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

کد شی (چهار فرمت):

آدرس دهی مستقیم در یک بخش:

|11101000|disp-low|diep-high|

آدرس دهی غیر مستقیم در یک بخش:

|11111111|mod010r/m|

آدرس دهی غیر مستقیم بین بخش ها:

|11111111|mod011r/m|

آدرس دهی مستقیم بین بخش ها:

|10011010|افست-کم|افق-بالا|سگ-کم|سگ-بالا|

CMP
(مقایسه عملوندها)

مقایسه عملوند

^ طرح کلی دستور:

cmp operand1, operand2

هدف: مقایسه دو عملوند.

الگوریتم کار:

انجام تفریق (عملگر1-عملکرد2)؛

بسته به نتیجه، پرچم ها را تنظیم کنید، operand1 و operand2 را تغییر ندهید (یعنی نتیجه را ذخیره نکنید).

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

کد شی (سه فرمت):

حافظه ثبت شده یا ثبت شده:

|001110dw|modreg/m|

مقدار فوری با ثبات AX (AL):

|0011110w|--data--|داده اگر w=1|

مقدار فوری با ثبات یا حافظه:

|100000sw|mod111r/m|--data--|داده اگر sw=0|

دسامبر
(عملگر کاهش با 1)

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

^ طرح کلی دستور:

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

هدف: مقدار عملوند را در حافظه کاهش دهید یا 1 را ثبت کنید.

الگوریتم کار:
دستور 1 را از عملوند کم می کند. وضعیت پرچم ها پس از اجرای دستور:

کاربرد:
دستور dec برای کاهش ارزش یک بایت، کلمه، دو کلمه در حافظه یا ثبت یک عدد استفاده می شود. توجه داشته باشید که دستور روی پرچم cf تاثیری ندارد.

ثبت نام: |01001reg|

^ ثبت یا حافظه: |1111111w|mod001r/m|

DIV
(تقسیم بدون امضا)

بخش بدون امضا

طرح فرمان:

تقسیم کننده div

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

^ الگوریتم کار:
دستور به دو عملوند - تقسیم کننده و تقسیم کننده نیاز دارد. سود سهام به طور ضمنی مشخص می شود و اندازه آن به اندازه تقسیم کننده بستگی دارد که در دستور مشخص شده است:

اگر مقسوم علیه بر حسب بایت باشد، تقسیم سود باید در محور ثبت قرار گیرد. بعد از عمل، ضریب در al و باقیمانده در ah قرار می گیرد.

اگر مقسوم علیه یک کلمه باشد، سود سهام باید در جفت ثبت dx:ax قرار گیرد و قسمت پایین سود در ax باشد. پس از عمل، ضریب در ax و باقیمانده در dx قرار می گیرد.

اگر مقسوم علیه دو کلمه باشد، سود سهام باید در جفت ثبت edx:eax قرار گیرد و قسمت پایین سود در eax قرار گیرد. پس از عمل، ضریب در eax و باقیمانده در edx قرار می گیرد.

^ وضعیت پرچم ها پس از اجرای دستور:

کاربرد:
این دستور یک تقسیم عدد صحیح از عملوندها را انجام می دهد و نتیجه تقسیم را به عنوان ضریب و باقیمانده تقسیم را برمی گرداند. هنگام انجام عملیات تقسیم، ممکن است یک استثنا رخ دهد: 0 - خطای تقسیم. این وضعیت در یکی از دو حالت رخ می دهد: مقسوم علیه 0 است، یا ضریب آن خیلی بزرگ است که در ثبات eax/ax/al قرار نمی گیرد.

کد شی:

|1111011w|mod110r/m|

INT
(وقفه)

فراخوانی روال سرویس وقفه

^ طرح کلی دستور:

interrupt_number

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

^ الگوریتم کار:

ثبت eflags/flags و آدرس بازگشت را روی پشته فشار دهید. هنگام نوشتن آدرس برگشتی، ابتدا محتویات ثبات بخش cs نوشته می شود، سپس محتویات اشاره گر فرمان eip/ip.

پرچم های if و tf را به صفر برگردانید.

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

^ وضعیت پرچم ها پس از اجرای دستور:

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

int 3 - دارای اپکد جداگانه 0cch است و یک بایت را اشغال می کند. این شرایط استفاده از اشکال‌زدای نرم‌افزاری مختلف را برای تنظیم نقاط شکست با جایگزینی اولین بایت هر دستورالعمل بسیار راحت می‌کند. ریزپردازنده که با دستوری با کد opcode 0cch در ترتیب دستورات مواجه می شود، کنترل کننده وقفه را با بردار شماره 3 فرا می خواند که برای برقراری ارتباط با دیباگر نرم افزار.

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

کد شی (دو فرمت):

ثبت نام: |01000reg|

^ ثبت یا حافظه: |1111111w|mod000r/m|

JCC
JCXZ/JECXZ
(در صورت شرط پرش)

(پرش اگر CX=صفر/پرش اگر ECX=صفر)

در صورت رعایت شرایط بپرید

اگر CX/ECX صفر است بپرید

^ طرح کلی دستور:

برچسب jcc
برچسب jcxz
برچسب jecxz

هدف: انتقال در بخش فعلی دستورات، بسته به شرایطی.

^ الگوریتم فرمان (به جز jcxz/jecxz):
بررسی وضعیت پرچم ها بسته به کد عملیاتی (منعکس کننده شرایط در حال بررسی است):

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

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

الگوریتم دستور jcxz/jecxz:
بررسی شرط مساوی بودن محتویات ثبات ecx/cx با صفر:

در صورت بررسی شرایط

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

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

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

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

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

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

برای استفاده از ساختارها در یک برنامه، باید سه کار را انجام دهید:

    پرسیدن قالب ساختار .

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

    تعريف كردن نمونه ساختار .

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

    سازمان دادن دسترسی به اعضای ساختار .

بسیار مهم است که از همان ابتدا متوجه شوید که چه تفاوتی بین آنها وجود دارد شرحساختارهای موجود در برنامه و آن تعریف.

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

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

تعريف كردن ساختار به معنای دستور دادن به مترجم برای تخصیص حافظه و اختصاص یک نام نمادین به این ناحیه حافظه است.

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

توضیحات الگوی ساختار

اعلان الگوی ساختار دارای نحو زیر است:

structure_name STRUC

ساختار_نام به پایان می رسد

اینجا دنباله ای از دستورالعمل های توصیف داده ها است db، dw، dd، dqو dt.

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

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

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

کار با ساختارها را با استفاده از مثال مدل سازی پایگاه داده کارکنان یک بخش خاص در نظر بگیرید.

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

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

تعریف داده با نوع ساختار

برای استفاده از ساختاری که به کمک قالب در برنامه توضیح داده شده است، باید متغیری با نوع این ساختار تعریف کرد. برای این منظور از دستور زیر استفاده می شود:

[نام متغیر] ساختار_نام

    نام متغیر- شناسه متغیر از نوع ساختاری داده شده.

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

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

    وظیفه او نیز اختیاری است.

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

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

    برای مثال: کارگر پیروز.

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

روش های ساختاری

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

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

    address_expression- یک شناسه متغیر از نوع ساختاری یا یک عبارت در پرانتز مطابق با قوانین نحوی نشان داده شده در زیر (شکل 1).

    ساختار_فیلد_نام- نام فیلد از الگوی ساختار.

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

بنابراین اپراتور " . " (نقطه) عبارت را ارزیابی می کند

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

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

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

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

برای اصلاح آن، فقط از دستور استفاده کنید xchg al,ah:

mov ax, word ptr sotr1.age ;در یک سن sotr1

و این امکان وجود دارد:

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

چگونه با اندازه برخورد کنیم و چگونه نمایه سازی عناصر آرایه را سازماندهی کنیم؟

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

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

برای مثال:

چگونه یک فیلد را از یک ساختار به فیلد متناظر ساختار دیگر کپی کنیم؟ یا چگونه کل ساختار را کپی کنیم؟ بیایید فیلد را کپی کنیم نامسومین کارمند در این زمینه نامکارمند پنجم:

mas_sotr worker 10 dup()

mov bx، offset mas_sotr

mov si, (نوع کارگر)*2 ;si=77*2

mov di, (نوع کارگر)*4 ;si=77*4

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

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

وجود دو نوع داده زیر در زبان احتمالاً به دلیل تمایل "میزبان" به استفاده از منطقه کاری میز (RAM) تا حد امکان در هنگام تهیه غذا یا برای قرار دادن محصولات (داده های برنامه) است. ).

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

طرح:

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

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

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

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

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

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

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

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

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

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

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

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

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

­ ساختار برنامه مونتاژ نحو اسمبلر

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

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


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

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

روی این نقشه ها:

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

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

­ کد عملیات (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 دستورات انتقال داده این دستورالعمل ها جایگاه بسیار مهمی در مجموعه دستورات هر پردازنده ای دارند. آنها عملکردهای اساسی زیر را انجام می دهند:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

­ دستورالعمل های پرش مشروط

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

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

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

­ پرش اگر برابر با صفر باشد.

­ پرش اگر غیر صفر باشد.

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

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

­ پرش اگر بزرگتر از صفر باشد.

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

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

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

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

خروجی:

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

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

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

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

­ سوالات تستی:

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

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

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

4 ساختار دستورالعمل های مونتاژ را توضیح دهید.

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

کار دوره

موضوع "برنامه نویسی سیستم"

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

گزینه 2

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

فن آوری و مدیریت

____________________________________________________________________

کالج فنی

وظیفه

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

انضباط:
موضوع: حل مسئله برای رویه ها
هنرمند (ها): گلاوینسکایا آرینا الکساندرونا
سرپرست: سسگما ویکتورونا دمباوا
خلاصه ای از کار: بررسی زیر روال ها در زبان اسمبلی،
حل مسئله با استفاده از زیر برنامه ها
1. بخش نظری: اطلاعات اولیه در مورد زبان اسمبلی (مجموعه
دستورات و غیره)، سازماندهی زیربرنامه ها، راه های عبور در پارامترها
در زیر برنامه ها
2. بخش عملی: دو زیربرنامه ایجاد کنید، یکی از آنها هر حرف داده شده را به بزرگ (از جمله برای حروف روسی) تبدیل می کند و دیگری حرف را به حروف کوچک تبدیل می کند.
هر حرف داده شده را به بزرگ تبدیل می کند و دیگری حرف را به حروف کوچک تبدیل می کند.
یک حرف را به حروف کوچک تبدیل می کند.
جدول زمانی پروژه بر اساس برنامه زمانبندی:
1. بخش تئوری - 30% تا هفته 7.
2. بخش عملی - 70% در 11 هفته.
3. محافظت - 100٪ در 14 هفته.
الزامات طراحی:
1. تسویه حساب و یادداشت توضیحی پروژه درس باید در
نسخه های الکترونیکی و چاپی.
2. حجم گزارش باید حداقل 20 صفحه تایپی بدون احتساب ضمیمه ها باشد.
3. RPP مطابق با 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 بیان مشکل. نه

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

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

نتیجه. 8

مراجع.. 9


معرفی

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

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

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

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

وظایف کاری:

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

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

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

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

1 بخش نظری

مبانی زبان اسمبلی

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

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

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

مزایا و معایب

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

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

خوانایی ضعیف کد، مشکل پشتیبانی (اشکال زدایی، اضافه کردن ویژگی ها)؛

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

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

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

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

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

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

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

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

تنظیم حالت کامپایلر؛

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

ماکروها

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

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

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

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

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

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

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

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

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

· jne - پرش اگر برابر نیست.

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

زنگ

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