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