Jazyk symbolických adres
Jazyk symbolických adres (zkratka JSA, anglicky assembly language, slangově assembler) nebo také jazyk symbolických instrukcí je v informatice nízkoúrovňový programovací jazyk, jehož základem jsou symbolické reprezentace jednotlivých strojových instrukcí a konstant potřebných pro vytvoření strojového kódu programu pro určitý procesor. Nejedná se tedy o jeden konkrétní jazyk, ale spíše o druh jazyka. Symbolickou reprezentaci tvoří zpravidla výrobce procesoru a je založena na mnemotechnických zkratkách, které vyjadřují, co daná strojová instrukce dělá, označují symbolicky registr, slovní zkratku podmínky a podobně. JSA je proto závislý na konkrétním procesoru a zapsaný program je obtížně přenositelný na jinou platformu (na rozdíl od vyšších programovacích jazyků).
Paradigma | imperativní |
---|---|
Vznikl v | 1949 |
Pro překlad z JSA do strojového kódu se používá program, který nazýváme assembler (překladač). V programátorském slangu se název assembler používá i pro JSA.
Historie
JSA se poprvé objevily v 50. letech 20. století, kdy byly označovány jako druhá generace programovacích jazyků. Eliminovaly většinu chyb vznikajících při programování a časovou náročnost první generace programovacích jazyků tím, že odstranily nutnost pamatovat si číselné kódy jednotlivých strojových instrukcí, nutnost vypočítávat adresy skoků a umístění dat a zjednodušením (zkrácením) zápisu programu. Ve své době byly široce využívány pro všechny typy programování. Avšak v 80. letech (u mikropočítačů v 90. letech) byly nahrazeny programovacími jazyky s vyšší úrovní abstrakce, které přinášely vyšší produktivitu programování.
V současné době jsou JSA používány zejména pro přímé ovládání hardware, přístup ke specializovaným instrukcím procesoru nebo pro kritické úseky, kde je nutný vysoký výkon. Typicky se jedná o ovladače zařízení, nízkoúrovňové embedded systémy a operační systémy.
Pokročilé překladače JSA poskytují doplňující nástroje pro správu a vývoj kódu, řízení překladu programu, a podporu ladění. Mezi hlavní prvky patří také podpora maker, pak nazýváme takový překladač makro assembler.
Terminologie
Anglické slovo assembler znamená sestavovatel a označuje pouze překladač, tj. program, který sestavuje strojový kód. Programovací jazyk zpracovávaný takovým překladačem se označuje JSA, v angličtině se jmenuje assembly language.
Exaktní česká terminologie vychází z toho, že assembler označuje pouze překladač, zatímco programovací jazyk označuje výhradně jako jazyk symbolických adres (JSA), kterýžto výraz popisuje základní nabízenou výhodu – odstranění nutnosti ručně propočítávat veškeré adresy při překladu programu.
V praxi se ovšem velmi často pro označení JSA používá termín assembler (původem z anglického jazyka).
Charakteristika
JSA je programovací jazyk nejnižší úrovně a je závislý na strojovém kódu procesoru. Každá rodina procesorů má svůj vlastní odlišný JSA, protože ve strojových instrukcích různých rodin procesorů a možnosti rozdělování a adresování paměti bývají zásadní rozdíly. Každá firma vyrábějící procesory si definuje vlastní pravidla pro JSA svých procesorů, z kterých mohou (ale také nemusejí) vycházet nezávislí autoři a firmy.
Společným rysem drtivé většiny JSA je, že kódovou jednotkou je zde jeden řádek.
Program v JSA se skládá z
- překladových direktiv
- tyto direktivy ovlivňují způsob překladu (například pro jakou verzi procesoru se překládá, zda se ignorují velká a malá písmena, zda se generuje výpis a s jakým stránkováním, atp.). Rovněž označují začátek a konec kódových sekcí.
- strojových instrukcí
- symbolicky zapsané strojové instrukce jsou při překladu nahrazeny odpovídajícím strojovým kódem
- definic obsahu paměti
- můžeme inicializovat obsah paměti, nebo vyhradit v paměti místo pro proměnné
- návěstí
- návěstí umožňují pojmenovat místa v paměti počítače. Návěstí umístěné před instrukcí se používá jako pro definici bodu v programu, na který můžeme skočit, návěstí umístěné před definicí obsahu paměti se používá při odkazování na tuto paměť
- maker
- makra slouží pro nahrazení často používaných sekvencí instrukcí, umožňují zpřehlednit a zjednodušit kód vytvořením pseudoinstrukcí a formalizací často používaných konstrukcí
- podmínkových bloků
- podmínkové bloky dovolují generovat odlišný kód v závislosti na nastavení překladových symbolů, což může být užitečné například při ladění, nebo u kódu určeného pro více platforem
- definic překladových symbolů
- překladové symboly pomáhají při vytváření dobře strukturovaného kódu programu
Příkladem jednoho řádku (tedy jednoho příkazu) v JSA může být následující zápis instrukce procesoru x86/i386 (např. Intel 80386):
; Do akumulátoru (l=low: dolní část) načti konstantu 61 v hexadecimální soustavě
mov al, 61h
která se přeloží na strojový kód (kde první část kódu je vlastní instrukce mov al a druhá část konstanta 61h):
10110000 01100001
který znamená přesun hexadecimální hodnoty 61 (97 dekadicky) do registru procesoru pojmenovaného „al“. Název instrukce „mov“ (zkratka anglického slova move – přesun) je následován seznamem parametrů. Tak vypadá typická instrukce v JSA.
Assembler zpravidla překládá zdrojový kód na několik průchodů. To je dané tím, že při prvním průchodu nejsou známé adresy a hodnoty definované za překládaným řádkem, ovšem i při dalších průchodech se mohou adresy posunout, protože délka strojové instrukce může záviset na hodnotách adres a konstant, které byly v prvním průchodu neznámé, přičemž změnou původně předpokládané délky instrukce se mohou adresy opět posunout…
Program „Ahoj světe!“
Hello world v MASM pro Windows:
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
.data
message db "Ahoj svete!",13,10
.code
main proc
invoke GetStdHandle, STD_OUTPUT_HANDLE
invoke WriteConsoleA, eax, addr message, sizeof message, 0, 0
ret
main endp
end main
Hello world v NASM pro DOS:
[org 100h]
[bits 16]
jmp START
; Nastavit pozici kurzoru
; IN: dl = x, dh = y
curto:
xor bh,bh
mov ah,2
int 10h
ret
; Napsat barevne znaky, ale neposouvat kurzor
; IN: al = char, bl = color, cx = count
putchar:
xor bh,bh
mov ah,9
int 10h
ret
; Napsat znak a posunout kurzor
; IN: al = char
wrchar:
xor bh,bh
mov ah,0Eh
int 10h
ret
; Cist klavesu s cekanim
; OUT: al = ASCII code || 0, ah = scan code
inkey:
mov ah,0
int 16h
ret
; Napsat textovy retezec ukonceny binarni nulou
; IN: ds:si -> null_terminated_string
writez:
l_writez1:
lodsb
or al,al
jz l_writez9
xor bh,bh
mov ah,0Eh
int 10h
jmp l_writez1
l_writez9:
ret
msg1: db "Ahoj svete!", 13,10, 0
START:
push cs
pop ds
mov si,msg1
call writez
END:
mov ax,4C00h
int 21h
Překladače JSA
Existuje velké množství překladačů JSA, pro x86 například:
- Flat Assembler (FASM) – open source assembler pro procesory x86, sebekompilující
- Netwide Assembler (NASM) – open source assembler pro procesory x86, sám napsaný v jazyku C
- GNU Assembler (gas) – součást projektu GNU; je multiplatformní, používá se především pro kód vložený v programech v jazyce C
- Microsoft Macro Assembler (MASM) – překladač od firmy Microsoft
- Turbo Assembler (TASM) – překladač firmy Borland
pro jiné architektury:
- AX166 – překladač firmy Amit pro procesory vycházející z 80C166
Externí odkazy
- Obrázky, zvuky či videa k tématu jazyk symbolických adres na Wikimedia Commons
- Bity do bytu - krásná učebnice assembleru procesoru Z80 od spisovatele, novináře, popularizátora počítačů Ladislava Zajíčka
- Učebnice assembleru x86 Archivováno 11. 8. 2009 na Wayback Machine
- Naučte se assembler 8080, Z80, 6502 - učebnice assembleru osmibitových procesorů