s.amir hossein malati
s.amir hossein malati
خواندن ۳ دقیقه·۴ سال پیش

گزارش پیاده سازیه ماشین حساب به زبان اسمبلی


به نام خدا

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

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

ابتدا به تعریف چند دستور می پردازم:

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

سگمنت:سگمنت ناحیه ای از حافظه است که آدرس شروع آن بر ۱۶ قابل قسمت است و از مرز پاراگراف شروع می شود. اندازه سگمنت می تواند تا ۶۴ کیلو بایت باشد. برنامه ها اسمبلی چهار نوع سگمنت دارد که در زیر مشاهده می کنید:

  • سگمنت داده (Data segment) : در این بخش داده ها و ناحیه کاری قرار می گیرد.
  • سگمنت کد (Code segment) : دستورات زبان ماشین در این بخش قرار می گیرند.
  • سگمنت پشته (Stack segment) : در این بخش آدرس بازگشت از زیر برنامه ها قرار می گیرد.
  • سگمنت اضافه (Extra segment) : این سگمنت برای انجام عملیات بر روی رشته ها مورد استفاده قرار می گیرد.

وقفه:هر رويدادی که باعث شود CPU اجرای عادی يک برنامه را قطع کند وقفه ناميده می شود. يک برنامه نويس اسمبلی با صدور وقفه های نرم افزاری می تواند به طور موثری با دستگاه های جانبی ارتباط برقرار کند.

چند وقفه متعارف:وقفه 21h

تابع 01h. يک کليد را از صفحه کليد می خواند.
کد کليد خوانده شده در ثبات AL برگردانده می شود.

mov AH, 0lh
int 21h
mov AL, character

تابع 02h. يک کاراکتر را روی صفحه نمايش نشان می دهد.
کد کاراکتر در ثبات DL بايد قرار داده شود.

mov AH, 02h
mov DL,character
int 21h

تابع 09h. يک رشته کاراکتری را روی صفحه نمايش نشان می دهد.
آدرس شروع رشته بايد در ثبات های DS:DX قرار بگيرد. انتهای رشته توسط کاراکتر ($) بايد تعيين شده باشد.

mov AH,09h
lea DX, string
int 21h

وقفه 10h

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

شماره صفحه در BH، شماره سطر در DH و شماره ستون در DL بايد قرار بگيرد. مختصات صفحه از نقطه 0 و 0 از گوشه بالای چپ صفحه نمايش شروع می شود.

mov AH, 02h
mov BH, page
mov DH, row
mov DL, column
int 10h

تابع 09h. يک کاراکتر را با رنگ معين چندبار نمايش می دهد.
کد کاراکتر در AL، شماره صفحه در BH، خاصيت رنگ کاراکتر در BL و تعداد تکرار کاراکتر در CX بايد قرار بگيرد.

mov AH, 09h
mov AL, character
mov BH, page
mov BL, attribute
mov CX, number
int 10h


سناریوی پیاده سازی به زبان ساده:

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

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

(اپراتور ها + و * و - و %)

در قسمت سوم با پیغام سوم کاربر عدد دوم را وارد می کند که همانند قسمت یک می باشد

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

در ویدیوی زیر تمامی این مراحل به صورت خط به خط توضیح دادم .

https://www.aparat.com/v/8XctN

شادوپیروز باشید.


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