66 lines
2.9 KiB
Markdown
66 lines
2.9 KiB
Markdown
|
# Adresní módy
|
||
|
|
||
|
- různé typy procesorů mohou mít v instrukci 1, 2 nebo více adres
|
||
|
- operandy mohou ležet v registrech nebo v paměti
|
||
|
- adresní mechanismus procesoru musí umožnit
|
||
|
- adresování instrukcí (skoky, větvení, podprogramy)
|
||
|
- adresování jednoduchých promenných různé délky a typu
|
||
|
- práci s indexovanými promennými
|
||
|
- práci se strukturami
|
||
|
- lze řesit s různým podílem HW a SW
|
||
|
- pokročilé požadavky
|
||
|
- segmentování programu
|
||
|
- stránkování
|
||
|
- ...
|
||
|
|
||
|
**Základní typy operandů**
|
||
|
- podle typu procesoru lze v instrukcích používat různé typy operandů
|
||
|
1. **implicitní operand**
|
||
|
- operand je určen přímo typem instrukce
|
||
|
- např. `RTS`
|
||
|
- naplní `PC` obsahem adresy určené `SP` (registry nejsou v instrukci uvedeny)
|
||
|
2. **registrový operand**
|
||
|
- operand je v registru (registrech), které jsou v instrukci explicitně uvedeny
|
||
|
- např. `ADD.B R0H, R0L`
|
||
|
- sečte obsah v registrech, výsledek uloží do `R0L`
|
||
|
3. **přímý operand**
|
||
|
- operand je uveden přímo v instrukci
|
||
|
- např. `MOV.B #25, R0L`
|
||
|
- uloží hodnotu 25 do `R0L`
|
||
|
4. **přímá adresa**
|
||
|
- operand je uložen v paměti, jeho adresa je uvedena v instrukci
|
||
|
- např. `MOV.B @043A, R0L`
|
||
|
- uloží do `R0L` obsah adresy `043A`
|
||
|
5. **nepřímá adresa**
|
||
|
- v instrukci uvedena adresa paměti, kde je uložena adresa operandu
|
||
|
- např. `MOV.B @@0500, R0L`
|
||
|
- uloží do `R0L` obsah adresy na adrese `0500`
|
||
|
6. **nepřímá adresa v registru**
|
||
|
- v instrukci uvedena adresa registru, kde je uložena adresa operandu
|
||
|
- např. `MOV.B @R1, R0L`
|
||
|
- uloží do `R0L` obsah adresy na adrese v registru `R1`
|
||
|
7. **indexová adresa**
|
||
|
- poloha operandu v paměti určena součtem adresy uvedené v instrukci a obsahem indexového registru
|
||
|
- počáteční adresa je **v instrukci**
|
||
|
- např. `MOV.B @(043A+ER1), R0L`
|
||
|
- uloží do `R0L` obsah adresy ze součtu `043A` + obsah registru `ER1`
|
||
|
8. **bázová adresa**
|
||
|
- poloha operandu v paměti je určena součtem obsahu registru a offsetu uvedeného v instrukci
|
||
|
- počáteční adresa je **v registru**
|
||
|
- např. `MOV.B @(4+ER1), R0L`
|
||
|
- uloží do `R0L` obsah adresy ze součtu obsahu registru `ER1` + `4`
|
||
|
9. **složená** (segmentová) **adresa**
|
||
|
- adresa operandu v paměti se vypočítá složením z několika částí, uložených v registrech nebo v operandovém poli instrukce
|
||
|
- např. `MOV.B @(S1:043A), R0L`
|
||
|
- uloží do `R0L` obsah adresy určené složením registru `S1` a hodnoty `043A` z operandového pole instrukce (H8S nepodporuje)
|
||
|
10. **relativní adresa**
|
||
|
- adresa operandu v paměti určena součtem obsahu PC a offsetu, uloženém v operandovém poli instrukce nebo v některém registru
|
||
|
- např. `BCS 0005`
|
||
|
- provede skok na adresu `PC` + `5` (je-li splněna podmínka C = 1)
|
||
|
|
||
|
**Little a Big Endian**
|
||
|
- data delší než 1 byte mohou být do paměti ukádána v pořadí
|
||
|
- LSB ... MSB (= Little Endian)
|
||
|
- MSB ... LSB (= Big Endian)
|
||
|
- Intel IA-32 je LE
|
||
|
- H8S je BE
|