اطلاعیه

Collapse
No announcement yet.

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

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #91
    پاسخ : برنامه نویسی به زبان اسمبلی

    روتین های 8 و 16 بیتی ضرب و تقسیم به زبان اسمبلی:

    http://atmel.com/dyn/resources/prod_...nts/AVR200.zip
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #92
      پاسخ : برنامه نویسی به زبان اسمبلی

      در ایام اخیر مشغول تغییرات و بهینه سازی کدهای یک کنترل کننده صنعتی مبتنی بر AVR هستم که بخشی از عملکرد آن فقط با برنامه نویسی اسمبلی امکان انجام وظایف مورد نظر را دارد و به هیچ وجه و با هیچ کامپایلر دیگری این امکان وجود نداشت که بتوان از خانواده AVR برای کاربرد مورد نظر جواب گرفت ( به دلیل Load بیش از حد CPU). در همین حال به یاد این تاپیک افتادم و به نظر رسید ذکر این مطلب خالی از فایده نباشد که برنامه نویسی اسمبلی در جایگاه خود دارای توانمندی و زیبایی های فوق العاده ای است که برای بعضی از کاربردهای time critical ( که قبلا به نمونه هایی از آن اشاره شده) قدرت بی رقیبی را برای فعال کردن حداکثر توانایی های میکروکنترلر در اختیار برنامه نویس قرار می دهد و افراد فاقد تسلط به این نوع برنامه نویسی از دسترسی به آن محروم هستند. به همین دلیل گاهی لازم می شود برای رسیدن به عملکردی که با برنامه نویسی اسمبلی توسط AVR قابل انجام است، به دلیل عدم تسلط به آن از خانواده های قوی تر و سریعتر استفاده کنیم و این تفاوت خانواده می تواند هزینه های مالی و زمانی را در انجام طرح ها تحمیل کند.
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


        #93
        پاسخ : برنامه نویسی به زبان اسمبلی

        در لینک زیر چندین روتین مفید اسمبلی مانند تقسیم 32 بیت بر 32 بیت و جذر و محاسبه CRC و غیره توسط آقای Chan قرار داده شده است:

        http://elm-chan.org/cc_e.html
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #94
          پاسخ : برنامه نویسی به زبان اسمبلی

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

          دیدگاه


            #95
            پاسخ : برنامه نویسی به زبان اسمبلی

            دو تا سوال دیگه هم دارم :biggrin:
            1)چرا در دو دستور INC و DEC کری فلگ یا CF تغییری نمی کند ؟
            اگه میشه دلایلش هم بگین. :biggrin:
            2)چرا برای SET و clear کردن TF و OF دستور العمل اسمبلی مستقیمی وجود ندارد ؟
            و چگونه می توان انها را به صورت غیر مستقیم SET و CLEAR کرد؟

            دیدگاه


              #96
              پاسخ : برنامه نویسی به زبان اسمبلی

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

              http://academic.evergreen.edu/projec...rogram/bcd.htm

              نوشته اصلی توسط hirad
              1)چرا در دو دستور INC و DEC کری فلگ یا CF تغییری نمی کند ؟
              اگه میشه دلایلش هم بگین.
              دو دلیل ممکن است وجود داشته باشد. یکی اینکه بنا به تشخیص طراحان معماری AVR، تغییر نکردن carry ممکن است از نظر ایجاد کد بهینه تر موثر باشد. دلیل دیگر می تواند وجود محدودیتی در طراحی ALU باشد که منجر به این خاصیت برای این دستورات شده است.

              نوشته اصلی توسط hirad
              2)چرا برای SET و clear کردن TF و OF دستور العمل اسمبلی مستقیمی وجود ندارد ؟
              و چگونه می توان انها را به صورت غیر مستقیم SET و CLEAR کرد؟
              اینطور نیست و دستورات CLT و SET برای صفر و یک کردن T flag و CLV و SEV برای صفر و یک کردن overflow flag وجود دارند.
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


                #97
                پاسخ : برنامه نویسی به زبان اسمبلی

                سلام
                من چند تا سوال مبتدی داشتم :

                چرا در همه کامپایلر ها از بعضی علامت های خاص مثل . # $ در بعضی دستورات استفاده میشه .(آیا این کاراکتر ها در کامپایل کد به کامپایلر کمک می کنند تا واسه زیبایی گذاشتن؟)؟

                #INCLUDE
                $INCLUDE
                .INCLUDE

                یا ORG. این نقطه واسه چیه؟

                آیا در AVR STUDIO میشه به زبان C هم نوشت ؟

                Routine روتین یعنی چه؟

                :read:

                یادش بخیر یه وقتایی هر روز میومدم اینجا !

                دیدگاه


                  #98
                  پاسخ : برنامه نویسی به زبان اسمبلی

                  با اجازه جناب کیآ‌نژاد
                  در مورد علائمی که اشاره فرمودید، معمولا این علامتآ‌ها برای کامپایلرها یا اسمبلرها معانی خاصی دارند و بیانگر مطلب یا مفهوم خاصی هستند که کامپایلر یا اسمبلر زمان ترجمه برنامه با رسیدن به این علائم عمل لازم را انجام میآ‌دهند، این علائم جزو دستورات میکروکنترلر نمیآ‌باشند و فقط جهت زاهنمایی کامپایلر جهت ترجمه صحیح و بهتر برنامه به کار میآ‌روند. به عنوان مثالمعمولا علامت # قبل از دستورات پیش پردازنده به کار میآ‌رود که کامپایلر زمان ترجمه با دیدن این علامت متوجه میآ‌شود که دستوری که در جلو این علامت قرار دارد دستور پیش پردازنده است نه کد اجرایی میکروکنترلر یا در بعضی از اسمبلرها علامت $ جهت برگرداندن آدرس محلی است که در آنجا نوشته میآ‌شود مثلا JMP $ در 8051 برای پرش به همان آدرس فعلی است و در واقع یک حلقه ایجاد میآ‌کند که مرتبا در همان مکان به چرخش در میآ‌آید مانند while(1); در زبان C
                  نقطه ای که میآ‌فرمایید به صورت قرار دادی هست و ممکن هست در کامپایلرهای مختلف تفاوت داشته باشد،آ‌ به عنوان مثال در کامپایلر اسمبلر مایکروچیپ برای میکروکنترلرهای PIC قبل از ORG نقطه لازم نیست، یا مثلا در AVR Studio بعد از lable ها باید : قرار دهید اما در بعضی اسمبلرها لازم نیست.
                  بله تا آنجا که اطلاع دارم بعضی از کامپایلرها مانند IAR میآ‌توانند در محیط AVR Studio عمل کامپایل را انجام دهند، در این مورد حتما جناب طراح پاسخ بهتر و کاملآ‌تری خواهند داد.
                  Routine رو هم فکر میآ‌کنم در همین پست توضیح داده شده باشه، اگر نبود چشم.
                  از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
                  هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
                  اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
                  اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
                  شاد و موفق باشید

                  دیدگاه


                    #99
                    پاسخ : برنامه نویسی به زبان اسمبلی

                    نوشته اصلی توسط مــــــیــــــــلاد
                    آیا در AVR STUDIO میشه به زبان C هم نوشت ؟

                    Routine روتین یعنی چه؟
                    اگر Winavr را نصب کنید، در AVRStudio می توانید با AVR GCC برنامه بنویسید و کامپایل و شبیه سازی کنید. خروجی کامپایل شده IAR هم در AVRStudio قابل شبیه سازی است، اما محیط برنامه نویسی و کامپایل در همان IAR است که محیطی جداگانه است.

                    روتین در اصطلاح به مجموعه ای از کدها گفته می شود که برای انجام وظیفه خاصی نوشته می شود، مثلا روتین اسکن صفحه کلید، روتین refresh کردن 7segment و مانند آن. اگر یک روتین از نقاط مختلف برنامه قابلیت اجرا و احضار داشته باشد، به آن زیرروال یا subroutine گفته می شود که یکبار نوشته می شود، اما از نقاط مختلف call می شود.
                    اوژن: به معنای افکننده و شکست دهنده است
                    دانایی، توانایی است-Knowledge is POWER
                    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                    دیدگاه


                      پاسخ : برنامه نویسی به زبان اسمبلی

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



                      یادش بخیر یه وقتایی هر روز میومدم اینجا !

                      دیدگاه


                        برنامه نویسی به زبان اسمبلی "مقاله"

                        فایل مربوطه را حذف کردم انشا الله بعد از ویرایش اینجا می زارم
                        :bye :bye
                        یادش بخیر یه وقتایی هر روز میومدم اینجا !

                        دیدگاه


                          پاسخ : برنامه نویسی به زبان اسمبلی

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

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

                          2- یک روش در برنامه نویسی آن است که همیشه فقط از ابزارهای برنامه نویسی ساده تر و قابل فهم تر استفاده کنیم و بپذیریم که به همان بازده بدست آمده از آن روش اکتفا کنیم و در صورت نیاز به قدرت پردازش بیشتر به خانواده های قوی تر روی بیاوریم. به عبارت دیگر فرض کنیم با برنامه نویسی C بتوانیم مثلا از 70 درصد راندمان AVR از نظر حداکثر سرعت پردازش در یک کاربرد خاص استفاده کنیم. یک راه این است که اگر به سرعت بیشتری نیاز داشته باشیم، خانواده های دیگری را که با همان برنامه نویسی C جوابگوی نیاز ما باشند، مورد استفاده قرار دهیم و سقف قابل دستیابی برای AVR در آن کاربرد را در همان حد در نظر بگیریم. اما مسلم است که اگر یک برنامه نویس C بتواند در شرایط لازم به اسمبلی هم برنامه بنویسد، در مواردی این توانایی می تواند یک امتیاز بزرگ محسوب شود که گاهی کاربردهایی را که از طریق سایر روش های برنامه نویسی قابل انجام نباشد از طریق برنامه نویسی اسمبلی محقق کند.

                          3- در بعضی شرایط استفاده از برنامه نویسی اسمبلی به دلایلی گریز ناپذیر است. چنانکه مثلا در کتابخانه های Atmel برای XMEGA درباره adc یا eeprom مشاهده می کنیم که علیرغم آنکه کتابخانه با زبان C نوشته شده، اما بخشی از آن هم به زبان اسمبلی است که این به دلیل لزوم دسترسی به بخش هایی از XMEGA از طریق رجیسترهای بخصوصی است که در برنامه نویسی C محقق نمی شود و حتما باید به اسمبلی نوشته شود.

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

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


                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            پاسخ : برنامه نویسی به زبان اسمبلی

                            با سلام میشه بگید این میکرو چه عملیاتی را انجام میداد که فقط با اسمبلی میشد بنویسی؟مثلا روتین های محاسباتی زیادی داشت؟

                            دیدگاه


                              پاسخ : برنامه نویسی به زبان اسمبلی

                              با سلام
                              یه سوال داشتم در مورد تبدیل کد گری به باینری به زبان اسمبلی.... توو تبدیل باینری به گری راحت میشد برنامه رو نوشت اما برا تبدیل گری به باینری نمی دونم با چه روندی باید کد گری رو با خودش xor کنیم.... از دوستان اگه کسی بتونه کمکم کنه ممنون می شم

                              صورت سوال:
                              "برنامه ای بنویسید که کد گری واقع در R20 را به کد باینری تبدیل کرده و در R21 نشان دهد."
                              (atmega 32)

                              دیدگاه


                                پاسخ : برنامه نویسی به زبان اسمبلی

                                با اجازه جناب طراح من هم نکته ای به ذهنم رسیده.
                                بعضی موارد مجبور هستیم یا کلا داریم از یک کامپایلر به عنوان یک ابزار تولید کد استفاده میکنیم. نوشتن یک کد بسیار بهینه با یک کامپایلر بخصوص؛ غیر از دانستن زبان مورد استفاده نیاز به شناخت بسیار خوبی از نحوه تولید و بهینه سازی کد چه در زمان کامپایل توسط کامپایلر و چه در زمان لینک دارد. که البته همیشه مقدور نیست. غیر از آن یک کامپایلر یک ابزار عمومی برای کارهای عمومی است. ممکن است بتوان برای هر موردی تولید کد را بشدت سفارشی کرد اما باز هم ممکن است نظر برنامه نویس را تامین نکند.
                                بگذارید مثالی بزنم. (این مورد برای خودم پیش آمده). فرض کنید میخواهیم یک switch بنویسیم که به ازای رنج کامل مقادیر 0 الی 255 اعمال متفاوتی صورت گیرد. در نحوه کد تولیدی معمولا کامپایلر ها معادل کد زیر را تولید میکنند:


                                switch( value )
                                {
                                case 0: .... break;
                                case 1: .... break;
                                .
                                .
                                .
                                case 255: .... break;
                                }

                                compiled to something like:

                                if( value <= 255 )
                                jmp jump_table[value];



                                در این کد دو مورد وجود دارد. اولا با اینکه میدانیم مقدار value همیشه بین صفر تا 255 است ولی باز کامپایلر کد چک کردن مقدار value را انجام میدهد. و مهمتر از آن برای پرش به جدول پرش از یک کد 7 الی 8 سیکل استفاده میکند:

                                مثلا:

                                mov ZL,value
                                clr ZH
                                subi ZL,lo8(dispatch_table)
                                sbci ZH,hi8(dispatch_table)
                                ijmp


                                که با فرض اینکه اگر جدول پرش را در یک آدرس قابل تقسیم به 256 word قرار داده باشیم میتوان کد زیر را برای همین عمل استفاده کرد:


                                mov ZL,value
                                ldi ZH,hi8(dispatch_table)
                                ijmp


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

                                دیدگاه

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