زنگ

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

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

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

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

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

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

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

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

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

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

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

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

برچسب ها

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

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

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

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

تیم ها

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

بخشنامه ها

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

عملوندها

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

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

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

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

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

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

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

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

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

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

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

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

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

RET
پایان شروع

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

مبحث 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 نوع دستور اسمبلر را فهرست کنید.

1. معماری رایانه شخصی…………………………………………………………………

    1.1. ثبت می کند.

    1.1.1 ثبت همه منظوره.

1.1.2. ثبت بخش

1.1.3 ثبت پرچم

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

1.3. بازنمایی داده ها

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

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

2. بیانیه برنامه مجمع ………………………………………

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6.1.1 جمع و تفریق

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

6.2 ضرب و تقسیم

6.3 تغییر علامت

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

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

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

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

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

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

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

10.5 INT را قطع می کند

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

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

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

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

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

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

11.2 جدول تخصیص فایل

11.3 ورودی/خروجی دیسک

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

11.3.1.1 داده های ASCIIZ

11.3.1.2 شماره فایل

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

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

معرفی

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

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

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

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

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

    معماری PC

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

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

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

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

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

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

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

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

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

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

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

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

      ثبت می کند.

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

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

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

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

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

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

        ثبت های عمومی

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

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

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

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

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

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

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

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

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

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

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

1.1.2. ثبت بخش

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

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

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

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

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

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

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

ثبت اشاره گر فرمان EIP/IP.

    ثبت پرچم EFLAGS/FLAGS.

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

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

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

1.1.3 ثبت پرچم

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

شکل 1 ثبت پرچم ها

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

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

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

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

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

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

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

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

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

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

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

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

پرچم سیستم:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

structure_name STRUC

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

به عنوان مثال استخراج به تبرمقادیر فیلد با سن از آنجایی که بعید است سن یک فرد توانمند بیش از 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) تا حد امکان در هنگام تهیه غذا یا برای قرار دادن محصولات (داده های برنامه) است. ).

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

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

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

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

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

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

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

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

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

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

مدل های حافظه MODEL modifier memory_model, calling_convention, OS_type, stack_parameter پارامتر OS_type به طور پیش فرض OS_DOS است و در حال حاضر تنها مقدار پشتیبانی شده برای این پارامتر است. پارامتر stack_param روی 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 - بخشی از برنامه حاوی کد. شروع - برچسب. END START - پایان برنامه و پیامی به کامپایلر مبنی بر اینکه برنامه باید از برچسب START شروع شود. هر برنامه باید حاوی یک دستورالعمل END باشد که پایان کد منبع برنامه را مشخص می کند. تمام خطوطی که از دستورالعمل END پیروی می کنند نادیده گرفته می شوند.برچسب بعد از دستورالعمل END به کامپایلر نام ماژول اصلی را می گوید که اجرای برنامه از آن شروع می شود. اگر برنامه حاوی یک ماژول باشد، برچسب بعد از دستورالعمل END را می توان حذف کرد.

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

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="(!LANG:پخش برنامه به مایکروسافت استودیوی تصویری 2005 1) با انتخاب منوی File->New->Project and"> Program Translation در Microsoft Visual Studio 2005 یک پروژه ایجاد کنید 1) با انتخاب منوی File->New->Project و مشخص کردن نام پروژه (سلام .prj) و پروژه را تایپ کنید: Win 32 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) گزینه های کامپایلر را تنظیم کنید. انتخاب توسط دکمه سمت راستدر فایل پروژه منوی قوانین ساخت سفارشی...

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

ترجمه برنامه در Microsoft Visual Studio 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 است (رابط برنامه کاربردی، یعنی رابط نرم افزار کاربردی). تعداد آنها به 2000 می رسد. برنامه برای ویندوز عمدتاً از چنین تماس هایی تشکیل شده است. تمام تعاملات با دستگاه ها و منابع خارجی سیستم عامل معمولاً از طریق چنین عملکردهایی انجام می شود. اتاق عمل سیستم ویندوزاز مدل حافظه تخت استفاده می کند. آدرس هر مکان حافظه توسط محتویات یک ثبات 32 بیتی تعیین می شود. 3 نوع ساختار برنامه برای ویندوز وجود دارد: گفتگو (پنجره اصلی یک گفتگو)، ساختار کنسول یا بدون پنجره، ساختار کلاسیک (پنجره، قاب).

زنگ زدن ویژگی های ویندوز API در فایل راهنما، هر تابع API به صورت نوع function_name نمایش داده می شود (FA 1، FA 2، FA 3) نوع – نوع مقدار بازگشتی. FAX - لیستی از آرگومان های رسمی به ترتیب آنها. به عنوان مثال، پیام int. جعبه (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 اسمبلر استفاده می شود. در این حالت، تمام آرگومان های تابع از طریق پشته (فرمان PUSH) به آن ارسال می شود. جهت عبور آرگومان: از چپ به راست - پایین به بالا. آرگومان u ابتدا به پشته فشار داده می شود. نوع زنگ زدن عملکرد مشخص شدهبه این شکل خواهد بود: پیام تماس. جعبه [ایمیل محافظت شده]

فراخوانی توابع 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

زنگ

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