اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام،
    شکی نیست که سرعت محاسبات و پردازش با زبان اسمبلی بالاتر از زبانهای سطح بالاست. این مسئله باعث میشه که حافظه ی برنامه ی کمتری مصرف بشه و مصرف توان هم پایین بیاد (چون برای رسیدن به همان سرعت در زبان سطح بالا باید کلاک را افزایش دهیم که موجب افزایش مصرف می شود). اما به نظر من حالت ترکیبی بهترین روشه، به این صورت که برنامه به زبان C نوشته بشه و روتین های Time-Critical به صورت اسمبلی نوشته شوند (اسمبلی با C ترکیب شود).
    There is nothing so practical as a good theory. — Kurt Lewin, 1951

    دیدگاه


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

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

      دیدگاه


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

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

        دیدگاه


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

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

          دیدگاه


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

            تاکنون در مورد بسیاری از امکانات برنامه نویسی به زبان اسمبلی توضیح داده شده و لازم است یک یادآوری در مورد شیوه برنامه نویسی به این زبان به عمل آید. برنامه نوشته شده به این زبان در شکل ساده خود معمولا از مراحل زیر تشکیل می شود:
            - تعریف محل شروع برنامه و بردارهای وقفه
            - مقدار دهی اشاره گر به پشته ( در XMEGA لازم نیست)
            - مقدار دهی اولیه به رجیسترهایی در مجموعه R0-R31 که در برنامه مورد استفاده قرار می گیرند.
            - مقدار دهی اولیه به نقاط لازم در SRAM
            - مقداردهی به رجیسترهای کنترل کننده سخت افزار
            - فعال کردن وقفه ها
            - حلقه اصلی نرم افزار
            - سرویس روتین وقفه ها
            - زیربرنامه ها
            - جداول از قبل تعریف شده یا Lookup tables
            لازم به یادآوری است که مقدار دهی اولیه به R0-R31 و نقاط SRAM می تواند از اطلاعات ذخیره شده در EEPROM انجام شود و این اطلاعات می تواند توسط user در طول اجرای برنامه تغییر کند. همچنین در خانواده XMEGA لازم است برخی اطلاعات لازم که توسط کارخانه سازنده ذخیره شده اند، از طریق NVM controller بازیابی و در رجیسترهای کنترل کننده سخت افزار نوشته شوند.

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

            دیدگاه


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

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

              http://www.dutchtronix.com/

              http://www.franktechniek.nl/Kits/osc...scopeclock.htm

              http://www.timefracture.org/vectclk.html

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

              دیدگاه


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

                سلام
                یه سوال :
                اگه من بخواهم یه حلقه ی مثلا 80000 درست کنم با اسمبلی و طبق معمول با بیشترین سرعت چی باید بنویسم؟
                توی youtube هم کلی دمو هست که داران با Xmega فیلم پخش میکنن با استفاده از ال سی دی های بزرگ اگه میشه جناب طراح برنامه رو چک کنین "توی تاپیک Elt240320atp" هست ببینین چی کار میشه کرد الان من
                برای هر پیکسل متغییر dat رو مقدار دهی میکنم و تابع زیر رو فراخوانی مینمایم درسته؟
                Lcdout:
                cbi Lcd_cs_port,lcd_cs_pin_num
                sbi Lcd_rs_port,lcd_rs_pin_num
                Porth_out = High(dat)
                Portj_out = Dat
                cbi Lcd_wr_port,lcd_wr_pin_num
                sbi Lcd_wr_port,lcd_wr_pin_num
                sbi Lcd_cs_port,lcd_cs_pin_num
                Ret
                با تشکر
                الهم عجل لولیک الفرج

                فقط 313 نفر...

                دیدگاه


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

                  نوشته اصلی توسط FAM
                  اگه من بخواهم یه حلقه ی مثلا 80000 درست کنم با اسمبلی و طبق معمول با بیشترین سرعت چی باید بنویسم؟
                  منظور از حلقه 80000 چیست؟ آیا منظور این است که 80000 بار عملی را انجام دهد؟

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

                  دیدگاه


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

                    یه حلقه ای که 80000 بار تکرار شود سپس از حلقه خارج و یا به لیبلی برود.
                    http://www.eca.ir/forum2/index.php?topic=30608.0
                    راستی اگه میشه زحمت سوال آخر پست قبل رو بکشید. :agree:
                    الهم عجل لولیک الفرج

                    فقط 313 نفر...

                    دیدگاه


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

                      برای 80000 هزار بار تکرار یک حلقه می توانید بصورت زیر عمل کنید:
                      Ldi r24,low(80000)
                      Ldi r25, high(80000)
                      Loop:
                      عمل مورد نظر
                      Sbiw r24,1
                      Brne loop
                      ...


                      در مورد کد نوشته شده برای LCD از نقطه نظر کد نویسی باید به این نکته اشاره شود که در XMEGA دستورات sbi و cbi فقط می توانند در مورد پورتهای مجازی بکار روند و اگر پین هایی را که تعریف کرده اید به پورتهای مجازی نسبت داده نشده باشند، استفاده از این دستورات ممکن نیست.
                      از منظر LCD هم باید فرصتی پیش بیاید و Datasheet مورد نظر را مطالعه کنم تا صحت روال مذکور بررسی شود. اما یک مسئله که در همینجا می توان به آن اشاره کرد، Timing بین سیگنال های LCD است که در کلاک های بالا باید مراقب باشید که در محدوده مجاز باشد و Low و High شدن از حد ذکر شده در مشخصات قطعه سریعتر نباشد.
                      ضمنا تاپیک مورد نظر شما 17 صفحه است و لطفا صفحه مورد نظر خود را مشخص کنید.
                      اوژن: به معنای افکننده و شکست دهنده است
                      دانایی، توانایی است-Knowledge is POWER
                      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                      دیدگاه


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

                        سلام
                        ولی من با همین Cbi جواب گرفتم :eek:
                        مثلا Cbi Portk.0
                        در مورد LCD هم تا اونجایی که من میدونم بچه یی که با ARM کار میکنن حدود 32 فریم در ثانیه جواب گرفتن و مشکلی برای ال سی دی پیش نیومده.
                        با تشکر :bye
                        الهم عجل لولیک الفرج

                        فقط 313 نفر...

                        دیدگاه


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

                          نوشته اصلی توسط FAM
                          ولی من با همین Cbi جواب گرفتم :eek:
                          مثلا Cbi Portk.0
                          متاسفانه مشکل استفاده از BASCOM همچنان دامنگیر شماست و این مورد هم ناشی از همان مسئله است.
                          همانطور که گفته شد، با دستورات CBI و SBI فقط می توان روی Virtual port عمل کرد و این دستوری که شما فکر می کنید در BASCOM به اسمبلی نوشته اید( CBI PORTK,0) یک دستور به ظاهراسمبلی و در اصل خود ساخته این نرم افزار است و اگر حتی یک برنامه یک خطی با همین دستور بنویسید و فایل Hex آنرا در سیمولاتور AVRStudio بصورت اسمبلی ببینید، مشاهده می کنید که علاوه بر کدهای زیادی که بیجهت تولید می کند(مانند مقدار دهی اولیه به Stack Pointer)، همین یک خط به 3 خط برنامه اسمبلی تبدیل شده است. بنابراین شما عملا برای رسیدن به سرعت بالا با ابزاری کار می کنید که به ظاهر به اسمبلی برنامه می نویسید، اما در اصل با کدهایی که BASCOM تولید می کند، منظور شما حاصل نمی شود. اگر می خواهید به سرعت واقعی ناشی از برنامه نویسی اسمبلی برسید باید عطای BASCOM را به لقای آن ببخشید و نرم افزار را در محیطی مانند AVRStudio بنویسید. آنگاه متوجه خواهید شد که برای XMEGA دستوری مانند CBI PORTK,0 وجود خارجی ندارد.
                          کد اسمبلی که BASCOM برای دستور فوق تولید می کند به شرح زیر است:

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

                          دیدگاه


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

                            متسفانه بزرگترین مشکل منم همینه که دارم با بیسکام کار میکنم اما چون باید از سال دیگه همه ی وقتمو بزرام سر کنکور به همین دلیل نمیتونم با کامپایلر های دیگه توی یکسال به توانایی هایی که الان توی بسکام دارم برسم پس مجبورن دارم باهاشش کارمیکنم.
                            اینجوری که گفتین فکر کنم پس این لییبلی که پایین براتون نوشتم در اسمبلی واقعی حدود 30 خط بشه به همین دلیل هم هست که سرعت اینقدر کمه چون من برای Refresh هر صفحه 76800بار این تابع فاراخونی میشه و 30*76800 یه عدد زیادی میشه.
                            ببینید من برای هر پیکسل باید 2تا بیتو 1 و 0 کنم یه متغییر Word رو روی 2 پورت مورد نظر قرار بدم و 3تا بیتو 0 و 1 بدم میتونید زحمت برنامه ی اینو بکشین به طوری کپی برابر اصل باشه :mrgreen: یعنی اگه 7 دستور میشه در موقع پروگرم کردن هم همون 7 دستور باشه. :agree:
                            با تشکری فراوان سرشاراز احترام.
                            الهم عجل لولیک الفرج

                            فقط 313 نفر...

                            دیدگاه


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

                              راستی یه سوال دیگه AVR-Studio میکروی Atxmega384a1 رو ساپورت نمیکنه البته من برای پروگرم کردن لازم دارم. برنامه ی پروگرمری هست که این آی سی رو ساپورت کنه و با MK2 ارتباط داشته باشه؟
                              آیا میشه توی خود AVR-Studio کاری کرد این میکرو رو هم ساپورت کنه؟
                              :mrgreen:باز هم مثله همیشه از شما تشکر میشه :mrgreen:
                              الهم عجل لولیک الفرج

                              فقط 313 نفر...

                              دیدگاه


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

                                توی صفحه ی 10 پاسخ 144 برنامه گذاشته شده. :agree:
                                الهم عجل لولیک الفرج

                                فقط 313 نفر...

                                دیدگاه

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