Obsah
Obsah Předmluva Použité konvence
13 14
K APITOLA 1
Základní číselné soustavy a pojmy 1.1 Číselné soustavy a převody 1.2 Datové typy
15 15 18
K APITOLA 2
Seznámení s mikroprocesory řady x86 2.1 Počítač obecně 2.2 Historie mikroprocesorů řady x86 2.3 Mikroprocesor obecně 2.4 Mikroprocesor 80386 2.5 Přerušení
21 21 23 24 26 28
K APITOLA 3
Anatomie instrukce 3.1 Operandy instrukcí 3.2 Adresace paměti 3.3 Instrukce jazyka symbolických adres
31 32 33 34
K APITOLA 4
Základní instrukce 4.1 Instrukce MOV 4.2 Co je malý a velký indián 4.3 Aritmetické instrukce 4.3.1 4.3.2 4.3.3 4.3.4
Instrukce ADD a SUB Instrukce INC a DEC Záporná čísla – Čísla se znaménkem Instrukce pro záporná čísla – NEG CBW CWD CDQ CWDE
4.4 Další aritmetické instrukce 4.4.1 Instrukce MUL a IMUL 4.4.2 Instrukce DIV a IDIV
4.5 Logické instrukce 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5
Instrukce AND Instrukce OR Instrukce XOR Instrukce NOT Bitové vlajky – pole (mapy)
37 37 39 40 40 43 44 46
48 48 50
51 51 52 52 52 53
7
8
Obsah
K APITOLA 5
Základní programové konstrukce 5.1 Sekvence 5.2 Konstrukce “IF THEN” – selekce 5.2.1 Instrukce CMP a TEST 5.2.2 Instrukce nepodmíněného skoku JMP 5.2.3 Instrukce podmíněných skoků Jx
5.3 Konstrukce iterace – cykly 5.3.1 Instrukce LOOP 5.3.2 Instrukce LOOPZ a LOOPNZ
5.4 Instrukce pracující se zásobníkem 5.4.1 5.4.2 5.4.3 5.4.4 5.4.5 5.4.6
Co je a jak funguje zásobník Instrukce PUSH a POP Instrukce PUSHA/POPA PUSHAD/POPAD Instrukce PUSHF/POPF a PUSHFD/POPFD Instrukce CALL a RET Instrukce INT a IRET
55 55 56 56 57 58
62 64 65
65 65 67 69 69 70 71
K APITOLA 6
Ostatní instrukce
75
6.1 Instrukce přímo měnící registr příznaků 6.1.1 Instrukce CLI a STI 6.1.2 Instrukce STD a CLD
6.2 Instrukce XCHG 6.3 Instrukce LEA 6.4 Instrukce pro práci s řetězci 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5
Instrukce Instrukce Instrukce Instrukce Instrukce
STOSx LODSx CMPSx SCASx REP a REPZ
6.5 Instrukce pro vstup a výstup (I/O) 6.5.1 Instrukce IN a OUT 6.5.2 Instrukce NOP
6.6 Instrukce posuvů a rotací 6.6.1 6.6.2 6.6.3 6.6.4
Instrukce Instrukce Instrukce Instrukce
SHR a SHL SAL a SAR RCR/RCL ROR a ROL
6.7 Pseudoinstrukce 6.7.1 6.7.2 6.7.3 6.7.4 6.7.5 6.7.6
Pseudoinstrukce Pseudoinstrukce Pseudoinstrukce Pseudoinstrukce Pseudoinstrukce Operátor SEG
75 75 76
76 76 77 77 78 78 78 78
82 82 84
84 85 86 87 87
88 DB, DW a DD RESB, RESW a RESD TIMES INCBIN EQU
6.8 Triky s instrukcemi 6.8.1 Příkaz ALIGN 6.8.2 Naplňování registrů určitými hodnotami
88 89 89 90 90 90
91 91 92
Obsah
6.8.3 Optimalizovaná aritmetika 6.8.4 Srovnáváme 6.8.5 Ostatní
92 93 93
Užitečné kousky kódu
95
K APITOLA 7
7.1 Jednoduché příklady 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.1.6
Součet dvou čísel uložených proměnných Součet čísel uložených v registrech Součet pole čísel Určení, zda číslo sudé nebo liché Obrácení pořadí bitů čísla Zjištění cifry v čísle v desítkové soustavě
7.2 Převody čísel na řetězec 7.3 Převody řetězců na čísla
95 95 96 97 98 98 99
99 104
K APITOLA 8
Operační systém 8.1 Vývoj operačních systémů 8.2 Přidělování procesoru 8.2.1 Procesy 8.2.2 Princip plánování procesů 8.2.3 Reprezentace a stavy procesu
8.3 Správa paměti 8.3.1 Jednoduché přidělování paměti 8.3.2 Swapování 8.3.3 Virtuální pamě a stránkování
8.4 Souborové systémy 8.4.1 8.4.2 8.4.3 8.4.4
Struktura souborového systému Mechanismy přístupu k souborům Fyzická struktura disku Organizace více souborových systémů na disku
8.5 Zavedení systému na PC 8.5.1 BIOS
109 109 110 110 111 111
113 113 114 114
116 117 117 118 119
119 119
K APITOLA 9
Překladač NASM
121
9.1 Programová řádka 9.2 Výrazy 9.3 Lokální návěští 9.4 Preprocesor NASM
121 122 122 123
9.4.1 9.4.2 9.4.3 9.4.4 9.4.5 9.4.6
Jednořádková makra – %define, %undef Víceřádková makra – %macro %endmacro Deklarace makra – %assign Podmíněný překlad – %if Existence makra – %ifdef, %ifndef Vlož soubor – %include
9.5 Direktivy Assembleru
123 124 124 124 125 125
126
9
10
Obsah
9.5.1 9.5.2 9.5.3 9.5.4
Direktiva Direktivy Direktivy Direktiva
BITS SECTION a SEGMENT EXTERN, GLOBAL a COMMON CPU
9.6 Výstupní formáty 9.6.1 9.6.2 9.6.3 9.6.4 9.6.5 9.6.6 9.6.7 9.6.8
Výstupní formát bin Direktiva ORG Výstupní formát obj (Microsoft OMF) Výstupní formát win32 Výstupní formát coff Výstupní formát elf Výstupní formát aout a aoutb Symbolické informace
126 127 128 128
129 129 130 130 131 131 131 132 132
K APITOLA 10
Programujeme v DOSu 10.1 Adresace paměti v reálném režimu 10.2 Jak vypadá uspořádání paměti v DOSu 10.3 Rozšíření paměti nad 1 MB 10.4 Druhy spustitelných souborů v DOSu 10.5 Základní systémová volání 10.5.1 10.5.2 10.5.3 10.5.4
Ukonči program Vypiš řetězec Hello world ! Vstup z klávesnice
10.6 Vstupně-výstupní operace se soubory (I/O) 10.6.1 10.6.2 10.6.3 10.6.4 10.6.5 10.6.6 10.6.7 10.6.8
Otevři soubor Uzavři soubor Čti ze souboru Zapiš do souboru Inteligentní otevření/vytvoření souboru Změň polohu v souboru (SEEK) Ostatní funkce pro práci se soubory Práce s dlouhými názvy souborů
10.7 Práce s adresáři 10.7.1 Vytvoř a zruš adresář (MKDIR, RMDIR) 10.7.2 Vyber aktuální adresář (CHDIR) 10.7.3 Zjisti vybraný adresář(GETCWD)
10.8 Alokujeme paměť 10.8.1 Změň velikost bloku paměti 10.8.2 Alokuj pamě 10.8.3 Uvolni pamě
10.9 Předávání příkazové řádky 10.10 Chybové kódy 10.11 Odlaďujeme 10.12 Debugger grdb.exe 10.13 Návrh a odladění programu 10.14 Rezidentní program aneb Peklo na zemi 10.15 Volně šiřitelné zdroje informací
133 134 135 136 137 139 139 140 140 141
145 145 146 147 147 149 151 152 154
154 154 155 155
156 157 157 158
158 159 159 160 163 171 175
Obsah
K APITOLA 11
Programujeme ve Windows 11.1 Úvod 11.2 Nativní aplikace pod Windows 11.2.1 Systémová volání API 11.2.2 Hello, World!
11.3 Kompatibilita programů 11.4 Spouštíme DOS 11.5 Volně šiřitelné zdroje informací
177 177 177 178 178
180 180 181
K APITOLA 12
Programujeme v Linuxu 12.1 Úvod 12.2 Jak vypadá uspořádání paměti procesu 12.3 Předávání příkazové řádky a prostředí 12.4 Volání operačního systému 12.5 Chybové kódy 12.6 Manuálové stránky 12.7 Hello world! 12.8 Asmutils aneb jak si ulehčit práci 12.9 Práce s makry Asmutils 12.10 Vstupně-výstupní operace se soubory (I/O) 12.10.1 12.10.2 12.10.3 12.10.4 12.10.5 12.10.6
Otevři soubor Uzavři soubor Čti ze souboru Zapiš do souboru Změna polohy v souboru Ostatní funkce pro práci se soubory
12.11 Práce s adresáři 12.11.1 Vytvoř a zruš adresář (MKDIR, RMDIR) 12.11.2 Vyber aktuální adresář (CHDIR) 12.11.3 Zjisti vybraný adresář(GETCWD)
12.12 Vstup z klávesnice 12.12.1 Systémové volání IOCTL
12.13 Alokace paměti 12.14 Odlaďujeme 12.15 Assembler GAS 12.16 Volně šiřitelné zdroje informací 12.17 Možnosti překladače a linkeru
183 183 184 185 185 186 186 188 189 191 191 191 193 193 193 196 197
198 199 199 199
200 200
201 202 204 205 206
K APITOLA 13
Propojujeme 13.1 Předávání proměnných 13.2 Co je stackframe?
207 207 208
11
12
Obsah
13.2.1 Stackframe v jazyce C (32bitová verze) 13.2.2 Stackframe v jazyce C (16bitová verze)
13.3 Propojujeme s jazykem C 13.4 Propojujeme s jazykem Pascal
209 212
212 215
K APITOLA 14
Slovo závěrem
219
K APITOLA 15
Nejčastěji používané instrukce Rejstřík
221 223