summaryrefslogtreecommitdiffstats
path: root/datorteknik/Assemblyinstruktioner.md
blob: 0a9d92b9fe4995f482b62f2b281eeb173b80eea6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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]] 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
```