# 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