7.4 KiB
7.4 KiB
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 bezCarry
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
- standardní sekce GNU as a ld
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 hodnotuvýraz
.align uložení
- nastaví PLC na hodnotuMOD(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á adresapolož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á adresavý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ší