diff options
Diffstat (limited to 'datorteknik')
| -rw-r--r-- | datorteknik/Assemblyinstruktioner.md | 61 | ||||
| -rw-r--r-- | datorteknik/Binär aritmetik.md | 21 | ||||
| -rw-r--r-- | datorteknik/Binära tal.md | 41 | ||||
| -rw-r--r-- | datorteknik/Fixtal.md | 8 | ||||
| -rw-r--r-- | datorteknik/Flyttal.md | 26 |
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 +``` |
