Co je Assembler
Assembly (česky též jazyk symbolických adres) je nízkoúrovňový programovací jazyk, který je prakticky přímým textovým zápisem strojových instrukcí dané architektury procesoru. Každý řádek kódu v assembly typicky odpovídá jedné instrukci, kterou procesor přímo vykoná.
Assembler je potom nástroj (překladač), který tento textový kód přeloží na skutečné strojové instrukce — tedy binární podobu, které rozumí procesor.
Proč se učit assembly?
I když dnes většinu kódu píšeme ve vyšších jazycích jako C, Rust nebo Python, znalost assembly je stále užitečná pro:
- Pochopení, jak počítač skutečně pracuje — co vlastně váš
forcyklus dělá pod pokličkou - Reverse engineering — analýzu malwaru, crackování, výzkum bezpečnosti
- Optimalizaci kritického kódu — například kryptografické knihovny, kodeky
- Psaní operačních systémů a bootloaderů — tam, kde vyšší jazyky ještě nefungují
- Embedded programování — mikrokontroléry s omezenou pamětí
Různé architektury = různé Assemblery
Tady je důležité si uvědomit jednu klíčovou věc: assembly není jeden jazyk. Každá procesorová architektura má svou vlastní instrukční sadu (ISA — Instruction Set Architecture), a tedy i svůj vlastní dialekt assembly.
Mezi nejznámější patří:
x86 / x86_64
Architektura od Intelu a AMD, kterou najdete ve většině stolních počítačů a notebooků. x86 je 32bitová verze, x86_64 (neboli amd64) je 64bitová moderní varianta. Má CISC architekturu — hodně instrukcí, některé i složité.
ARM / ARM64 (AArch64)
Dominuje v mobilních zařízeních, používá ji Apple Silicon (M1, M2, M3...), Raspberry Pi a mnoho serverů. Je to RISC architektura — méně instrukcí, ale jednodušších a rychlejších.
RISC-V
Moderní open-source architektura, která se používá ve výzkumu i rostoucím množství komerčních čipů. Také RISC.
Další
Existují i MIPS, PowerPC, SPARC, AVR (Arduino), a historicky třeba 6502 (NES, Commodore 64) nebo Z80 (ZX Spectrum).
Syntaxe: Intel vs. AT&T
I pro stejnou architekturu (například x86_64) existují dvě rozdílné syntaxe, jak instrukce zapisovat:
-
Intel syntaxe — přehlednější, běžná na Windows, používá ji assembler NASM:
mov rax, 60 -
AT&T syntaxe — výchozí na Linuxu u nástrojů jako GAS (GNU Assembler), registry s
%, operandy opačně:movq $60, %rax
V této knize budeme používat Intel syntaxi s assemblerem NASM, protože je čitelnější a na Linuxu snadno dostupná.
V další kapitole se podíváme na základy x86_64 — registry, instrukce a syscally.