برای شروع برنامه نویسی به زبان اسمبلی باید از لحظه اتمام وضعیت 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 تا حدی متفاوت خواهد بود که بعدا به آن اشاره خواهد شد.