اطلاعیه

Collapse
No announcement yet.

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

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

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

    من هنوز نتونستم با .dw کنار بیام !

    یه جایی دیدم برای خوندن داده word از این روش استفاده کرده بود :
    کد:
     ldi zh,high(mydata<<1)
     ldi zl,low(mydata<<1)
     lpm r17,z+ 
     lpm r18,z
     
    
     .org 0x500
     mydata:
     .dw 0x1234

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

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

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

    دیدگاه


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

      منظور از cseg. همان code segment است و آنچه که بعد از این عبارت نوشته می شود از نظر اسمبلر مربوط به محتوای حافظه flash است (مانند خطوط برنامه و db. و ...). منظور از dseg. هم data segment است و موارد نوشته شده بعد از این عبارت از نظر اسمبلر مربوط به حافظه sram است (مانند تعریف متغیر در sram).

      در مورد دسترسی به محتوای flash از طریق lpm هم متناسب با آدرس مورد نظر برای دسترسی باید محتوای رجیستر های zl و zh را اضافه کنید که به دلیل کامل نبودن سوال و عدم ارائه توضیح کافی لازم است جزئیات بیشتری را مطرح کنید.

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

      دیدگاه


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

        خیلی ممنون آقای مهندس

        در مورد .dw خودم جواب رو پیدا کردم مثل کد زیر عمل بشه درسته کد زیر مقادیر تعریف شده در .dw رو می خونه و به ترتیب روی پورت c نشون میده)

        /*
        * test51.asm
        *
        * Created: 2014/05/22 0330 ?.?
        * Author: DEADSPACE
        */

        .include "m32adef.inc"
        .org 0

        ldi r16,high(ramend)
        out sph,r16
        ldi r16,low(ramend)
        out spl,r16

        ldi r16,0xff
        out ddrc,r16

        ldi zl,low(data1<<1)
        ldi zh,high(data1<<1)
        lpm
        out portc,r0
        call wait
        adiw zh:zl,1
        lpm
        out portc,r0
        call wait
        adiw zh:zl,1
        lpm
        out portc,r0
        call wait
        adiw zh:zl,1
        lpm
        out portc,r0
        here:rjmp here

        wait:
        ldi r20,250
        l3:ldi r21,200
        l2:ldi r22,120
        l1:nop
        dec r22
        brne l1
        dec r21
        brne l2
        dec r20
        brne l3
        ret


        .org 0x500
        data1:
        .dw 0x1234,0x4488
        البته در برنامه بالا باید از پرش شرطی استفاده بشه
        --------------------------------------------------------------
        ولی درباره .cseg و .dseg بازهم متوجه منظور شما نمیشم آیا امکانش هست که یک مثال بزنید و کاربرد شون رو نشون بدین ؟
        من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
        آلبرت اینشتین
        منبع: http://fa.wikiquote.org

        دیدگاه


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

          نوشته اصلی توسط silicon0
          ولی درباره .cseg و .dseg بازهم متوجه منظور شما نمیشم آیا امکانش هست که یک مثال بزنید و کاربرد شون رو نشون بدین ؟
          به عنوان مثال در نمونه کد زیر ابتدا دو متغیر به طول یک بایت در sram تعریف شده و در ادامه متن برنامه ای که باید از آدرس 0x00 حافظه flash قرار بگیرد، نوشته شده است.
          کد:
          .DSEG
          .ORG  0x100
          variable_1:	      .BYTE  1
          variable_2:	      .BYTE  1
          
          .CSEG
          .ORG  0x00
          JMP   START
          .ORG	TCC0_OVF_vect
          JMP	TCC0_OVF_ISR
          ...
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


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

            ببخشید که من اینقدر سوال می پرسم :redface:

            آیا متغیر به شکلی غیر از بایت هم میشه تعریف کرد (مثلا word یا ...)

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

            دیدگاه


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

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

              دیدگاه


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

                با درود دوباره به شما
                مثلا در برنامه زیر :
                کد:
                .DSEG
                .ORG  0x100
                variable_1:	      .BYTE  1
                variable_2:	      .BYTE  1
                
                .CSEG
                .ORG  0x00
                JMP   START
                .ORG	TCC0_OVF_vect
                JMP	TCC0_OVF_ISR
                
                .ORG 0x500
                .DB "Hello World"
                مقادیری که برای .org در نظر گرفته شده چه برای .dseg و چه .cseg و همینطور
                .db چگونه محاسبه میشوند؟


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

                دیدگاه


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

                  در avr با توجه به محتوای datasheet، آدرس های ابتدایی sram برای R0-R31 و بعد رجیسترهای کنترل کننده سخت افزار اختصاص یافته و تعریف متغیرها باید در آدرس های بعد از این نواحی انجام شود. بنابراین عدد قرار داده شده در org. بستگی به نقشه حافظه و ناحیه آزاد آن دارد که در شماره های مختلف متفاوت است. برای حافظه flash هم فضای ابتدای آن به بردارهای وقفه اختصاص داده شده که آدرس هر بردار معلوم است و برای هر وقفه ای باید آدرس بردار آن توسط org. مشخص شود. برای db. هم در هر محلی که لازم باشد بایت ها در حافظه flash ذخیره شوند آدرس شروع آن توسط org. مشخص می شود.
                  در مورد برنامه multi task هم دقیقا متوجه منظور شما نمی شوم. چرا که در سطح اسمبلی در هر لحظه فقط یک دستور در حال اجرا است و از طریق پرش ها و اجرای زیر برنامه ها و وقفه ها این دستور در حال اجرا به نواحی مختلف منتقل می شود. اگر در پرش به هر زیر برنامه یا وقفه نیاز به ذخیره سازی محل هایی از حافظه در پشته وجود داشته باشد، میزان حافظه لازم با توجه به متن برنامه کاملا مشخص خواهد بود.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


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

                    نوشته اصلی توسط طراح
                    برای db. هم در هر محلی که لازم باشد بایت ها در حافظه flash ذخیره شوند آدرس شروع آن توسط org. مشخص می شود.
                    با تشکر از شما
                    یعنی .db را در هر کجای حافظه فلش قرار بدیم مشکلی نداره ؟(تداخلی بوجود نمیاد؟)

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

                    دیدگاه


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

                      نوشته اصلی توسط silicon0
                      یعنی .db را در هر کجای حافظه فلش قرار بدیم مشکلی نداره ؟(تداخلی بوجود نمیاد؟)
                      اگر db. شامل جدولی به اندازه 20 بایت باشد شما می توانید آنرا در 20 بایت آخر حافظه فلش قرار دهید اما با این کار در یک حافظه مثلا 8 کیلوبایتی فایل HEX خروجی 8 کیلوبایت خواهد شد.

                      نوشته اصلی توسط silicon0
                      منظورم اینه که مثلا برای یک فراخوانی زیربرنامه چند بایت در حافظه پشته push
                      میشه و کلا برای چه عملیاتی و به چه مقدار اینکار انجام میشه(برای محاسبه دقیق فضای stack )
                      اگر حافظه فلش کمتر از 128 کیلوبایت باشد به صورت 2 بایتی یا 16 بیتی آدرس دهی می شود بنابراین هنگام فراخوانی یک زیر برنامه دو بایت در Stack ذخیره می شود ( در InstructionSet به دستور CALL مراجعه کنید ). در داخل زیربرنامه تعداد push و pop ها بستکی به تعداد رجیسترهای مورد نیاز در زیربرنامه دارد که لازم هست مقادیر موجود در آنها در هنگام ورود به زیربرنامه پس از بازگشت هم در دسترس باشند.
                      گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                      دیدگاه


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

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

                        دیدگاه


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

                          مثلا برای برنامه زیر موقعی که برنامه به برچسب aa میرسد چند بایت در حافظه پشته ذخیره شده است ؟
                          کد:
                          .
                          .
                          call delay1
                          .
                          .
                          
                           delay1:
                           ldi r19,250
                           w3:ldi r20,200
                           w2:ldi r21,10
                           w1:nop
                           dec r21
                           brne w1
                           dec r20
                           brne w2
                           dec r19
                          aa: brne w3
                           ret
                          من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
                          آلبرت اینشتین
                          منبع: http://fa.wikiquote.org

                          دیدگاه


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

                            طبق نمونه کدی که قرار دادید زمانی که delay1 فراخوانی شود ابتدا آدرس محل دستوری که در خط بعد از call قرار دارد(در اینجا نقطه) در stack ذخیره می شود که احتمالا 2 بایتی هست. چون در زیرروال از دستور push استفاده نشده همان 2 بایت در stack ذخیره شده است. اما اگر قبل از اجرای delay1 در رجیستر مثلا r19 مقداری وجود داشت که لازم هست مقدارش پس از بازگشت از زیرروال تغییر نکند باید در ابتدا دستور push r19 نوشته شود که در اینصورت یک بایت دیگر در stack ذخیره می شود.
                            گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                            دیدگاه


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

                              وقتی که ما یک متغیر در بیسیک تعریف میکنیم :

                              dim a as byte

                              این متغیر در کجای sram قرار میگیرد ؟ (در چه آدرسی و بر چه اساسی؟)

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

                              دیدگاه

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