From f444126ade7cd51faa1e1567611b0d92f616193a Mon Sep 17 00:00:00 2001 From: Filip Znachor Date: Fri, 9 Jun 2023 19:06:23 +0200 Subject: [PATCH] =?UTF-8?q?P=C5=99id=C3=A1n=C3=AD=20pozn=C3=A1mek=20z=20PO?= =?UTF-8?q?T=20k=20jazyku=20symbolick=C3=BDch=20adres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KIV POT/05. Assembler.md | 222 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 KIV POT/05. Assembler.md diff --git a/KIV POT/05. Assembler.md b/KIV POT/05. Assembler.md new file mode 100644 index 0000000..44e1e98 --- /dev/null +++ b/KIV POT/05. Assembler.md @@ -0,0 +1,222 @@ +# 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ší \ No newline at end of file