Professional Documents
Culture Documents
ISU cv01
ISU cv01
• V ISU se budeme učit psát programy přímo na úrovni jazyka symbolických adres
(nazývaného také jazyk symbolických instrukcí, nebo lidově assembler) abychom
lépe pochopili způsob práce procesoru a porozuměli jeho fyzickým omezením.
ISU-cv01 3 / 25
Průběh výuky
ISU-cv01 4 / 25
Zdroje informací
ISU-cv01 5 / 25
Koho kde najdete (pokud nás někdy pustí zpátky na fakultu)
ISU-cv01 6 / 25
Jak to dopadlo v minulém roce
ISU-cv01 7 / 25
Číselné soustavy
Číselné soustavy
Stejná čísla v
různých soustavách
Poziční číselná soustava je způsob reprezentace čísel pomocí 2 8 10 16
posloupnosti číslic:
0 0 0 0
• Základem soustavy je počet číslic které daná soustava používá. 1 1 1 1
• Normálně používáme desítkovou soustavu s číslicemi 0-9. 10 2 2 2
• Na strojové úrovni obvykle používáme soustavu dvojkovou 0-1, 11 3 3 3
šestnáctkovou 0-F, nebo výjimečně i osmičkovou 0-7. 100 4 4 4
101 5 5 5
110 6 6 6
• V matematice základ soustavy označujeme závorkami 111 7 7 7
s pravým dolním indexem: 1000 10 8 8
(1000001)2 = (101)8 = (65)10 = (41)16 1001 11 9 9
1010 12 10 A
• V programování základ soustavy označujeme předponou 1011 13 11 B
na začátku, nebo příponou na konci čísla: 1100 14 12 C
1101 15 13 D
0b1000001 = 0o101 = 65 = 0x41
1110 16 14 E
1000001b = 101o = 65 = 41h 1111 17 15 F
10000 20 16 10
ISU-cv01 9 / 25
Převod celých čísel do desítkové soustavy
Při převodu do desítkové soustavy počítáme sumu číslice krát mocnina základu:
• Jednotky mají vždy mocninu nula a mocnina číslic nalevo od nich se vždy
o jedna zvyšuje.
(1101)2 = 1 ∗ 23 + 1 ∗ 22 + 0 ∗ 21 + 1 ∗ 20 = 8 + 4 + 0 + 1 = (13)10
• Převod z osmičkové do desítkové:
ISU-cv01 10 / 25
Na procvičení
(234)16 = (...)10
(555)8 = (...)10
(1 200)16 = (...)10
ISU-cv01 11 / 25
Převod celých čísel z desítkové soustavy
ISU-cv01 12 / 25
Na procvičení
ISU-cv01 13 / 25
Přímý převod celých čísel bez desítkové soustavy
Pokud převádíme mezi dvojkovou a osmičkovou (nebo šestnáctkovou) soustavou
čísla můžeme převést i bez náročného počítání, rozdělením na N-tice:
• Jeden znak osmičkové soustavy odpovídá třem znakům dvojkové soustavy.
• Jeden znak šestnáctkové soustavy odpovídá čtyřem znakům dvojkové soustavy:
(3D0)16 = 3 D 0
0011 1101 0000 = (11 1101 0000)2
• Rozdělování vždy začínáme na pozici desetinné čárky a případná prázdná místa
doplňujeme nulami:
(1 010 101 011)2 = 001 010 101 011
1 2 5 3 = (1253)8
• Nejrychlejší způsob jak převést číslo z šestnáctkové do osmičkové soustavy
(a obráceně) je přes dvojkovou soustavu:
(7B9)16 = 7 B 9
0111 1011 1001
011 110 111 001
3 6 7 1 = (3671)8
ISU-cv01 14 / 25
Na procvičení
ISU-cv01 15 / 25
Desetinná čísla
ISU-cv01 16 / 25
Převod desetinných čísel do desítkové soustavy
Při převodu do desítkové soustavy počítáme sumu číslice krát mocnina základu:
• Jednotky mají vždy mocninu nula, mocnina číslic nalevo od nich se vždy
o jedna zvyšuje, mocnina číslic napravo od nich se vždy o jedna snižuje.
1 1
=1∗4+1∗2+1∗ +1∗ =
2 8
= 4 + 2 + 0.5 + 0.125 = (6.625)10
1 1
= 10 ∗ 16 + 11 ∗ 1 + 12 ∗ + 13 ∗ =
16 256
= 160 + 11 + 0.75 + 0.05078125 = (171.80078125)10
ISU-cv01 17 / 25
Převod desetinných čísel z desítkové soustavy
ISU-cv01 18 / 25
Přímý převod desetinných čísel bez desítkové soustavy
Pokud převádíme mezi dvojkovou a osmičkovou (nebo šestnáctkovou) soustavou
čísla můžeme převést i bez náročného počítání, rozdělením na N-tice:
• Jeden znak osmičkové soustavy odpovídá třem znakům dvojkové soustavy.
• Jeden znak šestnáctkové soustavy odpovídá čtyřem znakům dvojkové soustavy:
• Rozdělování vždy začínáme na pozici desetinné čárky a případná prázdná místa
doplňujeme nulami:
(34.56)8 = 3 4 5 6
011 100 101 110 = (11 100.101 11)2
(AB.CD)16 = A B C D
1010 1011 1100 1101 = (1010 1011.1100 1101)2
ISU-cv01 19 / 25
Kódování čísel
Kódování čísel
Na strojové úrovni se při reprezentaci čísel vždy musíme řídit hardwarovými
omezeními architektury procesoru:
• V ISU budeme pracovat pouze s architekturou x86, moderní počítače už
používají novější (a výrazně složitější) architektury jako například x86-64.
• Celá čísla se v procesoru vždy ukládají do registrů o délce 8, 16, nebo 32 bitů.
• Každý bit může obsahovat pouze hodnoty nula a jedna (dvojková soustava).
• Například, číslo 1 uložené v 8b registru AL, 16b registru AX a 32b registru EAX:
(3)10 = 0 0 0 0 0 0 1 1
invertované (3) = 1 1 1 1 1 1 0 0
1 =00000001
invertované (3) + 1 = 1 1 1 1 1 1 0 1 = (-3)10
(-3)10 = 1 1 1 1 1 1 0 1
invertované (-3) = 0 0 0 0 0 0 1 0
1 =00000001
invertované (-3) + 1 = 0 0 0 0 0 0 1 1 = (3)10
ISU-cv01 22 / 25
Aritmetika v doplňkovém kódu
Doplňkový kód nám umožňuje provádět sčítání a ostatní aritmetické operace:
• Pokud došlo k přenosu do nejvyššího bitu registru, výsledek součtu
změnil znaménko nastalo u něj přetečení (overflow).
• Pokud došlo k přenosu z nejvyššího bitu registru, výsledek součtu
se do registru nevešel a nastal u něj přenos (carry).
10 = 0 0 0 0 1 0 1 0
• Overflow NE +11 = 0 0 0 0 1 0 1 1
Carry NE 0 0 0 1 0 1 0 1 = 21 ok
100 = 0 1 1 0 0 1 0 0
• Overflow ANO
+50 = 0 0 1 1 0 0 1 0
Carry NE
1 0 0 1 0 1 1 0 = -106 chyba
• Pokud při sčítání dojde k přenosu i přetečení, obě chyby se vzájemně vyruší
a výsledkem součtu bude platné číslo:
-6 = 1 1 1 1 1 0 1 0
• Overflow ANO +9 = 0 0 0 0 1 0 0 1
Carry ANO 100000011 =3 ok
ISU-cv01 23 / 25
Přímý kód a Kód transformované nuly
Kromě doplňkového kódu existují také přímý kód a kód transformované nuly
používané pro kódování čísel s plovoucí řádovou čárkou:
• Přímý kód interpretuje první bit registru jako znaménko (0 = plus, 1 = mínus).
• Kód transformované nuly posouvá počátek osy čísel na hodnotu 100... :
ISU-cv01 24 / 25
Na procvičení
ISU-cv01 25 / 25