Jazyk symbolických adres

Z Wikipedie, otevřené encyklopedie
Skočit na navigaci Skočit na vyhledávání
Jazyk symbolických adres
Paradigma imperativní
Vznikl v 1949

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ů).

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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 movepř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!“[editovat | editovat zdroj]

Hello world v NASM:

[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[editovat | editovat zdroj]

Existuje velké množství překladačů JSA, pro x86 například:

pro jiné architektury:

Externí odkazy[editovat | editovat zdroj]