اطلاعیه

Collapse
No announcement yet.

تاپیک مجموعه دستورات اسمبلی در AVR

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

    تاپیک مجموعه دستورات اسمبلی در AVR

    با سلام
    من تو انجمن سرچ کردم چیزی ندیدم.میخوام مجموعه دستورات اسمبلی در برنامه نویسی AVR را به صورت یکجا تو این تاپیک مرحله مرحله قرار بدم
    جلسه اول:

    1) دستور Mov:
    این دستور همانند دستور کپی کردن میباشد
    فرم کلی: MOV Rr,Rf
    Rr: رجیستر مقصد
    Rf: رجیستر مبدا
    نکته: Rf و Rr یکی از رجیسترهای داخلی میکرو یعنی R0-R31 میباشد
    در دستور بالا مقدار رجیستر Rf داخل رجیستر مقصد یعنی Rr کپی میگردد.
    مثال:
    MOV R2,R5
    2) دستور MOVW:
    این دستور دو رجیستر پشت سرهم را داخل دو رجیستر پست سرهم دیگر کپی میکنه
    فرم کلی: MOVW Rr+1:Rr,Rf+1:Rf
    نکته مهم:رجیسترها از نوع رجیسترهای اخلی میکرو میباشد.درضمن رجیسترهای مشخص شده Rf-Rr باید مقادیر زوج باشند .مثلا R4-R6 و .....
    مثال) MOVW R7:R6,R19:R18
    در مثال فوق مقدار رجیستر R19 داخل R7 کپی میشه.ومقدار رجیستر R18 درون رجیستر R6 کپی میگردد
    3)دستور LDI
    فرم کلی: LDI Rr,k
    تشریح : در این دستور مقدار ثابت عددی K درون رجیستر Rr کپی میگردد.
    نکته: k یک مقدار ثابت عددی هشت بیتی میباشد-رجیستر Rr همان رجیسترهای داخلی میکرو هست بااین شرط که فقط رجیسترهای R16 الی R31 قابل استفاده است
    مثال: LDI R18,0x50
    در مثال فوق عدد 50 هگزا درون ثبات R18 کپی میگردد.


    #2
    پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

    سلام.
    با تشکر از این تاپیک.
    منم در حد توانم میتونم توی این تاپیک کمک کنم.

    دیدگاه


      #3
      پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

      خود اتمل مجموعه دستورات اسمبلی رو بصورت pdf و توضیحاتش داره که!!!
      همیشه به یاد خدا باش !

      دیدگاه


        #4
        پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

        سلام هشتش اما به صورت انگلیسی هست.
        منم کمکی از دستم بربیاد انجام میدم فقط شما اول اموزش بد شروع کردی اگه قراره اموزشی قرار بگیره به نظر من باید جامع باشه و از ابتدا قرار بگیره شما مستقیم رفتین سراغ دستورات اسمبلی ممکنه مخاطب این تایپیک اصلا با ریجستری های همه منظوره یا ادرس پورت حافظه های i/o یا ... اشنایی نداشته باشه.


        خوب ابتدا به معرفی ثبات های همه منظوره میپردازیم
        cpu از ثبات های بسیاری برای ذخیره سازی موقت داده استفاده می کند .برای نوشتن برنامه به زبان اسمبلی ،باید ثبات ها و معماری cpu موجود و نقشی را که انها در پردازش داده ها ایفا می کنند ، درک کنیم در این بخش نگاهی به ثبات های همه منظوره (general purpose registeres) می اندازیم و نحوه استفاده از این ثبات ها را بادستورات ساده ای مانند LDI و ADD شرح می دهیم.
        میکرو کنترلر های avr ثبات های زیادی برای انجام محاسبات و عملیات منطقی دارند. در cpu ، ثبات ها برای ذخیره سازی موقت اطلاعات بکار می روند . این طلاعات می تواند یک بایت داده در حال پردازش و یا ادرسی که به داده مورد نیاز اشاره می کند ، باشد . اکثریت وسیعی از ثبات های avr 8 بیتی هستند. در avr فقط یک نوع داده وجود دارد : 8 بیتی.
        محدوده هر ثبات از پرارزش ترین بیت (D7 (MSB تا کم ارزش ترین بیت (D0 (LSB می باشد. با داشتن نوع داده 8 بیتی ، داده های بزرگتر از 8 بیت باید قبل از پردازش به قطعات 8 بیتی تقسیم شوند.
        در avr 32 ثبات همه منظوره (gpr) وجود دارد.این ثبات ها R0 تا R31 نام دارد و پایین ترین مکان ادرس حافظه را به خود اختصاص داده اند . طول تمام این ثبات ها 8 بیت است.
        ثبات های همه منظوره در avr همانند انباره (accumulator) در دیگر میکروپروسسورها عمل می کنند. انها برای انجام محاسبات و عملیات منطقی بکار می روند. برای درک نحوه استفاده از ثبات های همه منظوره ، انها را با دو دستور ساده LDI و ADD توضیح داده ایم

        دستور LDI :
        دستور فوق یک داده هشت بیتی را درون ثبات های همه منظوره کپی (بارگذاری ) می کند. فرمت ان به صورت زیر می باشد.
        کد:
        LDI RD,K   ;load rd with immediate value k (16<d<31)
        k یک مقدار 8 بیتی بین صفر تا 255 دهدهی ، یا 00 تا FF شانزدهی و rd هریک از شانزده ثبات r16 تا r31 می تواند باشد. حرف i در کلمه LDI بر بی واسطه بودن دلالت دارد.اگر کلمه بی واسطه در یک دستور بکار رفته باشد ، با داده ای که خود دستور فراهم می کند ، سروکار داریم .دستور زیر مقدار 0x25 (25 در مبنای شانزده ) را در r20 کپی می کند:
        کد:
        LDI R20,0x25   ;load r20 with 0x25 (r20=0x25)
        به محل قرار گیری عملوند های منبع ومقصد در دستور توجه کنید . همان طور که می بینید دستور LDI مقدار عملوند سمت راست را در عملوند سمت چپ کپی می کند به عبارت دیگر مقصد ابتدا می اید.
        توجه کنید با استفاده از دستور LDI نمیتوان مقداری را درون ثبات های R0 تا R15 کپی کرد. برای مثال دستور زیر معتبر نیست
        کد:
        LDI R5,0x99   ;invalid instruction
        برای نوشتن توضیحات در زبان اسمبلی از علامت ";" استفاده میکنیم. این علانت همانند "//" در زبان سی عمل می کند که باعث میشود از بقیه کد موجود در ان خط صرفنظر شود. برای مثال عباراتی که مثال های بالا بعد از ";" امده اند فقط نحوه کار دستور را برای شما توضیح می دهند و در اجرای برنامه تاثیری ندارند.
        به نکات زیر نیز توجه کنید:
        اگر عددی در مبنای شانزده(هگز)است باید علامت دلا($) یا مقدار 0X در ابتدای ان قرار داد .اگر هیچ چیز در ابتدای عدد نیامده باشد ان عدد در مبنای ده است برای مثال دستور "LDI r16,50" عدد 50 دهدهی را در r16 بارگذاری می کند در حالی که دستور "LDI r16,0x50" عدد 50 در مبنای شانزده را در r16 بارگذاری می کند.
        اگر مقدار 0 تا F در یک ثبات هشت بیتی مانند ثبات مه منظوره کپی شود بقیه بیت ها صفر در گرفته میشود. برای مثال "LDI r16,0x5" همان نتیجه "LDI r16,0x05" را خواهد داشت. نکته اخر این که انتقال مقادیر بیشتر از 255 (ff در مبنای شانزده) به ثبات همه منظوره خطا ایجاد می کند.
        [hr]
        و اما دستور ADD :
        فرمت کلی دستور ADD به شکل زیر می باشد:
        کد:
        ADD Rd,Rr   ;ADD Rr to Rd and store the result in Rd
        دستور فوق به cpu می گوید که محتوای ثبات های Rd و Rr را با هم جمع کن و نتیجه را در ثبات Rd بریز.
        مثال یک روش برای جمع دو عدد مانند0x25 و 0x34 به صورت زیر میباشد:
        کد:
        LDI R16,0x25   ;load 0x25 into R16
        LDI R17,0x34   ;load 0x34 into R17
        ADD R16,R17   ;add value r17 to r16 (r16=r16+r17)
        نتیجه اجرای خطوط قبل برابر R16=0x59 است .
        در قسمت بعدی به حافظه داده و حافظه i/o و دستورات مرتبط با اونها میپردازیم منظر باشین :read:


        سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

        دیدگاه


          #5
          پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

          قبلا طی یه تاپیک جداگانه قرار براین بود که همین بحث حافظه ها و ثباتهای درون میکرو بحث بشه.اما چون استقبال نشد.مبنا بر این شد که دیگران اطلاعات کاملی دراین مورد دارند.پس موضوع منتفی شد

          دیدگاه


            #6
            پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

            نوشته اصلی توسط mostafa6369
            پس موضوع منتفی شد
            اسمبلی زبان خیلی قوی - کاربردی و البته سختیه پس نباید توقع داشته باشیم که همه تو این تاپیک شرکت داشته باشند .
            از دوستان خواهش میکنم که ادامه بدید - منم هستم

            دیدگاه


              #7
              پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

              خب بریم قسمت دوم اموزش تو این قسمت اول به قسمت حافظه ها و در قسمت بعدی به دستورات مربوط به اونها میپردازیم:
              در میکرو کنترلر avr دونوع فضای حافظه وجود دارد:فضای حافظه کد (برنامه) و فضای حافظه داده برنامه ها برروی حافظه کد ذخیره می شوند، در حالی که حافظه داده اطلاعاتو داده ها را ذخیره می کند. فضای حافظه کدرا در بخش های بعدی برسی خواهیم کرد .در این بخش درباره فضای حافظه داده بحث می کنیم . حافظه داده از سه بخش تشکیل شده :ثبات های همه منظوره،حافظه i/o ، و sram داخلی داده.در پست قبل درباره ثبات همه منظوره بحث شد و حال به بخش حافظه i/o یا sfrs می پردازیم:
              حافظه i/o:
              حافظه i/o به کارکردهای خاصی از قبیل ثبات وضعیت ، تایمرها،ارتباطات سریال، پورت های i/o و adc و غیره اختصاص دارد.چون حافظه i/o برای کنترل میکرو کنترلر یا وسایل جانبی ان بکار می رود ،عملکرد محل هر خانه حافظه i/o توسط طراح cpu ، هنگام طراحی ،تعیین می شود. حافظه i/o میکروکنترلر avr از ثبات های هشت بیتی ساخته شده است. تعداد مکان های حافظه داده که برای حافظه i/o کنار گذاشته شده، بستگی به تعداد پایه ها و کارکرد های جانبی که توسط تراشه پشتیبانی می شود، دارد.
              گرچه این تعداد از تراشه ای به تراشه دیگر، حتی در بین اعضای یک خانواده می تواند تغییر کند.با وجود این تمام AVR ها حداقل 64 بایت فضای حافظه حافظه I/O دارن این 64 بایت حافظه استاندارد I/O نامیده می شوند در AVR های با بیش از 32 پایه مانند ATMEGA 64 ، ATMEGA 128 و ATMEGA256 یک حافظه I/O توسعه یافته نیز وجود دارد. این حافظه شامل ثبات هایی برای کنترل پورت های اضافه و وسایل جانبی اضافه می باشد.در دیگر میکرو کنترلر ها ثبات های
              i/o ,SFR یا (special function registers) نامیده می شوند، زیرا هریک برخلاف ثبات های همه منظوره ، به کارکرد ویژه ای اختصاص یافته اند.
              SRAMء (RAM ایستا)داخلی داده
              sram داخلی بطور گسترده ای برای ذخیره سازی داده وپارامتر ها بوسیله برنامه های avr و کمپایلر های c به کار گرفته می شود.به همین دلیل ان را حافظه موقت (scratchpad) نیز می نامند.هر خانه sram بطور مستقیم از طریق ادرسش قابل دسترسی است. از این خانه ها در پست های اینده برای ذخیره سازی داده هایی که از طریق i/o و پورت های سریال به cpu اورده شده اند ، استفاده می کنیم. طول هر خانه هشت بیت است و می تواند برای ذخیره سازی هر داده ای به شرط انکه هشت بیتی باشد بکار رود. اندازه sram ، همانند حافظه i/o از تراشه ای به تراشه دیگر ،حتی در بین اعضای یک خانواده می تواند تغییر کند.
              دوستان میخواستم eeprom هم توضیح بدم که دیگه حوصلش نیست و بعهده دیگر دوستان میزارم در پست بعدی به دستور LDS و کارکرد و روش استفاده از ان میپردازیم
              سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

              دیدگاه


                #8
                پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

                نحوه نوشتن روی EEPROM داخلی :
                فضای حافظه EEPROM تو انواع میکروها متفاوته که برای همین من MEGA32 رو مثال میزنم .
                میکروی MEGA32 دارای 1024 بایت حافظه EEPROM هست که قابلیت خواندن و نوشتن تا حدود 100.000 مرتبه را دارد .
                نحوه نوشتن برنامه در محیط اسمبلی (AVR STUDIO) یا کامپایلرهای دیگر بدین صورت است .
                1: تا "صفر" شدن بیت EEWE صبر میکنیم .
                2: ادرس EEPROM را در رجیستر EEAR مینویسیم .
                3: دیتا را در رجیستر EEDR مینویسیم .
                4: بیتهای EEMWE و EEWE را یک میکنیم .

                دیدگاه


                  #9
                  پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

                  با تشکر از دوستان
                  باتوجه به اینکه دوستان دیگرهم بتوانند از مطالب استفاده کنند.یک پیشنهاد دارم و اون این هستش که مطالبی که ارائه میگردد بصورت منظم وطبق بندی شده باشد که مشکلی هم برای خواننده مطالب پیش نیاد.هم بصورت اصولی باشد.برای همین فهرستی از مطالب که قرار است در این تاپیک گفته شود و به مرورزمان اضافه گردد خدمت دوستان اورده شده است
                  1- مقدمه اجمالی بر روی حافظه
                  2- دستورات انتقال داده
                  3- دستورات محاسباتی
                  4- دستورات محاسباتی ویژه
                  5- دستورات منطقی روی بیت
                  6- دستورات منطقی
                  7- دستورات پرش و انشعاب
                  8- پرشهای شرطی
                  9- پرشهای انشعابی و شرطی
                  10- دستورات فراخوانی زیر برنامه
                  11- و....

                  دیدگاه


                    #10
                    پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

                    ادامه اموزش ..
                    دستور هایی را که تا به حال برسی کردیم با مقادیر بی واسطه (مقادیر ثابت ) وثبات های همه منظوره کار می کردند، هم چنین انها از ثبات همه منظوره برای ذخیره نتیجه استفاده می کنند. پیش از این مثال هایی را از نحوه ی استفاده LDI و ADD در بخش های قبل برسی کردیم. AVR اجازه دسترسی مستقیم به دیگر خانه های حافظه داده را نیز می دهد. در این بخش دستورات مربوط به دسترسی به خانه های مختلف حافظه داده را نشان می دهیم .این بخش یکی از مهم ترین قسمت های این اموزش برای کسب مهارت در برنامه نویسی به زبان اسمبلی برای AVR است.
                    دستور LDS مخفف load direct from data space :
                    کد:
                    LDS Rd,k ;load Rd with the contents of location k (0<d<31)
                    	 ;k is an address between $0000 to $ffff
                    دستور LDS به CPU می گوید یک بایت را از ادرسی در حافظه داده به یک ثبات همه منظوره کپی کند. بعد از اجرای این دستور ، ثبات همه منظوره مقداری برابر با خانه حافظه داده خواهد داشت . خانه حافظه داده می تواند در هر قسمتی از فضای داده قرار گرفته باشد . می تواند یکی از ثبات های i/o ، محلی در sram یا GPR باشد. برای مثال دستور " LDS R20,0x1 " محتوای خانه 1 (مبنای شانزده) را بر روی R20 کپی می کند. خانه 1 حافظه در قسمت GPR قرار دارد و ادرس ثبات R1 می باشد . پس این دستور R1 را بر روی R20 کپی می کند.
                    دستور زیر خانه 0x200 (این ادرس در sram داخلی واقع شده است) را در R5 می ریزد.
                    کد:
                    LDS R5,0x200 ;load R5 with the contents of location $200
                    در بخش بعدی درباره ی دستور STS بحث می کنیم که عکس دستور بالاست سپس به دستور IN می پردازیم که از نظر کارایی مشابه دستور LDS اما با تفاوت هایی اساسی و سپس این دو را با هم مقایسه می کنیم .
                    ((شرمنده دوستان اموزش انقدر کوتاهه چون وقتم خیلی کوتاهه و چند تایی پروژه رو دستم باد کرده دیگه به بزرگی خودتون ببخشید :redface)
                    سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

                    دیدگاه


                      #11
                      پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

                      با تشکر از اقا سجاد.تا اینجا جهت اینکه مطالب گفته شده تا حدودی جمع بندی بشه .یه کمی درمورد حافظه مطلب به صورت روان و خودمانی اضافه میکنم(ببخشید جهت درک مطلب میگم به صورت خودمانی ) و در نهایت دستوراتی که گفته شده است بطور مختصر و درک تفاوت بین دستورات بیان میگردد.
                      حافظه:
                      ببینید جهت ذخیره نمودن اطلاعات و برنامه نیاز به استفاده از حافظه میباشد.حالا اینکه چند نوع حافظه داریم و... به طور کلی کار نداریم.فعلا ما به بحث حافظه داخلی میکرو میپردازیم
                      RAm:یه سری از اطلاعات هستند که در زمان اجرا برنامه ایجاد میشن و یا نیاز به ذخیره موقت انها داریم.که این نوع اطلاعات درون RAM قرار میگیرند.این نوع حافظه با قطع برق اطلاعاتشون از بین میره(پس با توجه به این مطلب نباید برنامه درون RAM نوشته شود.چون پا میشه).به این حافظه حافظه داده نیز گفته میشود.
                      حالا خود این حافظه داده عملا به چندین بخش تقسیم میشه که شامل موارد زیر میباشد
                      1-قسمت مربوط به رجیسترهای عمومی R0-R31(این بخش از حافظه از ادرس صفر شروع میشه و 32 خانه از حافظه را در برداره.منظورم 32 بایت هستش چون رجیسترهادر AVR 8 بیتی میباشند)
                      حالا یه سوال پیش میاد که این نوع از رجیسترها برای چی هستند و چه کارایی دارند؟
                      ببینید یه حسن بزرگی حافظه موقت در برابر حافظه دایمی داره در سرعت ان میباشد .لذا CPU اطلاعات را میگیره و درون این رجیسترها عملیات خاصی که قرار انجام بشه را انجام میده وبعد اونو حالا در حافظه دایم یا موقت ذخیره میکنه.بعدا میبینید که در دستورات اسمبلی میبیند که پای این رجیستر ها در میان هستش.درضمن اینوهم بگم که CPU مستقیما تا اونجایی که من خوندم نمیتونه با حافظه خارجی و حافظه فلش ارتباط داشته باشه.بلکه اطلاعات از حافظه فلاش میخونه درون این رجیسترهای عمومی میرزه .و در نهایت بعد از اینکه عملیات روی ان انجام گردید مجددا از طریق همین رجیسترها با حافظه خارجی در ارتیباط هستش.ببخشید اینقدر طولش دادم
                      2- قسمت دوم از حافظه RAM مربوط به رجیسترهای I/O هستش:حالا این چی هستش خدمتتان عرض میکنم.ببینید شما وقتی دارین با میکرو کارمیکنید یه سری تنظیماتی انجام میدین.مثلا فلان پورت خروجی باشه یا ورودی.نوع تایمر کانتر را مشخص میکنید.یا اینکه فعال بودن یا غیر فعال بودن اینتراپت و وقفه ها را میخواهین مشخص کنید و....
                      خودب تمام این تنظیمات را درون این قسمت از حافظه میتونید انجام بدین.که تو کدویژن با توجه به کدویزادی که داره خودش میاد با توجه به اون اطلاعاتی که دادین این رجیسترها را صفر ویک درونش مینوسه و تنظیمات را انجام میده)
                      3-قسمت سوم حافظه RAM داخلی به نام SRAM هستش:این بخش از حافظه اطلاعات موقتی که قرار است ایجاد بشه یا ذخیره بشه درون این بخش از حافظه قرار میگیره.برای مثال شما درون برنامه تون میان متغییرهای معمولی که تعریف میکنید درون این حاظه ذخیره میشه
                      دوقسمت دیگه هم وجود داره که تو بعضی از میکروها وجود داره
                      4- رجسترهای توسعه یافته:این حافظه در میکروهایی که تعداد پورتهاشون افزایش میابد و دارای کارایی بالاتری هستند اضافه میشه(کارشون درست مثل همون قسمت I/O هست که قبلا گفته شد)
                      5- حافظ داده خارجی .البته برای بعضی از میکروها
                      خوب تا اینجا درمورد حافظه داده صحبت شد امیدوارم خوب توضیح داده باشم.میرسیم به حافظه برنامه که همون حافظه FLASH هستش و با قطع برق اطلاعاتشون پاک نمیشه بنابراین برنامه درون این نوع حافظه نوشته میشه.درضمن برخی اطلاعات و داده هایی که دایمی هستند نیز میشه درون این حافظه ذخیره نمود.برای مثال رمز و....
                      این حاظه به دو قسمت تقسم میشه
                      1- بخش APPLICATION: که همون فایل هگزا برنامه که تولید کرده درون این بخش از برنامه ریخته میشه
                      2-بخش BOOT: در این قسمت از حافظه برنامه ای به نام BOOT Loader قرار میگیره که از آن در موارد اشکال زدایی استفاده میشه و در طول اجرای برنامه نیز قابل تغییر است
                      خوب حالا سوال پیش میاد که این بوت چیه؟
                      ببینید برنامه ای که شما نوشتین تو قسمت کاربردی یا همون بخش شماره یک نوشته میشه و در طول اجرا قادر به تغییر ان نیستید.حالا بعد از مدتی خواستین زیر برنامه هاتونو یه تغییراتی بدین.یه راه این هستش که دوباره کل میکرو را برنامه اونو اپدیت کنید.یه راه دیگه اون هستش که فقط اون قسمت زیر برنامه را از طریق قسمت بوت تغییر بدیم

                      دیدگاه


                        #12
                        پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

                        این تاپیکو ادامه نمیدید؟؟

                        دیدگاه


                          #13
                          پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

                          نوشته اصلی توسط saeiddiod
                          این تاپیکو ادامه نمیدید؟؟
                          سلام چرا ادامه میدیم منتهی بعد 15 این ماه :redface:بالا پست دادم یکم سرم شلوغه
                          سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

                          دیدگاه


                            #14
                            پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

                            خوب سلام عید همه دوستان مبارک یه وقت بیکار گیر اوردم گفتم یه پست بزارم :mrgreen:
                            STS(STore direct to data space)
                            دستور مورد نظر به سیپیو می گوید محتوای یک ثبات همه منظوره(r0-r31)را به ادرس خانه ای در فضای داده انتقال دهد یا کپی کند.
                            خانه حافظه داده که مقدار مورد نظر ما در ان قرار می گیرد می تواند در هرقسمتی از فضای حافظه داده باشد ،می تواند حافظه i/o یا sram یا ثبات همه منظوره (gpr) باشد.
                            شکل کلی دستور:
                            کد:
                            STS K, Rr  ; location k =Rr(0 <= r <= 31)
                                   ; k is an address between $0000 to $ffff
                            در کد بالا مقدار Rr (r0-r31) در k قرار می دهد k می تواند ثبات همه منظوره یا خانه ای در فضای داده باشد که $0000 تا $ffff می باشد.
                            مثال:
                            کد:
                            STS 0x1, R25   ;0x1(R1)=R25
                            STS 0x230, R10  ;0x230(sram)=R10
                            
                            
                            LDI R16, 0x55  ;R16=0x55
                            STS 0x38, R16  ;copy r16 to port B (PORTB = 0x55)
                            STS 0x35, R16  ;copy r16 to port C (PORTC = 0x55)
                            STS 0x32, R16  ;copy r16 to port D (PORTD = 0x55)
                            در مثال بالا خط اول R25 (ثبات همه منظوره ) را در خانه ای با ادرس 0x1 که ادرس خانه اول حافظه داده است و در قسمت gpr (ثبات همه منظوره ) قرار دارد و ادرس ثبات R1 می باشد کپی می کند.
                            در خط دوم ثبات R10 را در 0x230 که ادرس خانه ای در حافظه داده است ودر بخش sram قرار گرفته کپی می کند. ودر خط سوم مقدار 0x55 هگز یا همون مبنای 16 در ثبات R16 قرار می دهد و در خط چهارم مقدار R16 در ادرس 0x38 که ادرس پورت B هست قرار می دهد و پورت B برابر با 0x55 می شود خط پنجم وششم هم مانند خط چهارم اند و به جای پورت B مقدار ثبات R16 را به ترتیب در پورت C و D کپی می کنند.
                            فقط توجه کنید که مقادیر بی واسطه رو نمی توان به طور مستقیم در sram ذخیره کرد مثلا "STS 0x230, 0x55" خطا می دهد.
                            تا پست بعد که راجعبه دستور in هست بای فقط یه توضیح کوچلو این که دستور in تقریبا شبیه دستور LDS ولی فقط می تونه رو حافظه i/o کارکنه و سریع تر از دستور LDS عمل می کنه


                            سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

                            دیدگاه


                              #15
                              پاسخ : تاپیک مجموعه دستورات اسمبلی در AVR

                              مهندس چرا از دستور STS استفاده کردی و از OUT استفاده نکردی ؟؟
                              اموزش شما طبق کدوم کامپایلره ؟؟ با کدویژن مینویسی ؟؟
                              خیلی ممنون

                              دیدگاه

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