دوره های آموزشی آکادمی پی وی لرن (پروژه محور و ویژه بازار کار)



  • ۱۵
  • اردیبهشت

جلسه ۱۲ : ساختار شرطی در زبان اسمبلی (Assembly)

  • دسته‌بندی‌ها :
جلسه ۱۲ : ساختار شرطی در زبان اسمبلی (Assembly)
    • جزئیات
    • نوع محتواآموزشی

      همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. در این بخش از آموزش، مبحث ساختار شرطی در زبان اسمبلی (Assembly) خواهیم داشت و به بررسی مواردی چون پرش شرطی (Conditional Jump) و غیر شرطی و دستورالعمل CMP می پردازیم. با ادامه ی آموزش ها همراه باشید.

      ساختار شرطی در زبان اسمبلی (Assembly)

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

      ساختار شرطی در زبان اسمبلی (Assembly) را در جدولی داریم.

      ردیفساختار شرطی
      ۱ پرش غير شرطي (unconditional Jump)

      توسط دستورالعمل JMP انجام می شود. اجرای شروط غالباً شامل انتقال كنترل به آدرس دستورالعملی است كه از دستورالعمل اجرای كنونی پیروی نمی كند. انتقال کنترل ممکن است رو به جلو باشد ، برای اجرای مجموعه جدیدی از دستورالعمل یا قبلی، اجرای دوباره همان مراحل.

       

      ۲پرش شرطي (Conditional jump)

      بسته به شرایط ، توسط مجموعه ای از دستورالعمل های پرش <j <condition انجام می شود. دستورالعمل های شرطی، کنترل را با شکستن جریان پی در پی انتقال می دهند و آن ها را با تغییر مقدار افست در IP انجام می دهند.

      بگذارید قبل از بحث در مورد دستورالعمل های شرطی ، دستورالعمل CMP را مورد بحث قرار دهیم.

      دستورالعمل CMP

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

      سینتکس

      مثال : 

      CMP دو فیلد داده عددی را مقایسه می کند. عملوند مقصد می تواند در ثبات یا در حافظه باشد. عملوند منبع می تواند یک داده ثابت (فوری)، ثبات یا حافظه باشد.

      مثال

      مثال : 

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

      مثال : 

      پرش غير شرطي (Unconditional Jump)

      همان طور که قبلاً ذکر شد ، این کار با دستور JMP انجام می شود. اجرای شروط غالباً شامل انتقال كنترل به آدرس دستورالعملی است كه از دستورالعمل اجرای كنونی پیروی نمی كند. انتقال کنترل ممکن است رو به جلو باشد ، برای اجرای مجموعه جدیدی از دستورالعمل یا قبلی، اجرای دوباره همان مراحل.

      سینتکس

      دستورالعمل JMP نام لیبلی را در اختیار شما قرار می دهد که سریعاً جریان کنترل انتقال یابد. سینتکس دستورالعمل JMP به شکل زیر است.

      مثال : 

      مثال

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

      مثال : 

      پرش شرطی (Conditional Jump)

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

      در زیر دستورالعمل های پرش شرطی مورد استفاده در داده های علامت دار مورد استفاده برای عملیات حسابی آمده است.

      دستورالعملشرحFlag ها
      JE/JZپرش در صورتی که مساوی است یا پرش در صورتی که صفر است.ZF
      JNE/JNZپرش در صورتی که مساوی نیست یا پرش در صورتی که صفر نیست.ZF
      JG/JNLEپرش در صورتی که پایین و مساوی نیست یا پرش در صورتی که بزرگ تر است.OF, SF, ZF
      JGE/JNLپرش در صورتی که پایین نیست یا پرش در صورتی که بزرگ تر یا مساوی است.OF, SF
      JL/JNGEپرش در صورتی که پایین است یا پرش در صورتی که بزرگ تر یا مساوی نیست.OF, SF
      JLE/JNGپرش در صورتی که پایین و مساوی است یا پرش در صورتی که بزرگ تر نیست.OF, SF, ZF

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

      دستورالعملشرحFlag ها
      JE/JZپرش در صورت مساوی بودن یا پرش در صورت صفر بودنZF
      JNE/JNZپرش در صورت مساوی نبودن یا پرش در صورت صفر نبودنZF
      JA/JNBEپرش در صورتی که بالاتر است یا پرش در صورتی که پایین یا مساوی نیست.CF, ZF
      JAE/JNBپرش در صورتی که پایین نیست یا پرش در صورتی که بالاتر یا مساوی استCF
      JB/JNAEپرش در صورتی که پایین است یا پرش در صورتی که بالاتر یا مساوی نیست.CF
      JBE/JNAپرش در صورتی که بالا نیست یا پرش در صورتی که پایین یا مساوی است.AF, CF

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

      دستورالعملشرحFlag ها
      JXCZJump if CX is Zeronone
      JCپرش در صورتی که رقم نقلی وجود دارد.CF
      JNCپرش در صورتی که رقم نقلی وجود ندارد.CF
      JOپرش در صورتی که سرريز وجود دارد.OF
      JNOپرش در صورتی که سرريز وجود ندارد.OF
      JP/JPEپرش در صورتی که پريتی زوج است یا پرش در صورتی که پريتی است.PF
      JNP/JPOپرش در صورتی که پريتی فرد است یا پرش در صورتی که پريتی نیست.PF
      JSپرش در صورتی که مثبت است.SF
      JNSپرش در صورتی که منفی است.SF

      سینتکس مجموعه دستورالعمل های J <condition> :

      مثال

      مثال : 

      در ادامه مثال دیگری را بررسی می کنیم.

      مثال

      برنامه زیر بزرگ ترین از سه متغیر را نشان می دهد. متغیرها متغیرهای دو رقمی هستند. سه متغیر num1 ، num2 و num3 به ترتیب دارای مقادیر ۴۷ ، ۲۲ و ۳۱ می باشند.

      مثال : 

      هنگامی که کد فوق کامپایل و اجرا می شود ، نتیجه زیر را ایجاد می کند.

      مثال : 

      مبحث ساختار شرطی در زبان اسمبلی (Assembly) را در این بخش به پایان می رسونیم.

      کلام پایانی

      در مبحث ساختار شرطی در زبان اسمبلی (Assembly) به بررسی پرش شرطی (Conditional Jump) و غیر شرطی و دستورالعمل CMP پرداختیم. در جلسه ی آینده مبحث حلقه ها را مورد بررسی قرار خواهیم داد. با  آموزش زبان اسمبلی (Assembly) از وب سایت آموزشی پی وی لرن همراه باشید.

      QR:  جلسه ۱۲ : ساختار شرطی در زبان اسمبلی (Assembly)
      به اشتراک بگذارید