Jazyk symbolických adres
Jazyk symbolických adres (zkratka JSA, anglicky assembly language), jazyk symbolických instrukcí nebo slangově assembler 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 pro určitý procesor. Jazyk zpravidla vytváří výrobce pro konkrétní typ procesoru a jeho soubor instrukcí. Nejedná se tedy o jeden konkrétní jazyk, ale spíše o druh jazyka.
Paradigma | imperativní |
---|---|
Vznik | 1949 |
Jazyk je založen na náhradě kódů instrukcí mnemotechnickými zkratkami anglických slov, které vyjadřují, co daná strojová instrukce dělá. Dále jazyk umožňuje místo konkrétní číselné paměťové adresy používat symbolické adresy v podobě návěstí. Pro převod programu v JSA do strojového kódu se používá překladač, který se nazývá assembler. Tento název se v češtině přeneseně používá i pro samotný jazyk.
JSA umožňuje psát extrémně rychlé a paměťově úsporné programy. Jeho nevýhody jsou především závislost na konkrétním procesoru, tedy neumožňuje snadnou přenositelnost na jinou platformu, jeho kód je dlouhý a obtížně se hledají chyby. Proto se používá jen pro určité úlohy a ostatní části softwaru se vytvářejí ve vyšších programovacích jazycích.
Historie
editovatJSA 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
editovatAnglické 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
editovatJSA 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
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…
Příklad instrukce
editovatPříkladem jednoho řádku – jedné instrukce jazyka symbolických adres procesoru x86/i386 (např. Intel 80386), s komentářem:
; Do akumulátoru (l=low: dolní část) načti hodnotu 61 v hexadecimální soustavě
mov al, 61h
stejná instrukce ve strojovém kódu o délce 2 bajtů:
10110000 01100001
Instrukce říká: do registru „al“ vlož číslo 61 šestnáctkové soustavy (číslo 97 v desítkové soustavě). Za středníkem je komentář, který není součástí výsledného programu. Instrukce „mov“ (zkratka anglického move, „přesun“) znamená přiřazení hodnoty, „al“ je označení dolního bajtu („l“=low) registru pojmenovanáho akumulátor („a“), následuje čárkou oddělený parametr – zde vkládaná hodnota.
Ve strojovém kódu je první bajt (10110000) kódem instrukce mov al, druhý bajt (01100001) je parametr – číslo 61h.
Program „Ahoj světe!“
editovatHello 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
Související články
editovatExterní odkazy
editovat- 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ů