Det är ju en hel del sådana här detaljer som är unika för varje processortyp (men ganska lika inom samma serie, t.ex. AVR) som tar lite tid i början att lära sig.
Det där med adresserna till I/O-utrymmet är något som jag sällan tänker på när jag programmerar. Jag använder de macron som är färdiga i AVR-biblioteken, t.ex. PORTB, PINB etc... och jag har i ingen aning om vad för siffror som de motsvarar.
I C spelar det ju absolut ingen roll, då kompilatorn omvandlar koden till den instruktion som passar bäst, men i assembler kan man ju då och då få ett felmeddelande om man råkar försöka använda SBIC på nån ingång med "fel" adress. Är man då bara medveten om orsaken till felet är det ju lätt att byta ut
SBIC mot t.ex.
LD r16, IOREG och
SBRC r16.
En annan lite frustrerande sak är att alla aritmetiska funktionen inte går att utföra med alla register. Vissa instruktioner funkar bara på r16-r31, t.ex.
LDI rd,K (ladda register Rd med ett konstant tal, K. 16 <= Rd <= 31, 0 <= K <= 255)
Det finns några få 16-bitars instruktioner. Dessa brukar vara specialgjorda för de sex översta registren r26-27, r28-r29 och r30-r31. Dessa kallas då X, Y och Z i nomenklaturen.
För exempelvis X hamnar de "låga" bitarna (bot 0-7) i r28 och de "höga" bitarna (bit 8-15) i r29.
Dokument man måste ha tilll hands när man börjar med AVR assembler är
AVRAssembler User Guide och
AVR Instruction Set manual
User Guiden förklarar en del viktiga saker om minnesutrymmen, preprocessorkommandon osv.
Instruction Set manual förklarar alla instruktioner i detalj. Om man t.ex är osäker på om en bit ska anges som "bitnummer 0-7" eller som "bitmask 0-255" i samband med en viss funktion kan man se där.
Men boken av Per Foyer som jag rekommenderade ovan är guld värd! Man lär sig förutom assembler, även processorns arkitektur och flera av de "perifera funktionerna" så som SRAM, EEPROM, I/O, avbrott
(interrupt), timers och UART. Detaljerna får du förstås alltid i databladet för den aktuella processorn.