add x0, x1, #42HTML · Slides · PDF | Přehled předmětu
Petr Jedlička, Cyril Klimeš, Tomáš Pitner tomas.pitner@mendelu.cz
Především porozumnět pojmům, kterých není v této oblasti za ta léta vývoje málo.
Pochopit principy, na nichž funguje digitální počítač, zejména reprezentace čísel ve dvojkové soustavě a operace v ní.
Poznat nahrubo architekturu moderních počítačů a její hlavní prvky, jako jsou procesor s vnitřní strukturou a paměť, vstupy a výstupy.
Počítačový systém tvoří jeho hmatatelný technický základ (hardware) a programové vybavení (software), jehož základní část je systémová, tvořená zejména operačním systémem.
| technické vybavení | hardware; počítač, I/O zařízení — displej, klávesnice, myš, tiskárna, … |
| programové vybavení | software |
| aplikační | umožňuje na počítači provádět nějakou užitečnou činnost ( zpracování textů, výpočty, kreslení technických výkresů, zpracování obrazu, zvuku nebo videa) |
| systémové | umožňuje efektivní používání počítače |
operační systém
ostatní systémové programy
Vychází z koncepce, která vznikla v USA v období 1940-45.
Hlavní podíl na jejím vzniku měl John von Neumann (1903-57),
je proto označována jako von Neumannova architektura.
| Zobrazení znaků | v určené kódové soustavě, která čísla interpretuje jako znaky |
| Zobrazení čísel | ve dvojkové soustavě, v pevné nebo pohyblivé řádové čárce, v přímém, doplňkovém, inverzním kódu |
| Operační (instrukční) kód | říká, co se má provést, spočítat nebo kam jít dál… |
| Adresní část | říká, s čím se to má provést (s jakou hodnotou, kterým registrem, kterou paměťovou buňkou…) |
x1 a uložení výsledku do registru x0 (v architektuře ARM64):add x0, x1, #42| Nemusí jít o (paměťové) adresy v pravém slova smyslu, ale také o registry, konstanty, indexované adresy… |
| Zobrazení instrukcí | Operační kód | Adresní část | ||
|---|---|---|---|---|
jednoadresní | operační kód | A1 | ||
dvouadresní | operační kód | A1 | A2 | |
tříadresní | operační kód | A1 | A2 | A3 |
Číslo je řada symbolů, jímž se říká číslice (v běžné, tedy desítkové, soustavě číslice 0..9).
Každý symbol má definovánu váhu (hodnotu) odpovídající jeho pozici v řadě symbolů
Neboli "více vlevo → vyšší řád → vyšší hodnota"
Příklad: v čísle 23 má číslice 2 hodnotu 2*10=20 a číslice 3 hodnotu 3*1=3, takže celé číslo 23 má hodnotu 20+3=23.
Každé číslo je tedy součet matematických výrazů, kde každý je dán součinem číselného symbolu a jeho váhy, přičemž váha je mocninou báze (základu).
Mocnina (exponent) začíná nulou a roste po jedné (zprava doleva).
Mějme v desítkové soustavě číslo 347,52 (dec) = 3.102 + 4.101 + 7.100 + 5.10-1 + 2.10-2.
| Číselná soustava | Základ | Používané cifry |
|---|---|---|
Dvojková (binární) | 2 | 0, 1 |
Osmičková (oktalová) | 8 | 0, 1, 2, 3, 4, 5, 6, 7 |
Desítková (dekadická) | 10 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 |
Šestnáctková (hexa) | 16 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F |
Osmičková (oktalová) se dnes používá spíše výjimečně jen v úplně specifických situacích, kdy se nám hodí právě jedna oktalová číslice (=3 bity).
Napadá vás takový případ použití?
Nápověda: hledejte v systému souborů… na UNIX/Linux-like systémech
| DEC | BIN | OCT | HEX |
|---|---|---|---|
0 | 0000 | 00 | 0 |
1 | 0001 | 01 | 1 |
2 | 0010 | 02 | 2 |
3 | 0011 | 03 | 3 |
4 | 0100 | 04 | 4 |
5 | 0101 | 05 | 5 |
6 | 0110 | 06 | 6 |
7 | 0111 | 07 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
Příklad: 62393 (desítkově, dec) ⇒ F3B9 (šestnáctkově, hex) ⇒ 1111 0011 1011 1001 (dvojkově, bin)
Nejjednodušší je nejdříve z desítkové do šestnáctkové a pak z ní do dvojkové, protože každá šestnáctková číslice odpovídá přesně 4 dvojkovým číslicím, například B (hex) = 1011 (bin).
Princip je prostý: opakované dělení základem nové soustavy (tedy 16) a zapisování zbytků po dělení.
Zbytky čteme od posledního k prvnímu, tedy zdola nahoru.
| Dělení 16 | Podíl | Zbytek |
|---|---|---|
62393 : 16 | 3899 | 9 |
3899 : 16 | 243 | 11 = B |
243 : 16 | 15 | 3 |
15 : 16 | 0 | 15 = F |
6239310 = F3B916
| F | 3 | B | 9 |
|---|---|---|---|
1111 | 0011 | 1011 | 1001 |
6239310 = F3B916 = 1111 0011 1011 10012
| Převod HEX → BIN je jednoduchý: každá hexadecimální číslice přesně odpovídá jedné čtveřici bitů. |
Dělme celé dekadické číslo novým základem (:16)
Zbytek se stává nejnižším řádem nového čísla
Dělme výsledek předchozího dělení novým základem
Zbytek je následující číslicí nového čísla
Opakujme body 3. a 4., dokud neobdržíme nulový výsledek (podíl = 0)
Příklad: převod čísla F3B9(hex) do desítkové soustavy
Nejprve nahradíme hexadecimální číslice jejich číselnými hodnotami:
F3B9(hex) = (15, 3, 11, 9), rozložení na číslice: F → 15, 3 → 3, B → 11, 9 → 9
Pak použijeme tzv. Hornerovo schéma: (((15 * 16 + 3) * 16 + 11) * 16 + 9)
| Užitím Hornerova schématu vystačíme jen s násobením a sčítáním. Postupně přinásobujeme a přičítáme číslice zleva doprava. |
| Krok | Výsledek |
|---|---|
15 | 15 (→ přeneseme) |
15 * 16 + 3 | 243 (→ přeneseme) |
243 * 16 + 11 | 3899 (→ přeneseme) |
3899 * 16 + 9 | 62393 (→ výsledek) |
F3B916 = 6239310
Vynásobme číslici nejvyššího řádu starým základem.
K výsledku přičteme následující číslici.
Násobme součet starým základem.
Opakujeme body 2. a 3.
Převod je ukončen, jakmile podle bodu 2. přičteme číslici, která je nejnižším řádem.
Celá kladná čísla, nejedná-li se o BCD kód, jsou uložena přímo ve dvojkové soustavě v jednotlivých bitech.
Celá záporná čísla jsou ukládána podle toho, co podporuje daná procesorová architektura.
Obvykle nejvyšší bit čísla interpretujeme jako znaménko čísla:
0 → kladné,
1 → záporné,
přičemž v drtivé většině případů dnes se používá dvojkový doplňkový kód.
Dvojkový doplněk získáme inverzí všech bitů a přičtením 1.
původní číslo: 1100 1000 = -56
bitová inverze: 0011 0111
+1: 0000 0001
---------
0011 1000 = +56| Výhodou je, že sečtením čísla a opačného čísla bez dalších úprav získáme 0. |
V některých aplikacích se doposud užívá prostého nastavení nejvyššího bitu u záporných čísel: přímý kód, kde opačné číslo získáme prostou inverzí nejvyššího bitu.
původní číslo: 0011 1000 = +56
přímý kód: 1011 1000 = -56Dříve se objevoval inverzní kód, kde opačné číslo získáme inverzí všech bitů.
původní číslo: 0011 1000 = +56
přímý kód: 1100 0111 = -56| U přímého i inverzního kódu poznáme z nejvyššího bitu znaménko celého čísla. |
v pevné řádové (desetinné) čárce
v pohyblivé řádové (desetinné) čárce
přímý kód
doplňkový kód
inverzní kód
Přímý kód používá nejvyšší bit pro znaménko:
0 pro kladné číslo,
1 pro záporné číslo.
Zbývající bity vyjadřují absolutní hodnotu čísla.
+7/32 = 0,00111
-7/32 = 1,00111(x) doplňkový kód = x pro x >= 0
(x) doplňkový kód = 2 + x pro x < 0
+0,7510 = 0,1102
-0,7510 = 1,0102
10,000 =(2)
-0,110 =(+0,75) v doplňkovém
------
= 01,010 =(-0,75) v doplňkovém(x) inverzní kód = x pro x >= 0
(x) inverzní kód = 2 + x - 2-n pro x < 0
n je počet bitů za řádovou čárkou.
Záporné číslo lze získat také prostou inverzí všech bitů kladného čísla.
+0,812510 = 0,11012
-0,812510 = 1,00102
Získáme z výše uvedených (doplňkového nebo inverzního) tak, že
zdvojíme znaménkový bit.
Zdvojení znaménkového bitu umožňuje snadnou detekci přetečení:
00 — kladné číslo,
11 — záporné číslo,
01 nebo 10 — přetečení.
Modifikovaný kód používá dva znaménkové bity.
(x) modifikovaný doplňkový kód = x pro x >= 0
(x) modifikovaný doplňkový kód = 4 + x pro x < 0
+11/1610 = 00,10112
-11/1610 = 11,01012
100,0000
-00,1011
---------
= 011,0101Modifikovaný kód používá dva znaménkové bity.
(x) modifikovaný inverzní kód = x pro x >= 0
(x) modifikovaný inverzní kód = 4 + x - 2-n pro x < 0
n je počet bitů za řádovou čárkou.
Záporné číslo opět získáme inverzí všech bitů:
+11/16 = 00,1011
|| ||||
vv vvvv
-11/16 = 11,0100Význam číslic: bit přenosu z přechozího C(n), bit X, bit Y = výsledný bit Z (a přenos C(n+1))
Cn X Y Z (přenos Cn+1)
0 + 0 + 0 = 0 (přenos 0)
0 + 1 + 0 = 1 (přenos 0)
1 + 0 + 0 = 1 (přenos 0)
1 + 1 + 0 = 0 (přenos 1)
0 + 0 + 1 = 1 (přenos 0)
0 + 1 + 1 = 0 (přenos 1)
1 + 0 + 1 = 0 (přenos 1)
1 + 1 + 1 = 1 (přenos 1)Odečítáme-li číslo, provedeme to jako přičtení doplňku odečítaného čísla
Při doplňkovém sčítání, dojde-li k přenosu do vyššího řádu, je výsledek v normální formě.
Pokud nedojde k přenosu do vyššího řádu, je doplněk v doplňkové formě. Aby byl výsledek v normálním tvaru, musí počítač udělat 2 kroky:
vytvořit doplněk k výsledku v doplňkové formě
změnit znaménko výsledku
Stejně jako v desítkové soustavě můžeme násobit čísla pod sebou.
V binární soustavě je násobení jednotlivých číslic obzvlášť jednoduché:
násobíme pouze 0 nebo 1.
Příklad: 10112 × 11012
1011
× 1101
------
1011 ← 1011 × 1
0000 ← 1011 × 0, posun o 1
1011 ← 1011 × 1, posun o 2
1011 ← 1011 × 1, posun o 3
--------
1000111110112 = 11
11012 = 13
11 * 13 = 143 = 100011112
Každý další částečný součin je posunut o jeden bit doleva. Násobení čísla dvěma tedy v binární soustavě odpovídá posunu o jeden bit doleva. |
A / B = Q + Z / B
A = Q * B + Z
A - Q * B = Z
Z < B| A | dělenec |
| B | dělitel |
| Z | zbytek |
| Q | podíl |
Dělení bez návratu ke kladnému zbytku
Dělení s návratem ke kladnému zbytku
číslo = (mantisa) * 2^(exponent)
Slovo má 1+32 bitů.
Zobrazte reálné číslo: –145,625 v přímém kódu:
znaménko čísla ve znaménkovém bitu
mantisa v horních 24 bitech
exponent v nejnižších 8 bitech, nejvyšší z nich obsahuje znaménko exponentu
převedeme do dvojkové soustavy 145,625(dec) = 10010001,101(bin)
posuneme řádovou čárku před nejvyšší bit a vynásobíme příslušnou mocninou základu 2: x = 0,10010001101 * 28
připojíme znaménko -145,625(dec) = 1,10010001101000000000000000001000(bin)
Odečtení exponentů
Posuv mantisy čísla s menším exponentem doprava o počet bitů, který je roven rozdílu exponentů
Sečtení mantis obou čísel
Určení počtu nul mezi řádovou čárkou a první platnou číslicí součtu mantis
Posunutí součtu doleva o tolik míst, kolik nul bylo nalezeno za řádovou čárkou
Zmenšení původního exponentu o počet nalezených nul
Mívají jeden až dva parametry: co se posouvá a o kolik pozic (bitů)
Instrukce sama označuje směr posunu:
| doprava | k nižším pozicím (od MSB k LSB) |
| doleva | k vyšším pozicím (od LSB k MSB) |
| před | 0110 1110 |
| po | 1101 1100
|
Bitový obsah posouvané hodnoty (obvykle umístěné v registru různé délky 8, 16, 32, 64 bitů) se posune o daný počet pozic vlevo nebo vpravo:
v případě rotace se vysunuté bity nasouvají na uvolněné pozice zpět do zdrojového registru (x64: instrukce ROL, ROR);
v případě rotace přes CF se efektivně rotuje nejen rotovaná hodnota, ale i příznak přenosu (Carry Flag, CF) (x64: instrukce RCL, RCR);
v případě posunu vysunuté bity mizí a na uvolněné pozice se přisouvají nuly.
v případě aritmetického posunu doprava (arithmetic shift right) se zleva nepřisouvá nula, nýbrž v MSB (=znaménku) hodnota znaménka zduplikuje, zůstává.
Zajímavý dnes spíš historicky; Binary Coded Decimal (BCD) je kód, který umožňuje reprezentovat desítková čísla ve dvojkové soustavě tak, že každá desítková cifra je na pevných 4 bitech,
např. číslo 23 (desítkově) se zapíše jako 0010 0011 (BCD),
ale i číslo 12 (desítkově) je v BCD reprezentováno jako dvě čtveřice bitů 0001 0010 (BCD) nikoli na jedné čtveřici 1100 (klasicky binárně).
| Desítkově | BCD | Desítkově | BCD |
|---|---|---|---|
0 | 0000 | 10 | 0001 0000 |
1 | 0001 | 11 | 0001 0001 |
2 | 0010 | 12 | 0001 0010 |
3 | 0011 | 13 | 0001 0011 |
4 | 0100 | 14 | 0001 0100 |
5 | 0101 | 15 | 0001 0101 |
6 | 0110 | 16 | 0001 0110 |
7 | 0111 | 17 | 0001 0111 |
8 | 1000 | 18 | 0001 1000 |
9 | 1001 | 19 | 0001 1001 |
79523(dec) = 0111 1001 0101 0010 0011 (BCD)
2421Aikenův kód je alternativní způsob kódování desítkových číslic:
podobně jako BCD 8421 kóduje každou desítkovou číslici pomocí 4 bitů,
používá však váhy 2-4-2-1 místo 8-4-2-1,
je samodoplňkový: inverzí všech bitů získáme devítkový doplněk číslice,
např. 3 = 0011 → inverze → 1100 = 6,
důvod: součet vah je 2 + 4 + 2 + 1 = 9, proto inverze
převádí číslici d na 9 - d.
Pro získání desítkového doplňku je třeba k devítkovému doplňku ještě přičíst 1. Kód 2421 má dnes především historický a didaktický význam. |
| Desítkově | 8421 (BCD) | 2421 (Aiken) | (8421)+3 (Excess-3) | 5421 | 3n+2 | 5043210 (biquinární) |
|---|---|---|---|---|---|---|
0 | 0000 | 0000 | 0011 | 0000 | 00010 | 0100001 |
1 | 0001 | 0001 | 0100 | 0001 | 00101 | 0100010 |
2 | 0010 | 0010 | 0101 | 0010 | 01000 | 0100100 |
3 | 0011 | 0011 | 0110 | 0011 | 01011 | 0101000 |
4 | 0100 | 0100 | 0111 | 0100 | 01110 | 0110000 |
5 | 0101 | 1011 | 1000 | 1000 | 10001 | 1000001 |
6 | 0110 | 1100 | 1001 | 1001 | 10100 | 1000010 |
7 | 0111 | 1101 | 1010 | 1010 | 10111 | 1000100 |
8 | 1000 | 1110 | 1011 | 1011 | 11010 | 1001000 |
9 | 1001 | 1111 | 1100 | 1100 | 11101 | 1010000 |
8421 (BCD) – váhy 8-4-2-1, základní přímý BCD kód,
2421 (Aikenův) – váhy 2-4-2-1, samodoplňkový (inverzí bitů vznikne doplněk do 9),
(8421)+3 (Excess-3) – kód s přebytkem 3, hodnota = BCD + 3, samodoplňkový,
5421 – váhy 5-4-2-1, samodoplňkový,
3n+2 – binární zápis čísla 3·n + 2 (n = desítková číslice), samodoplňkový, neváhový,
5043210 – biquinární kód s váhami 5-0-4-3-2-1-0 (dva bity určují pětku, pět bitů zbytek).
| Bity čísla | Sudá parita |
|---|---|
10110 | 1 |
01001 | 0 |
01111 | 0 |
01011 | 1 |
01001 | 0 |
| Sudá parita tedy "dorovnává" počet jedniček na sudý. |
V Grayově kódu se při přechodu +/- 1 mění jen jeden bit.
Změna jen jednoho bitu při +/-1 má u některých systémů příznivý dopad na spolehlivost — například je nižší rušení a nekolísá odběr proudu.
Počítače dávno nepočítají jen s čísly.
Častěji s textem, který je třeba nějak kódovat.
Obvykle tak, že co znak z nějaké sady (character set), to jeho číslo (codepoint).
Historicky byla zásadním milníkem sada ASCII (1963)
Nicméně znakových sad vzniklo enormní množství,
téměř pro každou národní abecedu.
American Standard Code for Information Interchange (1963)
7bitové kódování znaků
128 znaků (kódy 0-127)
Zahrnuje písmena anglické abecedy (velká, malá), číslice, interpunkci a řídicí znaky.
Na spoustu účelů jako programování, popisovače, konfigurační soubory… funguje a stačí.
Na znaky většiny světových abeced už nestačí.
| Dec | Hex | Symbol | Dec | Hex | Symbol |
|---|---|---|---|---|---|
0 | 00 | NUL (null) | 32 | 20 | (space) |
1 | 01 | SOH (start of heading) | 33 | 21 | ! |
2 | 02 | STX (start of text) | 34 | 22 | " |
3 | 03 | ETX (end of text) | 35 | 23 | # |
4 | 04 | EOT (end of transmission) | 36 | 24 | $ |
5 | 05 | ENQ (enquiry) | 37 | 25 | % |
6 | 06 | ACK (acknowledge) | 38 | 26 | & |
7 | 07 | BEL (bell) | 39 | 27 | ' |
8 | 08 | BS (backspace) | 40 | 28 | ( |
9 | 09 | HT (horizontal tab) | 41 | 29 | ) |
10 | 0A | LF (line feed) | 42 | 2A | * |
11 | 0B | VT (vertical tab) | 43 | 2B | + |
12 | 0C | FF (form feed) | 44 | 2C | , |
13 | 0D | CR (carriage return) | 45 | 2D | - |
14 | 0E | SO (shift out) | 46 | 2E | . |
15 | 0F | SI (shift in) | 47 | 2F | / |
16 | 10 | DLE (data link escape) | 48 | 30 | 0 |
17 | 11 | DC1 (device control 1) | 49 | 31 | 1 |
18 | 12 | DC2 (device control 2) | 50 | 32 | 2 |
19 | 13 | DC3 (device control 3) | 51 | 33 | 3 |
20 | 14 | DC4 (device control 4) | 52 | 34 | 4 |
21 | 15 | NAK (negative ack.) | 53 | 35 | 5 |
22 | 16 | SYN (synchronous idle) | 54 | 36 | 6 |
23 | 17 | ETB (end of block) | 55 | 37 | 7 |
24 | 18 | CAN (cancel) | 56 | 38 | 8 |
25 | 19 | EM (end of medium) | 57 | 39 | 9 |
26 | 1A | SUB (substitute) | 58 | 3A | : |
27 | 1B | ESC (escape) | 59 | 3B | ; |
28 | 1C | FS (file separator) | 60 | 3C | < |
29 | 1D | GS (group separator) | 61 | 3D | = |
30 | 1E | RS (record separator) | 62 | 3E | > |
31 | 1F | US (unit separator) | 63 | 3F | ? |
| Dec | Hex | Symbol | Dec | Hex | Symbol |
|---|---|---|---|---|---|
64 | 40 | @ | 96 | 60 | ` |
65 | 41 | A | 97 | 61 | a |
66 | 42 | B | 98 | 62 | b |
67 | 43 | C | 99 | 63 | c |
68 | 44 | D | 100 | 64 | d |
69 | 45 | E | 101 | 65 | e |
70 | 46 | F | 102 | 66 | f |
71 | 47 | G | 103 | 67 | g |
72 | 48 | H | 104 | 68 | h |
73 | 49 | I | 105 | 69 | i |
74 | 4A | J | 106 | 6A | j |
75 | 4B | K | 107 | 6B | k |
76 | 4C | L | 108 | 6C | l |
77 | 4D | M | 109 | 6D | m |
78 | 4E | N | 110 | 6E | n |
79 | 4F | O | 111 | 6F | o |
80 | 50 | P | 112 | 70 | p |
81 | 51 | Q | 113 | 71 | q |
82 | 52 | R | 114 | 72 | r |
83 | 53 | S | 115 | 73 | s |
84 | 54 | T | 116 | 74 | t |
85 | 55 | U | 117 | 75 | u |
86 | 56 | V | 118 | 76 | v |
87 | 57 | W | 119 | 77 | w |
88 | 58 | X | 120 | 78 | x |
89 | 59 | Y | 121 | 79 | y |
90 | 5A | Z | 122 | 7A | z |
91 | 5B | [ | 123 | 7B | { |
92 | 5C | \ | 124 | 7C | | |
93 | 5D | ] | 125 | 7D | } |
94 | 5E | ^ | 126 | 7E | ~ |
95 | 5F | _ | 127 | 7F | DEL |
Řídicí znaky ASCII jsou určeny pro ovládání zařízení, jako jsou tiskárny nebo terminály:
NUL | (null) znamená žádný znak (kód 0) |
CR | (carriage return) vrátí kurzor na začátek řádku (kód 13) |
LF | (line feed) posune kurzor na další řádek (kód 10) |
ESC | (escape) slouží k zahájení speciálních sekvencí (kód 27) |
BEL | (bell) terminál pípne (kód 7) |
HT | (horizontal tab) posune kurzor na další tabulátor (kód 9) |
V počítačových systémech se používají různé způsoby ukončování řádků:
| Unix/Linux | jen |
| Windows |
|
| Mac OS (před OS X) | jen |
ASCII dávno nestačí
Unicode: standard pro kódování znaků, který zahrnuje většinu světových písem
universal (addressing the needs of world languages) uniform (fixed-width codes for efficient access), and unique (bit sequence has only one interpretation into character codes)
Spousta znaků z různých abeced a symbolů, https://www.unicode.org/charts/
Zahrnuje i ikonky, symboly, emoji
Úsporný způsob kódování nejen znaků
Namísto bitmapy obrázku stačí kód emoji
Unicode zahrnuje t.č. více než 1,1 miliónu kódových pozic.
Unicode podporuje různé jazyky a písma, včetně latinky, azbuky, čínských znaků, arabštiny a dalších.
Unicode umožňuje reprezentovat znaky z různých jazyků a kultur v jednom standardu,
tedy v jednom textu může být současně libovolný počet libovolných různých znaků libovolných abeced světa.
Unicode zahrnuje i historické znaky, matematické symboly, hudební notace a další
Pozoruhodné je, že některé znaky mohou být zapsány různými způsoby:
é může být zapsáno jako jeden znak (U+00E9) nebo jako dva znaky (U+0065 + U+0301)
Některé znaky (třeba písmeno Z má v Unicode několik codepointů podle účelu toho písmena):
| U+2124 |
|
| U+2128 |
|
Každý znak má přiřazen(o):
| číslo (kód, codepoint) |
|
| název znaku |
|
| obvyklé zobrazení znaku |
|
Každý znak má unikátní kódovou pozici (codepoint, ordinální číslo), například:
A | je U+0041 (= 0x41, 65 v desítkové soustavě) |
a | je U+0061 |
č | je U+010D |
😊 | je U+1F60A (emoji) |
| Codepoint se zapisuje U + 00ED (tj. U+hexa číslice). |
například převod malá písmena na velká
pravidla řazení znaků
například zobrazení znaků v různých písmech
knihovny (International Components for Unicode, ICU)
vzorová zobrazení znaků a jejich vlastností
Unicode definuje více způsobů kódování znaků, nejběžnější jsou:
| UTF-8 | variabilní délka, zpětně kompatibilní s ASCII |
| UTF-16 | většinou 2 bajty na znak, ale některé znaky mohou zabrat 4 bajty |
| UTF-32 | pevná délka, každý znak zabírá 4 bajty |
proměnný počet bajtů na znak
menší zábor paměti
složitejší zpracování: n-tý znak není na pozici 4n ani 2n …
| Rozsah Unicode | Hex rozsah | Binární UTF-8 vzor | Délka (B) | Poznámka |
|---|---|---|---|---|
U+0000 – U+007F | 0x00 – 0x7F |
| 1 | ASCII kompatibilní, čistá angličtina, čísla,… |
U+0080 – U+07FF | 0x80 – 0x7FF |
| 2 | Evropské znaky, latinka s diakritikou |
U+0800 – U+FFFF | 0x800 – 0xFFFF |
| 3 | Základní multijazyčné znaky, např. řečtina, hebrejština |
U+10000 – U+10FFFF | 0x10000 – 0x10FFFF |
| 4 | Emojis, historická písma, zřídka používané znaky |
|
žlutý (5 znaků) → C5 BE 6C 75 74 C3 BD (7 bajtů = 2+1+1+1+2)
| Znak | Unicode kód (U+xxxx) | UTF-8 bajty (hex) | Poznámka |
|---|---|---|---|
ž | U+017E | C5 BE | Dvoubytový znak (písmeno s háčkem) |
l | U+006C | 6C | ASCII (jednobytový) |
u | U+0075 | 75 | ASCII (jednobytový) |
t | U+0074 | 74 | ASCII (jednobytový) |
ý | U+00FD | C3 BD | Dvoubytový znak (písmeno s čárkou) |
| UCS-2 | 2 bajty na znak, používané v Javě a C# - prvních |
| UCS-4 | 4 bajty na znak |
| UCS-2 bylo omezeno na 2^16 = 65536 znaků, což nestačilo pro všechny znaky Unicode a musely se používat (třeba v Javě) surrogate páry pro znaky mimo tento rozsah. |
Endianita (Little- a Big-) znamená způsob, jak ukládat vícebajtová slova do posloupnosti bajtů — třeba do paměti nebo do (běžného sekvenčního) souboru
| Little-Endian | nižší bajty na nižších pozicích |
| Big-Endian | vyšší bajty na nižších pozicích |
Endianita je podstatná u:
ukládání vícebajtových instrukcí do paměti; třeba 64bitové na ARM: big-endian a Intel/AMD: little-endian
textových souborů v kódováních Unicode: UTF-16, UTF-32, UCS-2, UCS-4
Některé systémy používají na začátku souboru tzv. Byte-Order Mark (BOM):
| Kódování | BOM (hex) | Význam |
|---|---|---|
UTF-8 | EF BB BF | Označuje soubor jako UTF-8 (není povinné) |
UTF-16 BE | FE FF | UTF-16 big endian (nejvýznamnější bajt první) |
UTF-16 LE | FF FE | UTF-16 little endian (nejméně významný bajt první) |
UTF-32 BE | 00 00 FE FF | UTF-32 big endian |
UTF-32 LE | FF FE 00 00 | UTF-32 little endian |
V elektronické poště, HTTP a dalších protokolech:
pomocí charset v MIME type (Multipurpose Internet Mail Extensions), RFC 2045 a následujících.
Content-Type: text/plain; charset=us-ascii
Content-Type: text/plain; charset=iso-8859-2
Content-Type: text/plain; charset=windows-1250
Content-Type: text/plain; charset=UTF-8Dříve, než si v dalším výkladu každou zdánlivou samozřejmost rozebereme pořádně a do detailu, projdeme tu na jednom místě jen zběžně základní rozdělení počítače — paměť, procesor a V/V zařízení --, abychom od začátku měli představu, za co která část zodpovídá a jak spolu souvisejí.
paměť
procesor
V/V zařízení
Operační paměť (RAM) je rychlý, ale ztrátový pracovní prostor, v němž procesor drží instrukce a data, s nimiž právě pracuje, a právě proto — na rozdíl od trvalých, ale výrazně pomalejších pamětí (SSD, HDD, páska) — přímo podmíňuje, jak svižně počítač běží; bez ní by nebyl schopen provádět žádné výpočty.
Každá adresovatelná buňka obsahuje jednu slabiku = byte (bajt)
Při získání údaje čtením se obsah neporuší
Lze do ní zapsat novou informaci, čímž se zruší existující informace
Má jednoznačně přidělenou adresu
| Úroveň | Paměť | Přístupová doba | Typ / určení |
|---|---|---|---|
1 | reg. CPU | ~0,2–0,5 ns | v aritmeticko-logické jednotce, jen stovky bytů |
2 | cache L1 | ~0,5–1 ns | na čipu CPU, desítky KiB |
3 | cache L2 | ~2–5 ns | na čipu CPU, stovky KiB až jednotky MiB |
4 | cache L3 | ~10–15 ns | sdílená napříč jádry, jednotky až desítky MiB |
5 | operační paměť (RAM) | ~50–100 ns | DRAM, ztrátová paměť, jednotky až stovky GiB |
6 | SSD (SATA/NVMe) | ~20–100 µs | trvalá paměť (flash), stovky GiB až desítky TiB |
7 | HDD | ~5–10 ms | trvalá magnetická paměť, mechanické rameno |
8 | magnetická páska | sekundy až desítky sekund | nejlevnější na bajt, jen pro zálohy |
Procesor (CPU) je řídicí a výpočetní jádro počítače: čte z operační paměti instrukce, dekóduje je a provádí, počítá v aritmeticko-logické jednotce a řídí činnost všech ostatních částí počítače. Od paměti se liší tím, že informace nejen uchovává, ale aktivně zpracovává, a od V/V zařízení tím, že data nepředává ven do okolního světa, ale je jejich vnitřním "šéfem".
aritmeticko-logická jednotka
registry
řadič
| Sečítání | v přímém kódu |
| Odčítání | v doplňkovém nebo inverzním kódu |
| Násobení | postupným sečítáním |
| Dělení | postupným odčítáním |
| Složitější operace | metodami numerické matematiky |
počáteční nastavení čítače instrukcí
načtení instrukce do RI
ČI → adresa RAP
Načtení instrukce do RDP
RDP → RI
registr instrukce
registr adresy paměti
registr dat paměti
čítač instrukcí (program counter, PC nebo instruction pointer, IP)
dekódování operačního kódu (OK) instrukce
provedeni operace
ČI + 1 → ČI nebo adresa z instrukce → ČI
opakování od kroku 2
mov eax, [0x12345678] načte do eax hodnotu z paměťové buňky s adresou 0x12345678
mov eax, 0x12345678 načte do eax přímo hodnotu 0x12345678
mov eax, [ebx] načte do eax hodnotu z paměťové buňky, jejíž adresa je v registru ebx
push eax uloží obsah eax na vrchol zásobníku, jehož adresa je implicitně, bez přímého uvedení,dána v registru esp
| Uvedené módy jsou ukázány na příkladu AMD64 (Intel x64) architektury. |
inc eax zvýší obsah registru eax o 1, tj. operand 1 je implicitně určen operačním kódem
mov eax, [ebx+4] adresa paměťové buňky je dána součtem obsahu registru ebx a konstanty 4
jmp short +0x1E skok na adresu, která je o 0x1E vyšší než adresa následující instrukce
používá se v pamětech typu CAM (Content Addressable Memory), kdy se vyhledává podle obsahu, nikoli podle adresy. Instrukce na to v AMD64 nejsou, vyhledává se přímo hardwarem.
Nepřímé adresování
Přímé adresování
Práce s operandy, které jsou vždy na stejném místě — např. přesun mezi registry
Implicitní operand, kdy operand je určen operačním kódem — např. násobení konstantou 2, zaokrouhlování …
Ukládání a výběr informace na základě obsahu
Označuje se jako paralelní vyhledávání, tj. porovnání všech paměťových míst
Komunikace V/V zařízení
Způsoby komunikace procesoru s okolím
Programovou smyčkou
Přerušením
DMA
Podmíněný přenos dat
Přenos dat systémem přerušení
Pro kopírování bloků dat mezi pamětí a I/O zařízením.
Je třeba je naprogramovat zápisem do hardwarových registrů.
Jsou řízeny posloupností vlastních instrukcí (tzv. kanálovým programem).
obsluhuje 1 rychlé zařízení (mg. pásky)
mohou obsluhovat několik pomalých zařízení (tiskárny, někt. terminály, děr. pásky)
Direct Memory Access
Vývojový diagram DMA
oddělená paměť pro program a pro data (některé jednočipové mikropočítače)
počítače s několika CPU. Dělí se podle toho, zda mají sdílenou paměť:
multiprocessors (multiprocesory) mají sdílenou paměť
multicomputers (multipočítače) nemají sdílenou paměť, procesory komunikují například pomocí mechanismu zasílání zpráv
Rozdělení počítačů podle počtu instrukčních a datových proudů:
| SISD | (single instruction, single data) - běžné jednoprocesorové počítače |
| SIMD | (single instruction, multiple data) jedna instrukce se provádí na větší množství dat (například sčítání dvou vektorů) - tzv. vektorové počítače, některé superpočítače jsou SIMD |
| MSIMD | (Multiple Single Instruction stream, Multiple Data stream) – několik nezávislých podsystémů, každý provádí jiný program (řízení analogické MIMD) |
| SPMD | Same Program, Multiple Data stream — všechny procesory provádějí stejný program, ale nezávisle na sobě — bez synchronizace (proto každý procesor má svůj řadič) |
| MISD | (multiple instruction, single data) — nerealizovatelné |
| MIMD | (multiple instruction, multiple data) — víceprocesorové systémy; podle toho zda mají nebo nemají sdílenou paměť se rozdělují na multiprocesory (se sdílenou pamětí) a multipočítače (multicomputers - spolupracující počítače propojené sítí) |
Procesor se single instruction, single data (SISD)
Procesor s multiple instruction, single data (MISD)
Paralelní a distribuované systémy
Distribuovaný systém klient-server
Není součástí zkoušky, ale asi patří k dobrému tónu to znát…
v zásadě šířka (počet bitů) datové sběrnice
kolik bitů lze najednou přenášet z/do procesoru
obvykle i základní bitová velikost zpracovávaných čísel
většina soudobých počítačů je již 64bitová
instrukční sady ARM64 (Apple Silicon), AMD64 a.k.a. x64 nebo také x86_64 (Intel a AMD)
základní bitová velikost zpracovávaných čísel je 64 bitů
operace čtení a zápisu mezi procesorem a pamětí jsou fyzicky alespoň 64bitové
bitová šířka datové sběrnice je aspoň 64 bitů
z hlediska rychlosti je tedy lhostejné, zda sčítáme 8bitová nebo 64bitová čísla
vestavěná zařízení ("chytré krabičky")
Např. méně výkonná Raspberry Pi Pico 2 a Pico 2 W (2024)
Mikrokontrolér: RP2350
CPU: Dvoujádrový 32bitový Arm Cortex-M33 nebo RISC-V
výkonnější Raspberry Pi jsou už 64bitové
32 bitů je minimum pro Javu a většinu dnešních operačních systémů
Dnes: Arduino Uno, Nano s 8bitovými procesory ATmega328P
Stále používané 8bitové CPU jako Zilog Z80, MOS 6502 a kompatibilní
Stály na nich extrémně populární domácí počítače ZX Spectrum, Sharp MZ-800, Commodore C64 a Atari 800 XL
"Legacy" průmyslové řídicí systémy
herní retro konzole
jako samostatné "komoditní" komponenty je moc nemá smysl vyrábět:
vnější obvodové řešení by bylo příliš složité
uvažme jen nutný počet datových pinů takového čipu
uvnitř čipů Apple Silicon jsou šířky sběrnic mezi CPU a GPU či pamětí i větší: 256 u variant M2 Pro
větší šířka datového toku stejně má smysl u typově jiných zařízení, než univerzálních CPU: třeba u GPU
osmibitové procesory uměly pohánět jednoduché počítače na hry, hudbu, psaní textů…
8 bitů je už jeden znak
čtyřbitové tak maximálně ovládat kávovar, nejvýš kalkulačku
4 bity je jen jedina cifra (0-9)
HTML · Slides · PDF | Přehled předmětu