# Jazyk symbolických adres **Proč programovat v JSA?** - překladače vyšších jazyků nemusí umět využít speciální vlastnosti procesoru - může být nutné napsat část kódu jinak, než jej generuje překladač - možnost vytvořit optimalizovaný kód ??? + cvičné důvody - programátor se musí důkladně seznámit s daným procesorem **Program v JSA vs. strojový kód** - program v JSA - používá symbolické názvy instrukcí - používá symbolické adresy operandů - strojový kód = program přeložený do binární podoby - obsahuje binární kódy instrukcí - obsahuje absolutní adresy operandů + jediná forma programu, kterou umí procesor přímo zpracovat + velmi obtížné na úpravy a obtížně srozumitelné **Symbolická adresa** - nahrazuje ve zdrojovém kódu skutečnou (absolutní) adresu - převod provede překladač + sestavovací program - programátor nemusí znát skutečné umístění proměnné v paměti - obsahuje - **hodnotu** - adresu, kterou reprezentuje - **obsah** - obsah paměťového místa (bytu, slova, ...) na které odkazuje - použití - **návěští** - cílová adresa skoku nebo volání procedury - **proměnná** - adresa pro manipulaci s daty - může být - **absolutní** - hodnota je známá při překladu (může ji určit assembler) - **relativní** - hodnotu určí linker (sestavovací program) při sestavování **Překlad a sestavení programu** - program je sestaven z jednoho nebo více modulů - moduly se překládají samostatně - přeložené (relativní) moduly se spojí sestavovacím programem do výsledného souboru **Relativní a absolutní cesty** - v realtivních modulech adresy počítány od začátku modulu - v sestaveném programu adresy počítány od začátku paměti **Zápis programu** - program se zapisuje do 4 sloupců - některá pole je možno vynechat - každá řádka obsahuje jednu **instrukci**, **direktivu** nebo **rozvinutí makra** - sloupce - návěští - definuje symbolickou adresu - operace - symbolický název instrukce nebo direktivy - operandy - operandy instrukce nebo parametry direktivy - komentář - nepovinný, oddělen středníkem ### Instrukční soubor + instrukce dělitelné do několika skupin **Přesuny dat** - operandy typu B, W, L - B = byte (8 bitů) - W = word (16 bitů) - L = long (32 bitů) - přesuny - `paměť ↔ registr` - `registr ↔ registr` - `přímý operand → registr` - lze použít různé adresní módy - přesuny nastavují příznakové bity **Aritmetické operace** - operandy typu B, W, L. - operace - `registr * registr → registr` - `přímý operand * registr → registr` - sčítání, odčítání, inkrement, dekrement - dekadická korekce - násobení (8 × 8 → 16), (16 × 16 → 32), signed/unsigned - dělení (16 : 8 → 8 + 8), (32 : 16 → 16 + 16) **Porovnání** - operandy typu B, W, L - operace - `registr * registr` - `přímý operand * registr` - formálně provede odečtení operandů (ale neuloží výsledek) - použití obvykle s následnou instrukcí `BCC` **Logické operace** - operandy typu B, W, L. - operace - `registr * registr → registr` - `přímý operand * registr → registr` - logický součet (OR), součin (AND), nonekvivalence (XOR), negace (NOT) **Bitové operace** - nastavení, nulování, negace bitu. - operace typu - `Carry * bit → Carry` - `Carry * bit → bit` - operandy typu byte v registrech nebo v paměti - bitové operace v paměti jsou typu Read – Modify – Write **Posuvy a rotace** - operandy typu B, W, L v registrech - rotace s `Carry` nebo bez `Carry` **Skoky** (JMP, JSR) - přímá nebo nepřímá adresa **Podmíněné skoky** - relativní adresa 16 nebo 8 bitů - signed, rozsahy <`PC`-32768, `PC`+32766> resp. <`PC`-128, `PC`+126> **Řidící instrukce** - uložení registrů CCR a EXR do paměti, resp. přečtení z paměti - instrukce pro ladicí přerušení TRAPA - návrat z přerušení RTE - přechod do režimu sníženého odběru (SLEEP) ### Direktivy - povely pro překladač + definice sekcí (segmentů) + definice dat a symbolů + makra + podmíněný překlad + ... ### Modul **Struktura** - modul obsahuje jednu nebo více sekcí (segmentů) - každá sekce má nezávislé adresování od svého začátku - pořadí sekcí ve zdrojovém souboru není podstatné - upraví se při sestavení **Základní typy sekcí** - datová - obsahuje inicializovaná data programu - kódová sekce - obsahuje kód programu - další sekce - neinicializovaná data, zásobník, přerušovací vektory, ... **Definice sekce** - hlavička - standardní sekce GNU as a ld - `.data [subsekce]` - `.text [subsekce]` - libovolné další sekce - `.section jméno` **Počítadlo adres** - každá sekce má (při překladu) samostatné počítadlo adres (PLC - Programm Location Counter) - není-li určeno jinak, inicializuje se PLC na 0 na začátku sekce - možnosti nastavení PLC - `.org výraz` - nastaví PLC na hodnotu `výraz` - `.align uložení` - nastaví PLC na hodnotu `MOD(2^uložení)` - všechny adresy jsou vztaženy k začátku sekce **Sestavení sekcí a modulů** - sestavovací program spojí stejné sekce (popř. subsekce) dohromady **Definice symbolů** - definice a přiřazení hodnoty symbolu - `.equ symbol, výraz` - `symbol = výraz` - nevyhrazuje místo v paměti - platnost symbolu omezena na modul, kde je definován - hodnotu nelze měnit **Definice dat** - definice místa pro proměnnou - `[návěští] .space položky` - `návěští` - symbolická adresa - `položky` - počet položek - vyhradí v paměti místo určené délky (počtu bytů) + definice proměnné s počáteční hodnotou - `[návěští] .byte výrazy` - `[návěští] .word výrazy` - `[návěští] .long výrazy` - `[návěští] .ascii řetězec` - `[návěští] .asciz řetězec` - `návěští` - symbolická adresa - `výrazy` - obsah jednotlivých položek - vyhradí v paměti místo, jehož obsah je dán jednotlivými výrazy - je-li návěští uvedeno, odpovídá jeho hodnota adrese 1. bytu dat **Sdílení dat mezi moduly** - symboly platí pouze v modulu, kde jsou definované - rozšíření platnosti (export) - `.global symboly` - použití symbolů z jiného modulu (import) - `.extern symboly` - `symboly` - exportované symboly oddělené čárkou - lze použít pouze pro symboly definované jako návěští (ne `.equ`) ### Makra - umožňují definovat část programu, která bude použita na více místech ``` .macro jméno argumenty tělo makra, jednotlivé instrukce .endm ``` - `argumenty` - seznam symbolických argumentů, v těle se referují s `\` na začátku - rozvinutí makra vloží tělo makra do daného místa programu **Lokální symboly** - je-li v makru definován symbol, vznikají při vícenásobném rozvinutí problémy - je potřeba jej definovat jako lokální - `LOCAL symboly` (oddělené čárkou) - překladač vytvoří v každém rozvinutí unikátní jméno - před použitím `LOCAL` je potřeba použít direktivu `.altmacro` **Makra vs. procedury** - použití makra - kód makra je v paměti pro každé rozvinutí - bez dodatečného zpoždění pro `JSR`, `RTS`, přenos parametrů, ... - použití procedury - výkonná část je v paměti pouze jednou - dodatečné zpoždění pro `JSR`, `RTS`, ... (pomalejší než makro) - makro obvykle rychlejší - procedura obvykle úspornější