اطلاعیه

Collapse
No announcement yet.

سوال درباره نحوه عمل تقسیم توسط دستورات اسمبلی AVR

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    سوال درباره نحوه عمل تقسیم توسط دستورات اسمبلی AVR

    در مجموعه دستورات اسمبلی avr دستور تقسیم نیست.برای اینکه بخوایم توسط دستورات اسمبلی ، محتوای یک رجیستر را بر رجیستر دیگر تقسیم کنیم باید چه بنویسیم؟

    #2
    پاسخ : سوال درباره نحوه عمل تقسیم توسط دستورات اسمبلی AVR

    دوست عزیز از اونجا که تقسیم هم نوعی ضرب کسری هست برای اینکار شما باید از دستورات ضرب برای اعداد اعشاری استفاده کنید، به عنوان مثال اگر میخواید عدد 10 رو بر 2 تقسیم کنید باید 10 رو در یک رجیستر بریزید و عدد اعشاری پنج دهم رو در رجیستر دیگه، بعد دو رجیستر رو در هم ضرب کنید که حاصل میشه همون 10 تقسیم بر 2، برای اعداد دیگه هم به همین شکل هست. کمی مشکل هست ( مشکل یعنی پر دردسر ) اما راهش همین هست. در instruction set در قسمت دستورات محاسباتی میتونید دستورات مربوط به ضرب اعشاری علامت دار و بدون علامت رو مشاهده کنید و از اونها استفاده کنید.
    از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
    هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
    اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
    اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
    شاد و موفق باشید

    دیدگاه


      #3
      پاسخ : سوال درباره نحوه عمل تقسیم توسط دستورات اسمبلی AVR

      http://atmel.com/dyn/resources/prod_documents/doc0936.pdf
      http://atmel.com/dyn/resources/prod_documents/AVR200.zip
      There is nothing so practical as a good theory. — Kurt Lewin, 1951

      دیدگاه


        #4
        پاسخ : سوال درباره نحوه عمل تقسیم توسط دستورات اسمبلی AVR

        به نظر می رسد راه تقسیم این نباشد. دو دلیل به ذهنم می رسد.دلیل اول اینکه فرض کنید می خواهیم 12 را بر 3 تقسیم کنیم اگر قرار باشد از ضرب استفاده کنیم باید 12 را در یک سوم ضرب کنیم یعنی در 333/0 که جواب هرگز به عدد 4 که حاصل تقسیم است نخواهد رسید.دلیل دوم اینکه فرض کنیم بجای تقسیم بتوان از ضرب استفاده کرد اونوقت این روش تنها زمانی قابل استفاده است که محتوای رجیسترها را در هر مرحله که برنامه باید دو رجیستر را بر هم تقسیم کند بدانیم و برویم عدد مناسب برای هر مرحله را با ماشین حساب محاسبه کنیم و در رجیستر بریزیم تا با ضرب آنها در هم به جواب تقسیم برسیم که در عمل این روش غیر ممکن است.

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

        دیدگاه


          #5
          پاسخ : سوال درباره نحوه عمل تقسیم توسط دستورات اسمبلی AVR

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

          دیدگاه


            #6
            پاسخ : سوال درباره نحوه عمل تقسیم توسط دستورات اسمبلی AVR

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

            دیدگاه


              #7
              پاسخ : سوال درباره نحوه عمل تقسیم توسط دستورات اسمبلی AVR

              نوشته اصلی توسط علی حیاتی
              سلام
              شما برای تقسیم دو عدد می توانی از الگوریتم تفریق استفاده کنید مثل ضرب که می توان از الگوریتم جمع استفاده کرد.
              علی جان این رو که خودش هم گفته بود :smile:
              در مورد ضرب درسته، خیلی از میکروکنترلر ها حتی همون دستورات ضرب که AVR داره رو هم ندارند و برنامه نویس مجبور هست که از روشی که شما گفتی استفاده کنه ولی خوب اگر باشه دیگه لازم نیست آدم اینقدر CPU رو سرکار بزاره، برای تقسیم هم در مواردی که میشه از روش عکس ضرب جواب مورد نظر رو گرفت این راه بهتر هست، ولی خوب توی بعضی تقسیم ها برنامه نویس مجبور هست دوباره cpu رو سرکار بزاره مثل همینی که خود daryanavard عزیز اشاره کرد. من غیر از این سه روش عکس ضرب و تفریق متوالی و دستورات شیفتی که هر کدوم هم ویژگیهای خودشون رو دارند چیز بیشتری فعلا به ذهنم نمیرسه، اگر کسی غیر از اینا راهی بدونه ( حتی اگر مناسب نباشه ) و به ما هم یاد بده ممنون میشیم.
              از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
              هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
              اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
              اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
              شاد و موفق باشید

              دیدگاه

              لطفا صبر کنید...
              X