diff --git a/KIV POT/02. Adresní módy.md b/KIV POT/02. Adresní módy.md new file mode 100644 index 0000000..074c8b3 --- /dev/null +++ b/KIV POT/02. Adresní módy.md @@ -0,0 +1,66 @@ +# 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 \ No newline at end of file