اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    پی نوشت: از بخش 76 فیلم های آموزش AVR در مورد برنامه نویسی اسمبلی آموزش داده می شود:

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

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

    معماری خانواده AVR و XMEGA از نوع RISC است و بنابراین کلیه عملیات انجام شده از طریق رجیسترهای R0-R31 انجام می شوند. برخلاف معماری که در خانواده ای مانند 8051 وجود دارد و این اجازه را به برنامه نویس می دهد تا مثلا خروجی یک پورت را مستقیما با عددی AND کند، در این خانواده ها باید عملیات مذکور با واسطه رجیسترهای R0-R31 انجام شود. ممکن است که این مسئله در ابتدا به عنوان یک عدم مزیت تلقی شود، اما به دلیل سرعت اجرای دستورالعمل ها که اکثرا در یک سیکل انجام می شود، این مسئله در نهایت به سرعت بالاتری در اجرای برنامه منجر خواهد شد. وزن و اهمیت این 32 رجیستر با هم مساوی نیست و تفاوت هایی بین آنها وجود دارد که در اینجا به آن اشاره می شود:
    1- عملیاتی که بصورت Immediate انجام می شوند، یعنی بین یک رجیستر و یک عدد صورت می گیرند تنها روی رجیسترهای R16-R31 قابل انجام هستند.مثال SUBI R16,1
    2- رجیسترهای R0 و R1 دارای این ویژگی هستند که نتیجه عملیات ضرب در آنها قرار می گیرند.
    3- عملیات جمع و تفریق 16 بیتی با یک عدد تنها روی رجیسترهای R24-R31 قابل انجام است.
    4- جفت رجیسترهای R27:R26 به نام رجیستر X شناخته می شوند و می توانند برای خواندن و نوشتن روی SRAM مورد استفاده قرار بگیرند.
    5- جفت رجیسترهای R29:R28 به نام رجیستر Y شناخته می شوند و می توانند برای خواندن و نوشتن روی SRAM مورد استفاده قرار بگیرند.
    6- جفت رجیسترهای R31:R30 به نام رجیستر Z شناخته می شوند که این دو رجیستر در واقع مهم ترین رجیسترها در مجموع 32 رجیستر هستند و علاوه بر امکان خواندن و نوشتن روی SRAM از طریق آن، دسترسی به حافظه FLASH و دستورات پرش غیر مستقیم و پرش به سابروتین ها بصورت غیر مستقیم ( IJMP ICALL EIJMP EICALL) از طریق این رجیسترها قابل انجام است.
    گاهی از درجه اهمیت هر رجیستر موجب می شود که یک برنامه نویس بتواند استفاده از رجیسترها را مدیریت کند و از استفاده نابجا از رجسترهایی که قرار است در عملیات دیگری بکار گرفته شوند، خودداری کند. همچنین رجیسترهایی را که بصورت دائمی در معرض تغییر و قضاوت هستند در مکان مناسبی انتخاب کند تا از طولانی شدن بی مورد برنامه به دلیل انتخاب اولیه غلط، جلوگیری شود. به دوستانی که علاقه مند به پیگیری این بحث هستند اکیدا توصیه می شود که فایل مستقلی که مجموعه دستورالعمل های اسمبلی خانواده AVR را بصورت کامل توضیح داده از وبسایت Atmel دریافت و مطالعه کنند.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


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

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

      دیدگاه


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

        نوشته اصلی توسط Study
        اگر امکان داره به صورت خلاصه تعدادی از تغییرات نسبتا اساسی که در دستورالعمل های XMEGA نسبت به AVR شده رو هم برامون بنویسید.
        دستورات LDS و STS توی XMEGA ها هم 32 بیت پکد دارند؟
        خوشبختانه دستورالعمل های خانواده AVR و XMEGA با یکدیگر مشترک هستند و تنها مواردی از استثناء (مانند دستورالعمل DES در XMEGA برای Encryption و Decryption) وجود دارد. اما زمان اجرای بعضی دستورالعمل ها از نظر تعداد سیکل در این دو خانواده متفاوت است.
        دستورالعمل های LDS و STS و برخی دستورات دیگر، تعداد 4 بایت را در حافظه Flash اشغال می کنند.

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

        دیدگاه


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

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

          بصورت کلی دستورات اسمبلی را می توان برای انجام عملیات زیر بکار برد:

          - عملیات روی رجیسترهای R0-R31
          - عملیات روی فضای I/O
          - پرش های شرطی و غیر شرطی و احضار زیربرنامه ها
          - خواندن و نوشتن SRAM
          - خواندن از Flash
          - تغییر محتوای Flash
          - خواندن و نوشتن Stack
          - دستورات خاص BREAK-NOP-WDR-SLEEP-DES-RET-RETI

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

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

          دیدگاه


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

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

            دیدگاه


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

              برای شروع برنامه نویسی به زبان اسمبلی باید از لحظه اتمام وضعیت RESET و شروع بکار میکروکنترلر، عملکرد آنرا بصورت مرحله به مرحله بدانیم و با آن همراه شویم. یک تعبیر شخصی این است که یک برنامه نویس اسمبلی باید ذهن خود را با عملکرد CPU هماهنگ کند مانند یک نرم افزار شبیه ساز فکر کند. اولین نقطه شروع این است که بعد از RESET شدن میکروکنترلر، ابتدا رجیسترهای کنترل کننده سخت افزار دارای مقدار اولیه مشخصی می شوند که همگی در Datasheet ذکر شده است. سپس اولین دستوری که در آدرس صفر حافظه Flash توسط پروگرامر قرار داده شده، اجرا می شود. این دستور باید توسط برنامه نویس نوشته و روی Flash پروگرام شده باشد. سوال این است که اولین دستوری که به زبان اسمبلی نوشته می شود باید چه دستوری باشد؟ برای پاسخ به این سوال باید از مبحثی به نام وقفه و بردارهای وقفه مطلع باشیم. وقفه ها در واقع تقاضاهایی از CPU برای پاسخگویی هستند که منابع مشخصی دارند و پذیرش و پاسخگویی به یک وقفه توسط CPU یعنی اجرای دستورالعمل هایی که توسط برنامه نویس نوشته شده و در آدرس مشخصی در حافظه Flash قرار داده شده است. این آدرس ها، مکان های از پیش تعیین شده ای هستند که توسط کارخانه سازنده اعلام شده اند. در ابتدای حافظه Flash تنها به اندازه یک دستور پرش فضا در اختیار برنامه نویس است و بعد از آن همین آدرس های مشخص قرار دارند. بنابراین در پاسخ به این سوال که باید چه دستوری را درابتدا بنویسیم باید گفت که بصورت اصولی باید اولین دستور یک دستور العمل پرش باشد تا فضای آدرس های مربوط به پاسخگویی وقفه برای وظیفه مخصوص به خود محفوظ بماند و در اولین آدرسی که خارج از این فضا باشد، می توانیم کدهای مورد نظر را قرار دهیم . البته در صورتی که در یک برنامه وقفه ای وجود نداشته باشد، انجام این امر الزامی نیست و اولین دستور لزوما می تواند یک پرش نباشد. اما از نظر اصولی بهتر است در تمام شرایط و برای امکان توسعه نرم افزار این مسئله رعایت شود. سوال بعد این است که بعد از این پرش، اولین کاری که باید توسط نرم افزار انجام شود، چیست؟ پاسخ این سوال برای AVR و XMEGA متفاوت است. برای AVR اولین کار، تعیین مکان Stack از طریق قرار دادن آدرس انتهای SRAM در رجیستری به نام Stack Pointer است. اما این عملیات در XMEGA بصورت خودکار انجام می شود. مثالی از موارد بیان شده برای mega16 در زیر آورده شده است:
              .ORG 0X00
              JMP RESET
              .ORG 0X2A
              RESET:
              LDI R16,HIGH(0X45F)
              OUT SPH,R16
              LDI R16,LOW(0X45F)
              OUT SPL,R16
              ...
              در کد اخیر .ORG یک دستورالعمل نیست و تنها یک راهنما برای Assembler است که بیان می کند هر دستورالعملی که بعد از آن ذکر شده، در هنگام پروگرام کردن در کدام آدرس Flash قرار داده شود.
              آدرس 0x2A هم از Datasheet مربوط به mega16 استخراج می شود و اولین آدرس آزادی است که مربوط به پاسخگویی به هیچ وقفه ای نیست. آدرس 0X45F آخرین نقطه واقع در SRAM است که معمولا شروع Stack در آن محل قرار داده می شود. این آدرس ها و مقادیر در هر شماره IC متفاوت است و با مراجعه به اطلاعات آن IC و یا استفاده از فایل های Header قابل دستیابی و استفاده است. این مقدار دهی اولیه به Stack pointer برای XMEGA لازم نیست.
              از اینجا به بعد می توانیم توسط برنامه نویسی، عملیات مورد نظر خود را انجام دهیم. مثلا فرض کنیم در mega16، بخواهیم با حداکثر سرعت ممکن، ورودی PORTB و PORTC را بخوانیم و با هم جمع کنیم و حاصل را روی PORTD قرار دهیم:

              LDI R16,0XFF
              OUT DDRD,R16
              LOOP:
              IN R16,PINB
              IN R17,PINC
              ADD R16,R17
              OUT PORTD,R16
              RJMP LOOP


              از نکات قابل ذکر این است که بصورت Default پورتها ورودی هستند و کدهایی مانند DDRB=0x00 و DDRC=0x00 که در این موارد توسط code wizard مربوط به Code vision تولید می شوند، اضافه و زاید هستند.
              کد مذکور برای XMEGA تا حدی متفاوت خواهد بود که بعدا به آن اشاره خواهد شد.

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

              دیدگاه


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

                عالیه جناب طراح، اینجور مطالب معمولا اینجا کمتر طرفدار داره اما از با ارزش ترین مطالب هست و به نظر من حتی اگر فقط 2 نفر هم بخوانند ارزش نوشتن را دارد. سیستم پشته در XMEGA ها هم به همون ترتیب AVR هست ( درون SRAM ) و فقط نیازی به تعیین مکان نداره یا اینکه کلا سیستمش فرق میکنه؟ لطفا به مبحث پشته که رسیدید هردو سخت افزار و نرم افزار پشته رو هم مثل همیشه خوب و کامل توضیح بدید، البته بنده انتظاری ندارم اما اگر فرصت کنید و اینکار رو انجام بدید لطف بزرگی کردید.
                یک نکته رو هم بنده اشاره کنم که opcode دستور JMP چهار بایت هست و برای پرش های بلند استفاده میشه و در عوض دستور RJMP دارای opcode دو بایتی است که نصف قبلی هست و در اینجا ما میتونیم برای پرش به آدرس شروع به جای دستور JMP از RJMP استفاده کنیم که دوبایت در حافظه صرفه جویی کرده باشیم ( به اندازه یک دستور معمولی ) البته ممکن هست اسمبلر خودش موقع اسمبل کردن برنامه به جای دستور JMP ما RJMP رو جایگزین کنه ( در 8051 مشابه اینکار رو انجام میداد ) اما نمیدونم اسمبلر AVR هم اینکار رو میکرد یا نه، به هر حال بهتر هست در اینجا RJMP استفاده بشه.
                نکته دیگر هم که بد نیست اشاره کنم این هست که اگر فایل سرآیند تراشه مورد نظر رو اضافه کرده باشید نیاز نیست حتما آدرس آخرین حافظه از RAM رو نگاه کنید و درون پرانتز قرار بدید، برای صرفه جویی در وقت میتونید به این صورت بنویسید:
                LDI R16,LOW(RAMEND) و LDI R16,HIGH(RAMEND) که در این دو دستور هم اسمبلر موقع اسمبل کردن برنامه با توجه به تراشه شما آدرس انتهای SRAM رو جایگزین RAMEND میکنه، در نتیجه مثل این میمونه که شما آدرس رو نوشته باشید، اما اگر بخواهید در قسمتی دیگر غیر از آخر حافظه RAM پشته رو قرار بدید باید حتما آدرس مورد نظر را به همین صورت که جناب طراح نوشتند بنویسید.
                از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
                هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
                اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
                اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
                شاد و موفق باشید

                دیدگاه


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

                  درباره استفاده از RJMP بجای JMP به دلیل اینکه این مثال برای mega16 نوشته شده و بردارهای وقفه در این IC بگونه ای است که به فاصله دو word از یکدیگر قرار دارند، حتی اگر RJMP هم نوشته شود عملا از یک word باقیمانده برای هیچ کاری نمی توان استفاده کرد. بنابراین در متن Atmel هم از دستور JMP برای این کار استفاده شده است و می توانید در Datasheet مربوط به mega16 این مسئله را ملاحظه کنید. البته از همین دقت شما مشخص است که در امر برنامه نویسی اسمبلی تبحر دارید و جای شکر دارد که هنوز کسانی هستند که در این حوزه ها فعالیت کنند و CONFIG LCD ... همه را از برخی کاربردها محروم نکرده است.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


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

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

                    دیدگاه


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

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

                      دیدگاه


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

                        گام بعدی در برنامه نویسی، شناخت امکانات سخت افزاری و روش بکار گرفتن آن از طریق استفاده از مجموعه دستورالعمل ها و نوشتن مقادیر مناسب در رجیستر های کنترل کننده هر سخت افزار است. برای ارتباط با سخت افزار باید رجیسترهایی را شناسایی کرد که بر آن سخت افزار مدیریت می کنند و باید بررسی کنیم که چه مقادیری را در این رجیسترها بنویسیم تا سخت افزار بگونه ای که مورد نظر است، عمل کند. استفاده مکرر از محیط های Wizard این اشکال را دارند که علیرغم سادگی ظاهری، این دانش را از برنامه نویس سلب می کنند و اگر در کاربردی لازم باشد در وسط اجرای برنامه تغییری در نوع عملکرد یک سخت افزار ایجاد شود( مثلا تغییر پیکره بندی یک تایمر)، اطلاعات لازم برای اینکار باید وجود داشته باشد و این کار تنها با تغییر مقادیر رجیسترهای کنترل کننده سخت افزار ممکن است.
                        چند مورد مهم دیگر شامل گاهی از امکانات محاسبات منطقی و ریاضی در CPU و همچنین نحوه دسترسی به SRAM و FLASH و ایجاد شرط و قضاوت و ایجاد حلقه در برنامه است که با گاهی از آنها می توان با قدرت و تسلط کافی، سخت افزار را بکار گرفت و عملیات مورد نظر را انجام داد.
                        عملیات منطقی و ریاضی که روی رجیسترهای R0-R31 انجام می شوند، شامل AND و OR و NOT و XOR و SHIFT و ROTATE و مقایسه و جمع و تفریق و ضرب می شود. دستور تقسیم از اساس در خانواده AVR وجود ندارد، اما با روتین هایی شامل تفریق و SHIFT می توان آن را انجام داد.
                        R0-R31 در واقع رجیسترهایی در درون میکروکنترلر محسوب می شوند که تنها حکم واسطه را دارند و هر عملیات و محاسباتی هم که روی آنها انجام شود، رابطه ای با دنیای خارج ایجاد نمی کند. رابطه میکروکنترلر با دنیای خارج از طریق پورتهای آن انجام می شود که در بخش بعد در این مورد توضیح داده خواهد شد.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


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

                          با سلام
                          از دوستان خوب "طراح" و "study" به خاطر بحث شیرینی که باز کردن ممنونم.منتها یه پیشنهاد دارم و اونم اینکه در این مرحله به جای چونه زدن روی یک بایت از حافظه یا نیم میکرو ثانیه از زمان بیان روی مباحث کاربردی تری صحبت کنیم.
                          نظر بنده رو ایناست: طراحی فلوچارت و تابع بندی و انشعابات برنامه، استفاده از اشاره گر های داده در فلش و رم، مدیریت متغیر ها، عملیات ریاضی روی عددهای بزرگ و ممیزی و ...

                          با تشکر

                          دیدگاه


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

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

                            دیدگاه


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

                              با سلام
                              آقا من از اوموقع خواننده بودم ولی گفتم یه پست بدم که شمام بدونید بابا کسی اینو میخونه ملی چون تازه دارم یا میگیرم حرفی برای گفتن ندارم.
                              راستی دوست عزیز اصل برنامه نویسی اسمبلی برای سرعتشه نا چیز دیگه ای چون جز زحمت هیچی به همراه نداره پس مهمه حتی 1 سیکل یا دو سیکل :agree:
                              لطفا همینجور ادامه بدید :read: :job:
                              الهم عجل لولیک الفرج

                              فقط 313 نفر...

                              دیدگاه

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