اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    دیدگاه


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

      نوشته اصلی توسط sejil
      سلام مهندس
      این مطلب بالا رو باس از کجا متوجه بشیم که یه زیر برنامه چقد زمان از cpu میگیره. راهی براش وجود داره؟
      برام جالب بود که اینقد زمان کاهش پیدا میکنه. شما یه منبع خوب برا اسمبلی سراغ دارین؟
      زمان اجرای دستورالعمل ها در فایل زیر قابل دسترس است:

      http://www.atmel.com/images/doc0856.pdf

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

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

      دیدگاه


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

        با سلام تشکر از جناب طراح بابت راه اندازی این تایپیک که باعث شد با ریجستری های avr و استفاده از اون ها به صورت کابردی اشنا بشم من تقریبا یک هفته ای است که به زبان اسمبلی وارد شده ام البته طرز فکر من هنوز به شکل زبان c هست یک سوال دارم
        ممنون میشم پاسخ بدید
        دو میکرو رو تصور کنید ما برای میکرو اول یک متغییر ارایه ای تعریف میکنیم که چند سطر و چند ستون دارد وسپس یک حلقه تعریف میکنیم و این متغییر بعد از اجرای سه بار حلقه چک میشه و در یک متغییر دیگر قرار میگیره
        ما چطور میتونیم از خارج توسط میکرو دوم مقدار متغییر اول رو بدون دخالت میکروی اول تغییر بدیم بدون اینکه میکروی اول کاری برای تغییر محتوا متغییر انجام بده انجام بدیم
        چون با زبان های سطح بالا این کار ممکن نبود بخاطر همین اومدم طرف زبان اسمبلی
        با تشکر
        سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

        دیدگاه


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

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

          1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
          2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
          3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

          دیدگاه


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

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

            دیدگاه


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

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

              1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
              2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
              3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

              دیدگاه


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

                احتمالا اون دستور اسمبلی که می فرمایین استاد کی نژاد گفتن مربوط به خود میکرو هست و برای عملیات isp هست نه برای میکروی دیگه.
                در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

                1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
                2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
                3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

                دیدگاه


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

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

                  دیدگاه


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

                    سلام جناب طراح با تشکر از پاسخ شما
                    شما در ان تایپیک به دستوری به نام ICALL شاره کرده بودید
                    پس با صحبت های شما این در avr ممکن نیست مگر این اینکه میکرو خود مقدار حافظه خود را تغییر دهد
                    این دستور توسط نرم افزار کدویژن تولید شده:
                    کد:
                    ;CodeVisionAVR C Compiler V3.12 Advanced
                    ;(C) Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
                    ;http://www.hpinfotech.com
                    
                    ;Build configuration  : Release
                    ;Chip type       : ATmega16A
                    ;Program type      : Application
                    ;Clock frequency    : 1/000000 MHz
                    ;Memory model      : Small
                    ;Optimize for      : Size
                    ;(s)printf features   : int, width
                    ;(s)scanf features   : int, width
                    ;External RAM size   : 0
                    ;Data Stack size    : 256 byte(s)
                    ;Heap size       : 0 byte(s)
                    ;Promote 'char' to 'int': No
                    ;'char' is unsigned   : Yes
                    ;8 bit enums      : Yes
                    ;Global 'const' stored in FLASH: No
                    ;Enhanced function parameter passing: Yes
                    ;Enhanced core instructions: On
                    ;Automatic register allocation for global variables: On
                    ;Smart register allocation: On
                    
                    	#define _MODEL_SMALL_
                    
                    	#pragma AVRPART ADMIN PART_NAME ATmega16A
                    	#pragma AVRPART MEMORY PROG_FLASH 16384
                    	#pragma AVRPART MEMORY EEPROM 512
                    	#pragma AVRPART MEMORY INT_SRAM SIZE 1024
                    	#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60
                    
                    	#define CALL_SUPPORTED 1
                    
                    	.LISTMAC
                    	.EQU UDRE=0x5
                    	.EQU RXC=0x7
                    	.EQU USR=0xB
                    	.EQU UDR=0xC
                    	.EQU SPSR=0xE
                    	.EQU SPDR=0xF
                    	.EQU EERE=0x0
                    	.EQU EEWE=0x1
                    	.EQU EEMWE=0x2
                    	.EQU EECR=0x1C
                    	.EQU EEDR=0x1D
                    	.EQU EEARL=0x1E
                    	.EQU EEARH=0x1F
                    	.EQU WDTCR=0x21
                    	.EQU MCUCR=0x35
                    	.EQU GICR=0x3B
                    	.EQU SPL=0x3D
                    	.EQU SPH=0x3E
                    	.EQU SREG=0x3F
                    
                    	.DEF R0X0=R0
                    	.DEF R0X1=R1
                    	.DEF R0X2=R2
                    	.DEF R0X3=R3
                    	.DEF R0X4=R4
                    	.DEF R0X5=R5
                    	.DEF R0X6=R6
                    	.DEF R0X7=R7
                    	.DEF R0X8=R8
                    	.DEF R0X9=R9
                    	.DEF R0XA=R10
                    	.DEF R0XB=R11
                    	.DEF R0XC=R12
                    	.DEF R0XD=R13
                    	.DEF R0XE=R14
                    	.DEF R0XF=R15
                    	.DEF R0X10=R16
                    	.DEF R0X11=R17
                    	.DEF R0X12=R18
                    	.DEF R0X13=R19
                    	.DEF R0X14=R20
                    	.DEF R0X15=R21
                    	.DEF R0X16=R22
                    	.DEF R0X17=R23
                    	.DEF R0X18=R24
                    	.DEF R0X19=R25
                    	.DEF R0X1A=R26
                    	.DEF R0X1B=R27
                    	.DEF R0X1C=R28
                    	.DEF R0X1D=R29
                    	.DEF R0X1E=R30
                    	.DEF R0X1F=R31
                    
                    	.EQU __SRAM_START=0x0060
                    	.EQU __SRAM_END=0x045F
                    	.EQU __DSTACK_SIZE=0x0100
                    	.EQU __HEAP_SIZE=0x0000
                    	.EQU __CLEAR_SRAM_SIZE=__SRAM_END-__SRAM_START+1
                    
                    	.MACRO __CPD1N
                    	CPI R30,LOW(@0)
                    	LDI R26,HIGH(@0)
                    	CPC R31,R26
                    	LDI R26,BYTE3(@0)
                    	CPC R22,R26
                    	LDI R26,BYTE4(@0)
                    	CPC R23,R26
                    	.ENDM
                    
                    	.MACRO __CPD2N
                    	CPI R26,LOW(@0)
                    	LDI R30,HIGH(@0)
                    	CPC R27,R30
                    	LDI R30,BYTE3(@0)
                    	CPC R24,R30
                    	LDI R30,BYTE4(@0)
                    	CPC R25,R30
                    	.ENDM
                    
                    	.MACRO __CPWRR
                    	CP  R@0,R@2
                    	CPC R@1,R@3
                    	.ENDM
                    
                    	.MACRO __CPWRN
                    	CPI R@0,LOW(@2)
                    	LDI R30,HIGH(@2)
                    	CPC R@1,R30
                    	.ENDM
                    
                    	.MACRO __ADDB1MN
                    	SUBI R30,LOW(-@0-(@1))
                    	.ENDM
                    
                    	.MACRO __ADDB2MN
                    	SUBI R26,LOW(-@0-(@1))
                    	.ENDM
                    
                    	.MACRO __ADDW1MN
                    	SUBI R30,LOW(-@0-(@1))
                    	SBCI R31,HIGH(-@0-(@1))
                    	.ENDM
                    
                    	.MACRO __ADDW2MN
                    	SUBI R26,LOW(-@0-(@1))
                    	SBCI R27,HIGH(-@0-(@1))
                    	.ENDM
                    
                    	.MACRO __ADDW1FN
                    	SUBI R30,LOW(-2*@0-(@1))
                    	SBCI R31,HIGH(-2*@0-(@1))
                    	.ENDM
                    
                    	.MACRO __ADDD1FN
                    	SUBI R30,LOW(-2*@0-(@1))
                    	SBCI R31,HIGH(-2*@0-(@1))
                    	SBCI R22,BYTE3(-2*@0-(@1))
                    	.ENDM
                    
                    	.MACRO __ADDD1N
                    	SUBI R30,LOW(-@0)
                    	SBCI R31,HIGH(-@0)
                    	SBCI R22,BYTE3(-@0)
                    	SBCI R23,BYTE4(-@0)
                    	.ENDM
                    
                    	.MACRO __ADDD2N
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	SBCI R24,BYTE3(-@0)
                    	SBCI R25,BYTE4(-@0)
                    	.ENDM
                    
                    	.MACRO __SUBD1N
                    	SUBI R30,LOW(@0)
                    	SBCI R31,HIGH(@0)
                    	SBCI R22,BYTE3(@0)
                    	SBCI R23,BYTE4(@0)
                    	.ENDM
                    
                    	.MACRO __SUBD2N
                    	SUBI R26,LOW(@0)
                    	SBCI R27,HIGH(@0)
                    	SBCI R24,BYTE3(@0)
                    	SBCI R25,BYTE4(@0)
                    	.ENDM
                    
                    	.MACRO __ANDBMNN
                    	LDS R30,@0+(@1)
                    	ANDI R30,LOW(@2)
                    	STS @0+(@1),R30
                    	.ENDM
                    
                    	.MACRO __ANDWMNN
                    	LDS R30,@0+(@1)
                    	ANDI R30,LOW(@2)
                    	STS @0+(@1),R30
                    	LDS R30,@0+(@1)+1
                    	ANDI R30,HIGH(@2)
                    	STS @0+(@1)+1,R30
                    	.ENDM
                    
                    	.MACRO __ANDD1N
                    	ANDI R30,LOW(@0)
                    	ANDI R31,HIGH(@0)
                    	ANDI R22,BYTE3(@0)
                    	ANDI R23,BYTE4(@0)
                    	.ENDM
                    
                    	.MACRO __ANDD2N
                    	ANDI R26,LOW(@0)
                    	ANDI R27,HIGH(@0)
                    	ANDI R24,BYTE3(@0)
                    	ANDI R25,BYTE4(@0)
                    	.ENDM
                    
                    	.MACRO __ORBMNN
                    	LDS R30,@0+(@1)
                    	ORI R30,LOW(@2)
                    	STS @0+(@1),R30
                    	.ENDM
                    
                    	.MACRO __ORWMNN
                    	LDS R30,@0+(@1)
                    	ORI R30,LOW(@2)
                    	STS @0+(@1),R30
                    	LDS R30,@0+(@1)+1
                    	ORI R30,HIGH(@2)
                    	STS @0+(@1)+1,R30
                    	.ENDM
                    
                    	.MACRO __ORD1N
                    	ORI R30,LOW(@0)
                    	ORI R31,HIGH(@0)
                    	ORI R22,BYTE3(@0)
                    	ORI R23,BYTE4(@0)
                    	.ENDM
                    
                    	.MACRO __ORD2N
                    	ORI R26,LOW(@0)
                    	ORI R27,HIGH(@0)
                    	ORI R24,BYTE3(@0)
                    	ORI R25,BYTE4(@0)
                    	.ENDM
                    
                    	.MACRO __DELAY_USB
                    	LDI R24,LOW(@0)
                    __DELAY_USB_LOOP:
                    	DEC R24
                    	BRNE __DELAY_USB_LOOP
                    	.ENDM
                    
                    	.MACRO __DELAY_USW
                    	LDI R24,LOW(@0)
                    	LDI R25,HIGH(@0)
                    __DELAY_USW_LOOP:
                    	SBIW R24,1
                    	BRNE __DELAY_USW_LOOP
                    	.ENDM
                    
                    	.MACRO __GETD1S
                    	LDD R30,Y+@0
                    	LDD R31,Y+@0+1
                    	LDD R22,Y+@0+2
                    	LDD R23,Y+@0+3
                    	.ENDM
                    
                    	.MACRO __GETD2S
                    	LDD R26,Y+@0
                    	LDD R27,Y+@0+1
                    	LDD R24,Y+@0+2
                    	LDD R25,Y+@0+3
                    	.ENDM
                    
                    	.MACRO __PUTD1S
                    	STD Y+@0,R30
                    	STD Y+@0+1,R31
                    	STD Y+@0+2,R22
                    	STD Y+@0+3,R23
                    	.ENDM
                    
                    	.MACRO __PUTD2S
                    	STD Y+@0,R26
                    	STD Y+@0+1,R27
                    	STD Y+@0+2,R24
                    	STD Y+@0+3,R25
                    	.ENDM
                    
                    	.MACRO __PUTDZ2
                    	STD Z+@0,R26
                    	STD Z+@0+1,R27
                    	STD Z+@0+2,R24
                    	STD Z+@0+3,R25
                    	.ENDM
                    
                    	.MACRO __CLRD1S
                    	STD Y+@0,R30
                    	STD Y+@0+1,R30
                    	STD Y+@0+2,R30
                    	STD Y+@0+3,R30
                    	.ENDM
                    
                    	.MACRO __POINTB1MN
                    	LDI R30,LOW(@0+(@1))
                    	.ENDM
                    
                    	.MACRO __POINTW1MN
                    	LDI R30,LOW(@0+(@1))
                    	LDI R31,HIGH(@0+(@1))
                    	.ENDM
                    
                    	.MACRO __POINTD1M
                    	LDI R30,LOW(@0)
                    	LDI R31,HIGH(@0)
                    	LDI R22,BYTE3(@0)
                    	LDI R23,BYTE4(@0)
                    	.ENDM
                    
                    	.MACRO __POINTW1FN
                    	LDI R30,LOW(2*@0+(@1))
                    	LDI R31,HIGH(2*@0+(@1))
                    	.ENDM
                    
                    	.MACRO __POINTD1FN
                    	LDI R30,LOW(2*@0+(@1))
                    	LDI R31,HIGH(2*@0+(@1))
                    	LDI R22,BYTE3(2*@0+(@1))
                    	LDI R23,BYTE4(2*@0+(@1))
                    	.ENDM
                    
                    	.MACRO __POINTB2MN
                    	LDI R26,LOW(@0+(@1))
                    	.ENDM
                    
                    	.MACRO __POINTW2MN
                    	LDI R26,LOW(@0+(@1))
                    	LDI R27,HIGH(@0+(@1))
                    	.ENDM
                    
                    	.MACRO __POINTW2FN
                    	LDI R26,LOW(2*@0+(@1))
                    	LDI R27,HIGH(2*@0+(@1))
                    	.ENDM
                    
                    	.MACRO __POINTD2FN
                    	LDI R26,LOW(2*@0+(@1))
                    	LDI R27,HIGH(2*@0+(@1))
                    	LDI R24,BYTE3(2*@0+(@1))
                    	LDI R25,BYTE4(2*@0+(@1))
                    	.ENDM
                    
                    	.MACRO __POINTBRM
                    	LDI R@0,LOW(@1)
                    	.ENDM
                    
                    	.MACRO __POINTWRM
                    	LDI R@0,LOW(@2)
                    	LDI R@1,HIGH(@2)
                    	.ENDM
                    
                    	.MACRO __POINTBRMN
                    	LDI R@0,LOW(@1+(@2))
                    	.ENDM
                    
                    	.MACRO __POINTWRMN
                    	LDI R@0,LOW(@2+(@3))
                    	LDI R@1,HIGH(@2+(@3))
                    	.ENDM
                    
                    	.MACRO __POINTWRFN
                    	LDI R@0,LOW(@2*2+(@3))
                    	LDI R@1,HIGH(@2*2+(@3))
                    	.ENDM
                    
                    	.MACRO __GETD1N
                    	LDI R30,LOW(@0)
                    	LDI R31,HIGH(@0)
                    	LDI R22,BYTE3(@0)
                    	LDI R23,BYTE4(@0)
                    	.ENDM
                    
                    	.MACRO __GETD2N
                    	LDI R26,LOW(@0)
                    	LDI R27,HIGH(@0)
                    	LDI R24,BYTE3(@0)
                    	LDI R25,BYTE4(@0)
                    	.ENDM
                    
                    	.MACRO __GETB1MN
                    	LDS R30,@0+(@1)
                    	.ENDM
                    
                    	.MACRO __GETB1HMN
                    	LDS R31,@0+(@1)
                    	.ENDM
                    
                    	.MACRO __GETW1MN
                    	LDS R30,@0+(@1)
                    	LDS R31,@0+(@1)+1
                    	.ENDM
                    
                    	.MACRO __GETD1MN
                    	LDS R30,@0+(@1)
                    	LDS R31,@0+(@1)+1
                    	LDS R22,@0+(@1)+2
                    	LDS R23,@0+(@1)+3
                    	.ENDM
                    
                    	.MACRO __GETBRMN
                    	LDS R@0,@1+(@2)
                    	.ENDM
                    
                    	.MACRO __GETWRMN
                    	LDS R@0,@2+(@3)
                    	LDS R@1,@2+(@3)+1
                    	.ENDM
                    
                    	.MACRO __GETWRZ
                    	LDD R@0,Z+@2
                    	LDD R@1,Z+@2+1
                    	.ENDM
                    
                    	.MACRO __GETD2Z
                    	LDD R26,Z+@0
                    	LDD R27,Z+@0+1
                    	LDD R24,Z+@0+2
                    	LDD R25,Z+@0+3
                    	.ENDM
                    
                    	.MACRO __GETB2MN
                    	LDS R26,@0+(@1)
                    	.ENDM
                    
                    	.MACRO __GETW2MN
                    	LDS R26,@0+(@1)
                    	LDS R27,@0+(@1)+1
                    	.ENDM
                    
                    	.MACRO __GETD2MN
                    	LDS R26,@0+(@1)
                    	LDS R27,@0+(@1)+1
                    	LDS R24,@0+(@1)+2
                    	LDS R25,@0+(@1)+3
                    	.ENDM
                    
                    	.MACRO __PUTB1MN
                    	STS @0+(@1),R30
                    	.ENDM
                    
                    	.MACRO __PUTW1MN
                    	STS @0+(@1),R30
                    	STS @0+(@1)+1,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1MN
                    	STS @0+(@1),R30
                    	STS @0+(@1)+1,R31
                    	STS @0+(@1)+2,R22
                    	STS @0+(@1)+3,R23
                    	.ENDM
                    
                    	.MACRO __PUTB1EN
                    	LDI R26,LOW(@0+(@1))
                    	LDI R27,HIGH(@0+(@1))
                    	CALL __EEPROMWRB
                    	.ENDM
                    
                    	.MACRO __PUTW1EN
                    	LDI R26,LOW(@0+(@1))
                    	LDI R27,HIGH(@0+(@1))
                    	CALL __EEPROMWRW
                    	.ENDM
                    
                    	.MACRO __PUTD1EN
                    	LDI R26,LOW(@0+(@1))
                    	LDI R27,HIGH(@0+(@1))
                    	CALL __EEPROMWRD
                    	.ENDM
                    
                    	.MACRO __PUTBR0MN
                    	STS @0+(@1),R0
                    	.ENDM
                    
                    	.MACRO __PUTBMRN
                    	STS @0+(@1),R@2
                    	.ENDM
                    
                    	.MACRO __PUTWMRN
                    	STS @0+(@1),R@2
                    	STS @0+(@1)+1,R@3
                    	.ENDM
                    
                    	.MACRO __PUTBZR
                    	STD Z+@1,R@0
                    	.ENDM
                    
                    	.MACRO __PUTWZR
                    	STD Z+@2,R@0
                    	STD Z+@2+1,R@1
                    	.ENDM
                    
                    	.MACRO __GETW1R
                    	MOV R30,R@0
                    	MOV R31,R@1
                    	.ENDM
                    
                    	.MACRO __GETW2R
                    	MOV R26,R@0
                    	MOV R27,R@1
                    	.ENDM
                    
                    	.MACRO __GETWRN
                    	LDI R@0,LOW(@2)
                    	LDI R@1,HIGH(@2)
                    	.ENDM
                    
                    	.MACRO __PUTW1R
                    	MOV R@0,R30
                    	MOV R@1,R31
                    	.ENDM
                    
                    	.MACRO __PUTW2R
                    	MOV R@0,R26
                    	MOV R@1,R27
                    	.ENDM
                    
                    	.MACRO __ADDWRN
                    	SUBI R@0,LOW(-@2)
                    	SBCI R@1,HIGH(-@2)
                    	.ENDM
                    
                    	.MACRO __ADDWRR
                    	ADD R@0,R@2
                    	ADC R@1,R@3
                    	.ENDM
                    
                    	.MACRO __SUBWRN
                    	SUBI R@0,LOW(@2)
                    	SBCI R@1,HIGH(@2)
                    	.ENDM
                    
                    	.MACRO __SUBWRR
                    	SUB R@0,R@2
                    	SBC R@1,R@3
                    	.ENDM
                    
                    	.MACRO __ANDWRN
                    	ANDI R@0,LOW(@2)
                    	ANDI R@1,HIGH(@2)
                    	.ENDM
                    
                    	.MACRO __ANDWRR
                    	AND R@0,R@2
                    	AND R@1,R@3
                    	.ENDM
                    
                    	.MACRO __ORWRN
                    	ORI R@0,LOW(@2)
                    	ORI R@1,HIGH(@2)
                    	.ENDM
                    
                    	.MACRO __ORWRR
                    	OR  R@0,R@2
                    	OR  R@1,R@3
                    	.ENDM
                    
                    	.MACRO __EORWRR
                    	EOR R@0,R@2
                    	EOR R@1,R@3
                    	.ENDM
                    
                    	.MACRO __GETWRS
                    	LDD R@0,Y+@2
                    	LDD R@1,Y+@2+1
                    	.ENDM
                    
                    	.MACRO __PUTBSR
                    	STD Y+@1,R@0
                    	.ENDM
                    
                    	.MACRO __PUTWSR
                    	STD Y+@2,R@0
                    	STD Y+@2+1,R@1
                    	.ENDM
                    
                    	.MACRO __MOVEWRR
                    	MOV R@0,R@2
                    	MOV R@1,R@3
                    	.ENDM
                    
                    	.MACRO __INWR
                    	IN  R@0,@2
                    	IN  R@1,@2+1
                    	.ENDM
                    
                    	.MACRO __OUTWR
                    	OUT @2+1,R@1
                    	OUT @2,R@0
                    	.ENDM
                    
                    	.MACRO __CALL1MN
                    	LDS R30,@0+(@1)
                    	LDS R31,@0+(@1)+1
                    	ICALL
                    	.ENDM
                    
                    	.MACRO __CALL1FN
                    	LDI R30,LOW(2*@0+(@1))
                    	LDI R31,HIGH(2*@0+(@1))
                    	CALL __GETW1PF
                    	ICALL
                    	.ENDM
                    
                    	.MACRO __CALL2EN
                    	PUSH R26
                    	PUSH R27
                    	LDI R26,LOW(@0+(@1))
                    	LDI R27,HIGH(@0+(@1))
                    	CALL __EEPROMRDW
                    	POP R27
                    	POP R26
                    	ICALL
                    	.ENDM
                    
                    	.MACRO __CALL2EX
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	CALL __EEPROMRDD
                    	ICALL
                    	.ENDM
                    
                    	.MACRO __GETW1STACK
                    	IN  R30,SPL
                    	IN  R31,SPH
                    	ADIW R30,@0+1
                    	LD  R0,Z+
                    	LD  R31,Z
                    	MOV R30,R0
                    	.ENDM
                    
                    	.MACRO __GETD1STACK
                    	IN  R30,SPL
                    	IN  R31,SPH
                    	ADIW R30,@0+1
                    	LD  R0,Z+
                    	LD  R1,Z+
                    	LD  R22,Z
                    	MOVW R30,R0
                    	.ENDM
                    
                    	.MACRO __NBST
                    	BST R@0,@1
                    	IN  R30,SREG
                    	LDI R31,0x40
                    	EOR R30,R31
                    	OUT SREG,R30
                    	.ENDM
                    
                    
                    	.MACRO __PUTB1SN
                    	LDD R26,Y+@0
                    	LDD R27,Y+@0+1
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1SN
                    	LDD R26,Y+@0
                    	LDD R27,Y+@0+1
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1SN
                    	LDD R26,Y+@0
                    	LDD R27,Y+@0+1
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	CALL __PUTDP1
                    	.ENDM
                    
                    	.MACRO __PUTB1SNS
                    	LDD R26,Y+@0
                    	LDD R27,Y+@0+1
                    	ADIW R26,@1
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1SNS
                    	LDD R26,Y+@0
                    	LDD R27,Y+@0+1
                    	ADIW R26,@1
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1SNS
                    	LDD R26,Y+@0
                    	LDD R27,Y+@0+1
                    	ADIW R26,@1
                    	CALL __PUTDP1
                    	.ENDM
                    
                    	.MACRO __PUTB1PMN
                    	LDS R26,@0
                    	LDS R27,@0+1
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1PMN
                    	LDS R26,@0
                    	LDS R27,@0+1
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1PMN
                    	LDS R26,@0
                    	LDS R27,@0+1
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	CALL __PUTDP1
                    	.ENDM
                    
                    	.MACRO __PUTB1PMNS
                    	LDS R26,@0
                    	LDS R27,@0+1
                    	ADIW R26,@1
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1PMNS
                    	LDS R26,@0
                    	LDS R27,@0+1
                    	ADIW R26,@1
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1PMNS
                    	LDS R26,@0
                    	LDS R27,@0+1
                    	ADIW R26,@1
                    	CALL __PUTDP1
                    	.ENDM
                    
                    	.MACRO __PUTB1RN
                    	MOVW R26,R@0
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1RN
                    	MOVW R26,R@0
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1RN
                    	MOVW R26,R@0
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	CALL __PUTDP1
                    	.ENDM
                    
                    	.MACRO __PUTB1RNS
                    	MOVW R26,R@0
                    	ADIW R26,@1
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1RNS
                    	MOVW R26,R@0
                    	ADIW R26,@1
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1RNS
                    	MOVW R26,R@0
                    	ADIW R26,@1
                    	CALL __PUTDP1
                    	.ENDM
                    
                    	.MACRO __PUTB1RON
                    	MOV R26,R@0
                    	MOV R27,R@1
                    	SUBI R26,LOW(-@2)
                    	SBCI R27,HIGH(-@2)
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1RON
                    	MOV R26,R@0
                    	MOV R27,R@1
                    	SUBI R26,LOW(-@2)
                    	SBCI R27,HIGH(-@2)
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1RON
                    	MOV R26,R@0
                    	MOV R27,R@1
                    	SUBI R26,LOW(-@2)
                    	SBCI R27,HIGH(-@2)
                    	CALL __PUTDP1
                    	.ENDM
                    
                    	.MACRO __PUTB1RONS
                    	MOV R26,R@0
                    	MOV R27,R@1
                    	ADIW R26,@2
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1RONS
                    	MOV R26,R@0
                    	MOV R27,R@1
                    	ADIW R26,@2
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1RONS
                    	MOV R26,R@0
                    	MOV R27,R@1
                    	ADIW R26,@2
                    	CALL __PUTDP1
                    	.ENDM
                    
                    
                    	.MACRO __GETB1SX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@0)
                    	SBCI R31,HIGH(-@0)
                    	LD  R30,Z
                    	.ENDM
                    
                    	.MACRO __GETB1HSX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@0)
                    	SBCI R31,HIGH(-@0)
                    	LD  R31,Z
                    	.ENDM
                    
                    	.MACRO __GETW1SX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@0)
                    	SBCI R31,HIGH(-@0)
                    	LD  R0,Z+
                    	LD  R31,Z
                    	MOV R30,R0
                    	.ENDM
                    
                    	.MACRO __GETD1SX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@0)
                    	SBCI R31,HIGH(-@0)
                    	LD  R0,Z+
                    	LD  R1,Z+
                    	LD  R22,Z+
                    	LD  R23,Z
                    	MOVW R30,R0
                    	.ENDM
                    
                    	.MACRO __GETB2SX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	LD  R26,X
                    	.ENDM
                    
                    	.MACRO __GETW2SX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	LD  R0,X+
                    	LD  R27,X
                    	MOV R26,R0
                    	.ENDM
                    
                    	.MACRO __GETD2SX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	LD  R0,X+
                    	LD  R1,X+
                    	LD  R24,X+
                    	LD  R25,X
                    	MOVW R26,R0
                    	.ENDM
                    
                    	.MACRO __GETBRSX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@1)
                    	SBCI R31,HIGH(-@1)
                    	LD  R@0,Z
                    	.ENDM
                    
                    	.MACRO __GETWRSX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@2)
                    	SBCI R31,HIGH(-@2)
                    	LD  R@0,Z+
                    	LD  R@1,Z
                    	.ENDM
                    
                    	.MACRO __GETBRSX2
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	LD  R@0,X
                    	.ENDM
                    
                    	.MACRO __GETWRSX2
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@2)
                    	SBCI R27,HIGH(-@2)
                    	LD  R@0,X+
                    	LD  R@1,X
                    	.ENDM
                    
                    	.MACRO __LSLW8SX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@0)
                    	SBCI R31,HIGH(-@0)
                    	LD  R31,Z
                    	CLR R30
                    	.ENDM
                    
                    	.MACRO __PUTB1SX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1SX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1SX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	ST  X+,R30
                    	ST  X+,R31
                    	ST  X+,R22
                    	ST  X,R23
                    	.ENDM
                    
                    	.MACRO __CLRW1SX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	ST  X+,R30
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __CLRD1SX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	ST  X+,R30
                    	ST  X+,R30
                    	ST  X+,R30
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTB2SX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@0)
                    	SBCI R31,HIGH(-@0)
                    	ST  Z,R26
                    	.ENDM
                    
                    	.MACRO __PUTW2SX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@0)
                    	SBCI R31,HIGH(-@0)
                    	ST  Z+,R26
                    	ST  Z,R27
                    	.ENDM
                    
                    	.MACRO __PUTD2SX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@0)
                    	SBCI R31,HIGH(-@0)
                    	ST  Z+,R26
                    	ST  Z+,R27
                    	ST  Z+,R24
                    	ST  Z,R25
                    	.ENDM
                    
                    	.MACRO __PUTBSRX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@1)
                    	SBCI R31,HIGH(-@1)
                    	ST  Z,R@0
                    	.ENDM
                    
                    	.MACRO __PUTWSRX
                    	MOVW R30,R28
                    	SUBI R30,LOW(-@2)
                    	SBCI R31,HIGH(-@2)
                    	ST  Z+,R@0
                    	ST  Z,R@1
                    	.ENDM
                    
                    	.MACRO __PUTB1SNX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	LD  R0,X+
                    	LD  R27,X
                    	MOV R26,R0
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	ST  X,R30
                    	.ENDM
                    
                    	.MACRO __PUTW1SNX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	LD  R0,X+
                    	LD  R27,X
                    	MOV R26,R0
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	ST  X+,R30
                    	ST  X,R31
                    	.ENDM
                    
                    	.MACRO __PUTD1SNX
                    	MOVW R26,R28
                    	SUBI R26,LOW(-@0)
                    	SBCI R27,HIGH(-@0)
                    	LD  R0,X+
                    	LD  R27,X
                    	MOV R26,R0
                    	SUBI R26,LOW(-@1)
                    	SBCI R27,HIGH(-@1)
                    	ST  X+,R30
                    	ST  X+,R31
                    	ST  X+,R22
                    	ST  X,R23
                    	.ENDM
                    
                    	.MACRO __MULBRR
                    	MULS R@0,R@1
                    	MOVW R30,R0
                    	.ENDM
                    
                    	.MACRO __MULBRRU
                    	MUL R@0,R@1
                    	MOVW R30,R0
                    	.ENDM
                    
                    	.MACRO __MULBRR0
                    	MULS R@0,R@1
                    	.ENDM
                    
                    	.MACRO __MULBRRU0
                    	MUL R@0,R@1
                    	.ENDM
                    
                    	.MACRO __MULBNWRU
                    	LDI R26,@2
                    	MUL R26,R@0
                    	MOVW R30,R0
                    	MUL R26,R@1
                    	ADD R31,R0
                    	.ENDM
                    
                    	.CSEG
                    	.ORG 0x00
                    
                    ;START OF CODE MARKER
                    __START_OF_CODE:
                    
                    ;INTERRUPT VECTORS
                    	JMP __RESET
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    	JMP 0x00
                    
                    _0x3:
                    	.DB 0x0,0x0,0x1,0x0,0x2,0x0,0x4,0x0
                    	.DB 0x8,0x0,0x10,0x0,0x20,0x0,0x40,0x0
                    	.DB 0x80,0x0
                    __RESET:
                    	CLI
                    	CLR R30
                    	OUT EECR,R30
                    
                    ;INTERRUPT VECTORS ARE PLACED
                    ;AT THE START OF FLASH
                    	LDI R31,1
                    	OUT GICR,R31
                    	OUT GICR,R30
                    	OUT MCUCR,R30
                    
                    ;DISABLE WATCHDOG
                    	LDI R31,0x18
                    	OUT WDTCR,R31
                    	OUT WDTCR,R30
                    
                    ;CLEAR R2-R14
                    	LDI R24,(14-2)+1
                    	LDI R26,2
                    	CLR R27
                    __CLEAR_REG:
                    	ST  X+,R30
                    	DEC R24
                    	BRNE __CLEAR_REG
                    
                    ;CLEAR SRAM
                    	LDI R24,LOW(__CLEAR_SRAM_SIZE)
                    	LDI R25,HIGH(__CLEAR_SRAM_SIZE)
                    	LDI R26,__SRAM_START
                    __CLEAR_SRAM:
                    	ST  X+,R30
                    	SBIW R24,1
                    	BRNE __CLEAR_SRAM
                    
                    ;HARDWARE STACK POINTER INITIALIZATION
                    	LDI R30,LOW(__SRAM_END-__HEAP_SIZE)
                    	OUT SPL,R30
                    	LDI R30,HIGH(__SRAM_END-__HEAP_SIZE)
                    	OUT SPH,R30
                    
                    ;DATA STACK POINTER INITIALIZATION
                    	LDI R28,LOW(__SRAM_START+__DSTACK_SIZE)
                    	LDI R29,HIGH(__SRAM_START+__DSTACK_SIZE)
                    
                    	JMP _main
                    
                    	.ESEG
                    	.ORG 1
                    
                    	.DSEG
                    	.ORG 0x160
                    
                    	.CSEG
                    ;#include <mega16a.h>
                    	#ifndef __SLEEP_DEFINED__
                    	#define __SLEEP_DEFINED__
                    	.EQU __se_bit=0x40
                    	.EQU __sm_mask=0xB0
                    	.EQU __sm_powerdown=0x20
                    	.EQU __sm_powersav e=0x30
                    	.EQU __sm_standby=0xA0
                    	.EQU __sm_ext_standby=0xB0
                    	.EQU __sm_adc_noise_red=0x10
                    	.SET power_ctrl_reg=mcucr
                    	#endif
                    ;#include <mega16_bits.h>
                    ;#include <delay.h>
                    ;void main(){
                    ; 0000 0004 void main(){
                    
                    	.CSEG
                    _main:
                    ; .FSTART _main
                    ; 0000 0005 int a[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80},b=0;
                    ; 0000 0006 DDRC=1;
                    	SBIW R28,18
                    	LDI R24,18
                    	LDI R26,LOW(0)
                    	LDI R27,HIGH(0)
                    	LDI R30,LOW(_0x3*2)
                    	LDI R31,HIGH(_0x3*2)
                    	CALL __INITLOCB
                    ;	a -> Y+0
                    ;	b -> R16,R17
                    	__GETWRN 16,17,0
                    	LDI R30,LOW(1)
                    	OUT 0x14,R30
                    ; 0000 0007 
                    ; 0000 0008 while(1){
                    _0x4:
                    ; 0000 0009  PORTC=a[b++];
                    	MOVW R30,R16
                    	__ADDWRN 16,17,1
                    	MOVW R26,R28
                    	LSL R30
                    	ROL R31
                    	ADD R26,R30
                    	ADC R27,R31
                    	LD  R30,X
                    	OUT 0x15,R30
                    ; 0000 000A  delay_ms(500);
                    	LDI R26,LOW(500)
                    	LDI R27,HIGH(500)
                    	CALL _delay_ms
                    ; 0000 000B  if(b==7) b=0;
                    	LDI R30,LOW(7)
                    	LDI R31,HIGH(7)
                    	CP  R30,R16
                    	CPC R31,R17
                    	BRNE _0x7
                    	__GETWRN 16,17,0
                    ; 0000 000C  }
                    _0x7:
                    	RJMP _0x4
                    ; 0000 000D  }
                    _0x8:
                    	RJMP _0x8
                    ; .FEND
                    
                    	.CSEG
                    
                    	.CSEG
                    _delay_ms:
                    	adiw r26,0
                    	breq __delay_ms1
                    __delay_ms0:
                    	__DELAY_USW 0xFA
                    	wdr
                    	sbiw r26,1
                    	brne __delay_ms0
                    __delay_ms1:
                    	ret
                    
                    __INITLOCB:
                    __INITLOCW:
                    	ADD R26,R28
                    	ADC R27,R29
                    __INITLOC0:
                    	LPM R0,Z+
                    	ST  X+,R0
                    	DEC R24
                    	BRNE __INITLOC0
                    	RET
                    
                    ;END OF CODE MARKER
                    __END_OF_CODE:
                    و معادل دستور
                    کد:
                    #include <mega16a.h>
                    #include <mega16_bits.h>
                    #include <delay.h>
                    void main(){
                    int a[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80},b=0;
                    DDRC=0xff;
                    
                    while(1){
                     PORTC=a[b++];
                     delay_ms(500);
                     if(b==7) b=0;
                      }
                      }
                    حالا نرم افزار چه دستورات غیر ضروری تولید کرده است با تشکر
                    سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

                    دیدگاه


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

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

                      دیدگاه


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

                        سلام. این تاپیک قدیمیه ولی گفتم شاید اینجا بهتره موضوع رو مطرح کنم تا اینکه تاپیک جدید رو بزنم.
                        مشکل سر یه کد هست که ترکیب اسمبلی و C در محیط Atmel Studio اجراش بدون مشکله. میخواستم اون رو بیارم تو IAR ولی از سه چهار خط آخر ایراد میگیره. ظاهرا سینتکسهای اسمبلی در IAR و gcc تفاوت داره.
                        ممنون میشم راهنماییم کنید. از خط
                        : "=&d" (ctr) ایراد شروع میشه.

                        کد:
                        struct ccRGB { byte g; byte r; byte b; };
                        
                        void ws2812_setleds    (struct ccRGB *ledarray, uint number_of_leds);
                        void ws2812_setleds_pin(struct ccRGB *ledarray, uint number_of_leds,byte pinmask);
                        void ws2812_sendarray     (byte *array,uint length);
                        void ws2812_sendarray_mask(byte *array,uint length, byte pinmask);
                        
                        #define ws2812_PORTREG  VPORT3_OUT
                        #define ws2812_DDRREG   VPORT3_DIR
                        #define ws2812_pin        3
                        
                        void inline ws2812_setleds(struct ccRGB *ledarray, uint leds)
                        {
                           ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));
                        }
                        
                        void inline ws2812_setleds_pin(struct ccRGB *ledarray, uint leds, byte pinmask)
                        {
                          ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR
                          ws2812_sendarray_mask((byte*)ledarray,leds+leds+leds,pinmask);
                          _delay_us(60);
                        }
                        
                        void ws2812_sendarray(byte *data,uint datlen)
                        {
                          ws2812_sendarray_mask(data,datlen,_BV(ws2812_pin));
                        }
                        
                        void inline ws2812_sendarray_mask(byte *data,uint datlen,byte maskhi)
                        {
                          byte curbyte,ctr,masklo;
                          byte sreg_prev;
                          masklo    =~maskhi&ws2812_PORTREG;
                          maskhi |=        ws2812_PORTREG;
                          cli();
                          while (datlen--)
                          {
                            curbyte=*data++;
                            __asm (
                            "       ldi   %0,8  \n\t"
                            "loop%=:            \n\t"
                            "       out   %2,%3 \n\t"    //  '1' [01] '0' [01] - re
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "       sbrs  %1,7  \n\t"    //  '1' [03] '0' [02]
                            "       out   %2,%4 \n\t"    //  '1' [--] '0' [03] - fe-low
                            "       lsl   %1    \n\t"    //  '1' [04] '0' [04]
                            "nop                  \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "       out   %2,%4 \n\t"    //  '1' [+1] '0' [+1] - fe-high
                            "nop                  \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "rjmp .+0             \n\t"
                            "       dec   %0    \n\t"    //  '1' [+2] '0' [+2]
                            "       brne  loop%=\n\t"    //  '1' [+3] '0' [+4]
                            :    "=&d" (ctr)
                            :    "r" (curbyte), "I" (_SFR_IO_ADDR(ws2812_PORTREG)), "r" (maskhi), "r" (masklo)
                            );
                          }
                        }

                        دیدگاه


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

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

                          دیدگاه


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

                            ممنون از توجهتون ولی متوجه منظورتون نشدم. بخش پایانی کد اسمبلی هست و مشکل من اینه که با سینتکس gcc نوشته شده و میخوام ببرمش تو محیط IAR. در اصل همین کد اسمبلی رو با سینتکس IAR بنویسم.

                            شما فایلی میتونید معرفی کنید که نحوه نوشتن اسمبلی رو تو IAR به طور کامل گفته باشه. منظورم گرفتن آرگومان از ورودی تابع C و یا فرستادن یک متغیر از بخش اسمبلی تابع به بیرون تابع C.
                            البته غیر از Assembler Reference Guide خود IAR چون اونی که میخواستم رو نداشت توش.

                            ممنون.
                            جدیدترین ویرایش توسط amir_mhdi; ۱۱:۳۰ ۱۳۹۶/۰۵/۰۳.

                            دیدگاه


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

                              اگر بتونید چند نمونه برنامه که ترکیب C و asm که در IAR نوشته شده رو بزارید ممنون میشم. شاید از اونها چیزی دستگیرم بشه.
                              چجوری میتونیم تو IAR تابعی مثل زیر داشته باشیم :

                              کد:
                              void func1(char var1)
                              {
                                  char var2;
                                  asm("ldi r24,var1");
                                  asm("ldi r25,var2");
                              }
                              میخوام از var1,var2 تو قسمتهای اسمبلی استفاده کنم.
                              جدیدترین ویرایش توسط amir_mhdi; ۱۴:۲۴ ۱۳۹۶/۰۵/۰۳.

                              دیدگاه


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

                                مشکل رو تقریبا حل کردم البته یه جور دیگه.
                                اگر شما بخواین از رجیسترهای R0-R15 چند تا رو استفاده کنید باید اینکارها رو انجام بدین. اول تو تنظیمات Compiler این گزینه رو تو command line ها بزارین
                                کد:
                                --lock_regs 1
                                با اینکار یک رجیستر رو رزور میکنید یعنی R15 و اگر این عدد رو 3 بزارید میشه R15 , R14 , R13 .
                                حالا اگر این تعریف رو انجام بدین میتونید از اون رجیسترها استفاده کنید :
                                کد:
                                __regvar __no_init volatile byte cte @15;
                                با اینکار متغیر cte در رجیستر R15 قرار میگیرد و میتوانید در بخش اسمبلی کدتون ازش استفاده کنید.

                                دیدگاه

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