FAV-ZCU/KIV POT/05. Assembler.md

222 lines
No EOL
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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ší