summaryrefslogtreecommitdiffstats
path: root/datorteknik
diff options
context:
space:
mode:
Diffstat (limited to 'datorteknik')
-rw-r--r--datorteknik/Assemblyinstruktioner.md61
-rw-r--r--datorteknik/Binär aritmetik.md21
-rw-r--r--datorteknik/Binära tal.md41
-rw-r--r--datorteknik/Fixtal.md8
-rw-r--r--datorteknik/Flyttal.md26
5 files changed, 157 insertions, 0 deletions
diff --git a/datorteknik/Assemblyinstruktioner.md b/datorteknik/Assemblyinstruktioner.md
new file mode 100644
index 0000000..0a9d92b
--- /dev/null
+++ b/datorteknik/Assemblyinstruktioner.md
@@ -0,0 +1,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
+```
diff --git a/datorteknik/Binär aritmetik.md b/datorteknik/Binär aritmetik.md
new file mode 100644
index 0000000..df27814
--- /dev/null
+++ b/datorteknik/Binär aritmetik.md
@@ -0,0 +1,21 @@
+[[Aritmetik]] med [[Binära tal]].
+
+Inom datortekniken används mest talbas 2, (8), 10 och 16.
+
+Vilken talbas som gäller anges med subskript. E.g. $101_2 = 5_{10}$.
+
+Utförs av en [[ALU]].
+
+# Addition och [[Ordlängd]]
+
+Fungerar som vanligt. Ställ upp, räkna ettor och ta med en carry till nästa.
+
+Ordlängden bestämmer vad som händer med sista positionen. Om sista (första?)
+ettan inte ryms i ordlängden sätts C-flaggan istället.
+
+T.ex., med ordlängd 5: $01011_2 + 10111_2 = 00010_2, \ C = 1$ men med ordlängd
+8: $00001011_2 + 00010111_2 = 00100010_2, \ C = 0$.
+
+# Carry (C)
+
+# Overflow (V)
diff --git a/datorteknik/Binära tal.md b/datorteknik/Binära tal.md
new file mode 100644
index 0000000..1c3a4a6
--- /dev/null
+++ b/datorteknik/Binära tal.md
@@ -0,0 +1,41 @@
+[[Talbas]] 2.
+
+# Omvandling
+
+## Från decimalt tal
+
+Kan subtahera bort 2-potenser:
+
+$$98_{10} = 64 + 34 = 64 + 32 + 2 = 1100010_2$$
+
+Kan också dividera med två kontinuerligt. Resten vid divisionen baklänges blir
+talet i bas 2. Avrunda nedåt.
+
+$$98 / 2 = 49.0 \rightarrow 0$$
+$$49 / 2 = 24.5 \rightarrow 1$$
+$$24 / 2 = 12.0 \rightarrow 0$$
+$$12 / 2 = 6.0 \rightarrow 0$$
+$$6 / 2 = 3.0 \rightarrow 0$$
+$$3 / 2 = 1.5 \rightarrow 1$$
+$$1 / 2 = 0.5 \rightarrow 1$$
+$$\Rightarrow 98_{10} = 1100010_2$$
+
+## Från hexadecimala tal
+
+Superlätt binärt <-> hexadecimalt. Binärt -> hexadecimalt: lägg till nollor till
+vänster tills längden är mod 4 och översätt grupper om fyra till sitt
+hexadecimala tecken. Hexadecimalt -> binärt: översätt varje tecken till de fyra
+binära siffrorna rakt av.
+
+# Två-komplement
+
+Tyngden i den första siffran är negativ. Exempel: tolka $1011_2$ som ett
+två-komplementstal.
+
+$$1011_2 = -8 \cdot 1 + 4 \cdot 0 + 2 \cdot 1 + 1 \cdot 1 = -8 + 3 = -5_{10}$$
+
+## Byta tecken
+
+$$-X = \overline{X} + 1$$
+
+$$-3_{10} = -0011_2 = \overline{0011} + 1 = 1100 + 1 = 1101_2$$
diff --git a/datorteknik/Fixtal.md b/datorteknik/Fixtal.md
new file mode 100644
index 0000000..59cbcdc
--- /dev/null
+++ b/datorteknik/Fixtal.md
@@ -0,0 +1,8 @@
+Tal med decimaler. Se också [[Flyttal]].
+
+I grunden som vanliga [[Binära tal]] men ett decimaltecken sätts ut någonstans i
+den binära representationen.
+
+$$10111011_2 = 1011.1011 = 2^3 + 2^1 + 2^0 + 2^{-1} + 2^{-3} + 2^{-4} = 11.6875$$
+
+Enbart en tolkning som gör det till ett fixtal.
diff --git a/datorteknik/Flyttal.md b/datorteknik/Flyttal.md
new file mode 100644
index 0000000..1ae8f74
--- /dev/null
+++ b/datorteknik/Flyttal.md
@@ -0,0 +1,26 @@
+Decimaltal. Jämför [[Fixtal]].
+
+Har ett tecken, en mantissa och en exponent. Mantissan är implicit $+1$.
+
+Talet tolkas som $\mathrm{tecken} \cdot \mathrm{mantissa} \cdot 2^{\mathrm{exponent}}$.
+
+För ett 32-bitars flyttal gäller
+
+- 1 bit för tecknet ($1 \rightarrow -1$)
+- 8 bitar för exponenten
+- 23 bitar för mantissan
+
+Exempel:
+
+$$0\_01111100\_0100...$ = 1 \cdot 2^{124-127} \cdot (1 + 2^{-2}) = 1.25
+\cdot 2^{-3} = 0.15625$$
+
+# Problem
+
+Vissa decimaltal går inte att beskriva exakt på den här formen. Om det behövs
+krävs [[Decimal floating point]].
+
+```python
+>>> 0.1+0.2
+0.30000000000000004
+```