Olika arkitekturer har olika instruktionsmängder. # [[AVR]] Instruktioner kommer i grupper som gör nästan samma sak men på lite olika sätt. Se till exempel ADD (Add without Carry) och ADC (Add with Carry). [Instruktionsmängd på kurshemsidan för TSEA82.](http://www.isy.liu.se/edu/kurs/TSEA82/kursmaterial/5_Avr_instr_set.pdf) ## Flytta data Load (LD, LDI, LDS) kopierar data. MOV kopierar mellan två register. ## Aritmetiska operationer Addition, subtraktion, multiplikation. Division är inte implementerad för den är för stor till ytan. ## Logiska operationer Hantera register som en hög med bitar. Grupp A "vanlig" logik. Exempel: ANDI (Logical And with Immediate). Grupp B skiftinstruktioner. Exempel: LSR (Logical Shift Right). Kommer ibland i två varianter, en logisk och en aritmetisk. Till exempel lämnar ASR (Arithmetic Shift Right) kvar den mest signifikanta biten eftersom den vid aritmetik benämner tecknet. Upp till programmeran att se till att rätt sak händer. ## Hopp Anrop (CALL) är inte hopp eftersom de returnerar (RET). Ovillkorligt: JMP (Jump) till symboliska adresser. RJMP (Relative Jump) tar mindre plats men kan inte hoppa lika långt som ett vanlig JMP. Villkorligt: BREQ (Branch if Equal). Används för att skapa control flow. Finns en hög olika BRXX. ## I/O - instruktioner Portar är 8 bitar breda. Enskilda bitar kan fungera som antingen ingång eller utgång. Styrs via [[Datariktningsregister|datariktningsregistret]] DDRx. Utvärdet bestäms av portregistret PORTx och invärdet läsen från PINx. x = B, C eller D beroende på vilken typ av port (se chippet). OUT skriver till samtliga 8 bitar. SBI (Set Bit in I/O Register) och CBI (Clear Bit in I/O Register) hanterar specifika bitar. Kan också använda e.g. SBRC (Skip if Bit in Register Cleared), SBRS (Skip if Bit in Register Set), SBIC (Skip if Bit in I/O Register Cleared) och SBIS (Skip if Bit in Register Set) för att testa och hoppa utifrån värden. Exempel: ```asm ; --- GET_KEY. Bit 2 = 1 if key pressed GET_KEY: clr r16 ; r16 <= 0 sbic PINB,2 ; skip if not pressed ser r16 ; r16 <= FF ```