اطلاعیه

Collapse
No announcement yet.

سوالات اسمبلی

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

    #16
    پاسخ : سوالات اسمبلی

    نوشته اصلی توسط silicon0
    وقتی که ما یک متغیر در بیسیک تعریف میکنیم :

    dim a as byte

    این متغیر در کجای sram قرار میگیرد ؟ (در چه آدرسی و بر چه اساسی؟)
    در آدرسی که فضای مورد نیاز موجود باشد. شاید متغیر از نوع double word باشد باید فضای لازم برای ذخیره در دسترس باشد و این آدرس بر اساس قواعد کامپایلر تعیین می شود و حتما در آدرسی بالاتر از بزرگترین آدرس کنترل کننده سخت افزار میکرو هست و یا قواعد دیگری که رعایت آنها بر عهده کامپایلر هست و توسط نویسنده کامپایلر تعیین شده و برنامه نویس در آن دخالتی ندارد.
    اما نکته مهم این هست که در اسمبلی نوع و کلا متغیر معنایی ندارد. همه چیز به عهده خودتان هست که در فلان آدرس چه دیتایی قرار بگیرد.
    لینک زیر بسیار مفید هست اگر استفاده نکردید حتما استفاده کنید
    http://www.avr-asm-tutorial.net/avr_en/index.html
    گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

    دیدگاه


      #17
      پاسخ : سوالات اسمبلی

      حالا یه سوال سخت ! :biggrin:

      من بعد از مطالعه این مقاله:
      https://www.mediafire.com/?civ2ddhc6mqg8dh
      یک برنامه مولتی تسک بزبان اسمبلی و سپس در بیسیک نوشتم

      مشکل اینجاست که با تغییر مقادیر زیر:
      $657 ===== $69b
      $658 ===== $69c
      $659 ===== $69d
      $69e ===== $65a
      $69f ===== $65b
      (که آدرس ذخیره مقادیر کنترل کننده برنامه هستند)

      برنامه test0000 به برنامه test1111 تبدیل می شود که اولی کاملا درست کار می کند ولی دومی کار نمیکند

      حالا سوال من این هست که در ناحیه ای که 657$ تا 65b$ قرار دارد چه قسمتی
      از فضای sram توسط کامپایلر بسکام رزرو شده است که باعث بروز این مشکل می شود؟
      و اصولا قاعده کلی وعملی برای تعیین حافظه های پشته و رزرو خانه های حافظه
      در بسکام چیست ؟

      توضیحات کلی درباره برنامه :
      1 - تعاریف برنامه
      2 - 5 تسک برنامه
      3 - خروج از تسک 1 و ورود به تسک 2 برای اولین بار
      4 - خروج از تسک 1 و ورود به تسک 2 (حالت معمولی)
      5 - خروج از تسک 2 و ورود به تسک 3 برای اولین بار
      6 - خروج از تسک 2 و ورود به تسک 3 (حالت معمولی)
      7 - خروج از تسک 3 و ورود به تسک 4 برای اولین بار
      8 - خروج از تسک 3 و ورود به تسک 4 (حالت معمولی)
      9 - خروج از تسک 4 و ورود به تسک 5 برای اولین بار
      10 - خروج از تسک 4 و ورود به تسک 5 (حالت معمولی)
      11 - خروج از تسک 5 و ورود به تسک 1

      فایل های برنامه test0000 و test1111 به همراه فایل پروتئوس مدار :
      https://www.mediafire.com/?pg0h3azria49q6u
      من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
      آلبرت اینشتین
      منبع: http://fa.wikiquote.org

      دیدگاه


        #18
        پاسخ : سوالات اسمبلی

        هر کامپایلری ساز و کار داخلی خود را برای مدیریت حافظه دارد و دخالت و تغییر در آدرس های استفاده شده به گاهی کاملی در مورد نحوه مدیریت حافظه توسط کامپایلر نیاز دارد. برای بسکام توضیحاتی در بخش Memory usage در این مورد داده شده که به نظر نمی رسد چندان کافی باشد:

        http://mcselec.com/avrhelp/index.html?memory_usage.htm
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #19
          پاسخ : سوالات اسمبلی

          وقتی پای بسکام به میان بیاید کار سخت می شود!

          با اجرای کد test0000 در پروتئوس در حالت دیباگ مشخص شد که در آدرس مورد نظر در sram دیتایی ذخیره می شود که با توجه به کد شما احتمال دارد به دلیل استفاده از LCD آن محل توسط کامپایلر استفاده شده باشد که باید به سورس توابع LCD دسترسی داشت تا بتوان نظر قطعی داد.

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

          دیدگاه


            #20
            پاسخ : سوالات اسمبلی

            با تشکر زیاد از شما

            سوال بعدی درباره sram هست

            بعد از تعیین stack pointer با دستورات زیر :
            کد:
            ldi r16,high(ramend)
            out sph,r16
            ldi r16,low(ramend)
            out spl,r16
            متوجه شدم که مقدار stack pointer برابر با 85f $ یعنی 2143 می شود
            این در حالی است که میکرو کنترلر مورد استفاده من atmega32a بود
            و مسلما 2048 بایت رم دارد.
            ضمنا من در آدرس 10000 یا 2710 $ حافظه مقداری را نوشتم و دوباره خواندم .
            توضیح این موضوع چیه؟
            من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
            آلبرت اینشتین
            منبع: http://fa.wikiquote.org

            دیدگاه


              #21
              پاسخ : سوالات اسمبلی

              نوشته اصلی توسط Hamed Gh
              وقتی پای بسکام به میان بیاید کار سخت می شود!

              با اجرای کد test0000 در پروتئوس در حالت دیباگ مشخص شد که در آدرس مورد نظر در sram دیتایی ذخیره می شود که با توجه به کد شما احتمال دارد به دلیل استفاده از LCD آن محل توسط کامپایلر استفاده شده باشد که باید به سورس توابع LCD دسترسی داشت تا بتوان نظر قطعی داد.
              در برنامه test1111 خطوط مربوط به lcd و config اش رو حذف کردم ولی برنامه همچنان هنگ هست
              من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
              آلبرت اینشتین
              منبع: http://fa.wikiquote.org

              دیدگاه


                #22
                پاسخ : سوالات اسمبلی

                در رابطه با مقدار نهایی آدرس sram اگر در دیتاشیت به قسمت SRAM Data Memory مراجعه کنید جواب سوالتان را خواهید یافت.

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

                در رابطه با آدرس 10000 برای sram این مورد رو تست کردم که بدون پیغام خطایی خروجی مورد نظر حاصل شد و مشخص شد که برای میکرو atmega8 که دارای 1024 بایت sram هست دیتای مورد نظر در آدرس 0x310 یا 784 ذخیره شده یود. رابطه ای که این عدد با 10000 دارد این هست که اگر به طور متوالی 1024 را از 10000 کم کنیم در نهایت به این عدد می رسم که در محدوده sram هست.
                گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                دیدگاه


                  #23
                  پاسخ : سوالات اسمبلی

                  دستور fmul چطور کار میکنه ؟(help اتمل استودیو رو خوندم و نفهمیدم )

                  منظور از اعداد اعشاری فرمت 1.7 و فرمت 1.15 چیه؟

                  آیا برای ضرب اعشاری در اسمبلی بهتره از این دستور استفاده کنیم یا از روش ضرب(mul) وسپس تقسیم بر 10 استفاده کنیم ؟
                  من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
                  آلبرت اینشتین
                  منبع: http://fa.wikiquote.org

                  دیدگاه


                    #24
                    پاسخ : سوالات اسمبلی

                    اگر میکروی مورد نظر از دستوری به صورت سخت افزاری پشتیبانی می کند بهتر هست از آن استفاده کنید تا هم حجم کد کمتر شود و هم سرعت اجرا بیشتر ( ضرب 8بیت در 8بیت به صورت سخت افزاری در 2 سیکل و تنها با یک دستور اما نرم افزاری ؟!!) البته برای اعداد بدون علامت تنها در بازه 0 تا کمتر از 2 و اعداد علامت دار در باز 1- تا کمتر از 1+ قابل استفاده است و خارج از این بازه ها بهتر هست از روش ضرب بدون ممیز شناور استفاده شود.

                    در فایل های زیر توضیحات کاملی داده شده:
                    AVR200: Multiply and Divide Routines
                    AVR201: Using the AVR® Hardware Multiplier
                    گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                    دیدگاه


                      #25
                      پاسخ : سوالات اسمبلی

                      نوشته اصلی توسط Hamed Gh
                      در رابطه با test1111 به هر حال شما از ترکیب اسمبلی با بیسیک استفاده کردید که شاید قسمت اسمبلی تا حدودی تحت کنترل شما باشد اما قسمت بیسیک خیر. شما در قسمت بیسیک از توابع تاخیر هم استفاده کردید. اینها همه در حد حدس هستند و من اطلاعات دقیقی در رابطه با کامپایلر بسکام ندارم.
                      تاخیر ها رو هم حذف کردم بازم درست نشد
                      من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
                      آلبرت اینشتین
                      منبع: http://fa.wikiquote.org

                      دیدگاه


                        #26
                        پاسخ : سوالات اسمبلی

                        منابعی رو که گفته بودین مطالعه کردم اما به برنامه ای بر خوردم که نفهمیدم چطوری عمل میکنه

                        این برنامه تقسیم 16 بیت بر 16 بیت هست که اگر لطف کنید برام توضیح بدین که دقیقا چکار کرده ممنون میشم مثلا من میدونم که تقسیم در اسمبلی با تفریق متوالی انجام میشه اما اینجا اصلا معلوم نیست چکار کرده ! oo:
                        (برنامه رو هم تست کردم کاملا درسته )
                        کد:
                        .DEF ANSL = R0      ;To hold low-byte of answer
                        .DEF ANSH = R1      ;To hold high-byte of answer   
                        .DEF REML = R2      ;To hold low-byte of remainder
                        .DEF REMH = R3      ;To hold high-byte of remainder
                        .DEF  AL = R16      ;To hold low-byte of dividend
                        .DEF  AH = R17      ;To hold high-byte of dividend
                        .DEF  BL = R18      ;To hold low-byte of divisor
                        .DEF  BH = R19      ;To hold high-byte of divisor  
                        .DEF  C = R20      ;Bit Counter
                        
                            LDI AL,LOW(420)  ;Load low-byte of dividend into AL
                            LDI AH,HIGH(420) ;Load HIGH-byte of dividend into AH
                            LDI BL,LOW(10)  ;Load low-byte of divisor into BL
                            LDI BH,HIGH(10)  ;Load high-byte of divisor into BH
                        DIV1616:
                            MOVW ANSH:ANSL,AH:AL ;Copy dividend into answer
                            LDI C,17     ;Load bit counter
                            SUB REML,REML   ;Clear Remainder and Carry
                            CLR REMH     ;
                        LOOP:  ROL ANSL     ;Shift the answer to the left
                            ROL ANSH     ;
                            DEC C       ;Decrement Counter
                             BREQ DONE    ;Exit if sixteen bits done
                            ROL REML     ;Shift remainder to the left
                            ROL REMH     ;
                            SUB REML,BL    ;Try to subtract divisor from remainder
                            SBC REMH,BH
                             BRCC SKIP    ;If the result was negative then
                            ADD REML,BL    ;reverse the subtraction to try again
                            ADC REMH,BH    ;
                            CLC        ;Clear Carry Flag so zero shifted into A 
                             RJMP LOOP    ;Loop Back
                        SKIP:  SEC        ;Set Carry Flag to be shifted into A
                             RJMP LOOP
                        DONE:
                        و سوال دوم اینکه اگر در همین تقسیم 16بیت بر 16 بیت مقسوم از مقسوم علیه کوچکتر باشه (خارج قسمت اعشاری بشه ) برنامه باید چطور نوشته بشه
                        من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
                        آلبرت اینشتین
                        منبع: http://fa.wikiquote.org

                        دیدگاه


                          #27
                          پاسخ : سوالات اسمبلی

                          نحوه عملکرد روتین تقسیم در فایل زیر (شکل 1-8) توضیح داده شده است:

                          http://www.atmel.com/Images/doc0936.pdf

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

                          دیدگاه


                            #28
                            پاسخ : پاسخ : سوالات اسمبلی

                            نوشته اصلی توسط طراح
                            نحوه عملکرد روتین تقسیم در فایل زیر (شکل 1-8) توضیح داده شده است:

                            http://www.atmel.com/Images/doc0936.pdf
                            من بازم نفهمیدم چیکار کرده

                            در صورت کوچکتر بودن مقسوم از مقسوم الیه، خارج قسمت برابر صفر و باقیمانده برابر با مقسوم خواهد شد.
                            منظورم این برنامه نیست منظورم اینه که اگه مقسوم کوچکتر از مقسوم علیه بود باید چه جوری برنامه رو بنویسیم تا مثلا خارج قسمت رو تا 2 رقم اعشار محاسبه کنه؟
                            من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
                            آلبرت اینشتین
                            منبع: http://fa.wikiquote.org

                            دیدگاه


                              #29
                              پاسخ : سوالات اسمبلی

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

                              دیدگاه


                                #30
                                پاسخ : سوالات اسمبلی

                                نوشته اصلی توسط silicon0
                                این برنامه تقسیم 16 بیت بر 16 بیت هست که اگر لطف کنید برام توضیح بدین که دقیقا چکار کرده ممنون میشم مثلا من میدونم که تقسیم در اسمبلی با تفریق متوالی انجام میشه اما اینجا اصلا معلوم نیست چکار کرده ! oo:
                                (برنامه رو هم تست کردم کاملا درسته )
                                کد:
                                .DEF ANSL = R0      ;To hold low-byte of answer
                                .DEF ANSH = R1      ;To hold high-byte of answer   
                                .DEF REML = R2      ;To hold low-byte of remainder
                                .DEF REMH = R3      ;To hold high-byte of remainder
                                .DEF  AL = R16      ;To hold low-byte of dividend
                                .DEF  AH = R17      ;To hold high-byte of dividend
                                .DEF  BL = R18      ;To hold low-byte of divisor
                                .DEF  BH = R19      ;To hold high-byte of divisor  
                                .DEF  C = R20      ;Bit Counter
                                
                                    LDI AL,LOW(420)  ;Load low-byte of dividend into AL
                                    LDI AH,HIGH(420) ;Load HIGH-byte of dividend into AH
                                    LDI BL,LOW(10)  ;Load low-byte of divisor into BL
                                    LDI BH,HIGH(10)  ;Load high-byte of divisor into BH
                                DIV1616:
                                    MOVW ANSH:ANSL,AH:AL ;Copy dividend into answer
                                    LDI C,17     ;Load bit counter
                                    SUB REML,REML   ;Clear Remainder and Carry
                                    CLR REMH     ;
                                LOOP:  ROL ANSL     ;Shift the answer to the left
                                    ROL ANSH     ;
                                    DEC C       ;Decrement Counter
                                     BREQ DONE    ;Exit if sixteen bits done
                                    ROL REML     ;Shift remainder to the left
                                    ROL REMH     ;
                                    SUB REML,BL    ;Try to subtract divisor from remainder
                                    SBC REMH,BH
                                     BRCC SKIP    ;If the result was negative then
                                    ADD REML,BL    ;reverse the subtraction to try again
                                    ADC REMH,BH    ;
                                    CLC        ;Clear Carry Flag so zero shifted into A 
                                     RJMP LOOP    ;Loop Back
                                SKIP:  SEC        ;Set Carry Flag to be shifted into A
                                     RJMP LOOP
                                DONE:
                                اگر تقسیم 8 بیتی رو متوجه شده باشید اینجا هم به همان صورت هست فقط در محاسبات 16 بیتی عملیات شیفت و تفریق و جمع در دو مرحله انجام می شود.

                                DIV1616:
                                کپی مقسوم در رجیسترهای پاسخ(خارج قسمت) برای انجام عملیات شیفت روی آن

                                مقدار دهی شمارنده با 17

                                پاک کردن بایت پائین رجیسترهای باقیمانده.(چون عمل تفریق روی خودش انجام شده نتیجه صفر است بنابراین بیت carry هم صفر خواهد شد)

                                پاک کردن بایت بالای باقیمانده

                                LOOP:
                                شیفت به چپ رجیسترهای پاسخ در دو مرحله (بیت carry وارد آن شده و msb بایت بالایی وارد carry می شود)

                                مقدار شمارنده یک واحد کاهش می یابد

                                اگر مقدار شمارنده صفر شد به DONE پرش می کند (BREQ: پرش شرطی در صورتی که بیت Z حاصل از عملیات قبلی 1 شود)

                                شیفت به چپ رجیسترهای باقیمانده در دو مرحله (بیت carry وارد آن می شود)

                                تفریق مقسوم علیه از باقیمانده در دو مرحله

                                اگر بیت carry ست نشود به SKIP پرش می کند (ست شدن carry به معنای منفی شدن نتیجه تفریق هست (بزرگتر بودن مقسوم علیه) پس باید مقدار قبلی باقیمانده بازگردانده شود)

                                جمع کردن باقیمانده با مقسوم علیه در دو مرحله (بازگرداندن مقدار قبلی باقیمانده)

                                پاک کردن بیت carry برای اینکه 0 را به رجیسترهای پاسخ شیفت دهد

                                پرش به LOOP

                                SKIP:
                                ست کردن بیت carry برای اینکه 1 را به رجیسترهای پاسخ شیفت دهد

                                پرش به LOOP

                                DONE:

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

                                دیدگاه

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