Přidání poznámek z POT k jazyku symbolických adres
This commit is contained in:
parent
bb6bf2c06f
commit
f444126ade
1 changed files with 222 additions and 0 deletions
222
KIV POT/05. Assembler.md
Normal file
222
KIV POT/05. Assembler.md
Normal file
|
@ -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ší
|
Loading…
Reference in a new issue