OBSAH WEBU
ČTĚTE!
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
temata:37-prog_jsi:main [2011/03/18 15:59] sgs |
temata:37-prog_jsi:main [2012/04/11 13:26] (aktuální) conyx [Programování v jazyku symbolických instrukcí] |
||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
+ | ~~ODT~~ | ||
+ | |||
=====Programování v jazyku symbolických instrukcí===== | =====Programování v jazyku symbolických instrukcí===== | ||
Řádek 10: | Řádek 12: | ||
*adresova, datova a kontrolni sbernice | *adresova, datova a kontrolni sbernice | ||
- | K významným registrům CPU patří střádač (Accumulator, A), registr ukazatele instrukcí (Instruction pointer register, IPR) a instrukční registr (Instruction register, IR). | + | K významným registrům CPU patří střádač (Accumulator, A), registr ukazatele instrukcí (Instruction pointer register, IP) a instrukční registr (Instruction register, IR). |
**Další registry procesorů pentium** | **Další registry procesorů pentium** | ||
Řádek 105: | Řádek 107: | ||
[[https://www.fit.vutbr.cz/study/courses/IAS/private/09ias_12.pdf|Link na slidy s instrukcemi]] | [[https://www.fit.vutbr.cz/study/courses/IAS/private/09ias_12.pdf|Link na slidy s instrukcemi]] | ||
- | Preruseni, | + | ====Přerušení==== |
- | odkaz na zakladni instruce | + | Procesory Pentium umožňují přerušit vykonávání programu v reakci na některou předem specifikovanou událost, vykonat tzv. obslužný program této události, a pak opět vrátit řízení přerušenému programu a pokračovat v jeho vykonávání. Události, které mohou přerušit vykonávání programu se dělí na |
- | fyzicka a efektivni adresa | + | *Výjimky (Exceptions) - výjimkami jsou synchronní události generované procesorem při detekci jistých podmínek během zpracovávání instrukce (například pokus o dělení nulou). |
- | fpu | + | *Přerušení (Interrupts) - přerušeními jsou asynchronní události generované obvykle vstupními a výstupními zařízeními (žádosti o obsluhu). |
+ | |||
+ | **Průběh** | ||
+ | *0. Vykonává se program. | ||
+ | *1. Je generována výjimka číslo i, nebo vnější zařízení požaduje přerušení číslo i. | ||
+ | *2. Dokončí se prováděná instrukce. | ||
+ | *3. Do zásobníku se uloží obsah registrů EFLAGS[15:0], CS a IP. | ||
+ | *4. Z tabulky přerušení se přečte adresa obslužného programu (Interrupt Service Routine, ISR) z lineární/fyzické adresy LA = FA = i ∗ 4. | ||
+ | *5. Adresa ISR se uloží do CS:IP. | ||
+ | *6. Provádí se ISR. | ||
+ | *7. Po ukončení ISR (instrukcí IRET) se vyjme ze zásobníku návratová adresa a uloží se do registrů IP a CS, a příznaky, které se uloží se do registru EFLAGS[15:0]. | ||
+ | *8. Pokračuje se ve vykonávání původního programu od místa, ve kterém bylo jeho vykonávání přerušeno. | ||
+ | |||
+ | Procesory Pentium rozeznávají čtyři druhy přerušení: | ||
+ | *výjimky (generované CPU) | ||
+ | *maskovatelné (INTR) vnější přerušení | ||
+ | *nemaskovatelné (NMI) vnější přerušení | ||
+ | *programové přerušení - libovolnou výjimku či přerušení lze vyvolat i instrukcemi INT n, kde n je číslo přerušení. | ||
+ | |||
+ | |||
+ | ====Výpočet fyzickej adresy==== | ||
+ | * **lineárna adresa** v procesore 8086 je 20-bitová, ale registry majú veľkosť len 16 bitov | ||
+ | * používa sa 16-bitová adresa **segmentu** (selektor) a 16 bitová adresa **offsetu** | ||
+ | * dvojica segment a offset sa označuje ako úplný ukazateľ | ||
+ | * výpočet: LA = (Segment * 16 + Offset) mod 2^20 | ||
+ | {{:temata:37-prog_jsi:01_fyzicka_adresa.jpg|}} | ||
+ | |||
+ | * väzba medzi segmentovými registrami a offsetom: | ||
+ | {{:temata:37-prog_jsi:02_vazba.jpg|}} | ||
+ | * CS - Code Segment | ||
+ | * DS - Data Segment | ||
+ | * ES - Extra Segment | ||
+ | * FS - Extra Segment | ||
+ | * SS - Stack Segment | ||
+ | * BX, BP - báza (základná adresa v segmente) | ||
+ | * SI, DI - index pri prenose skupín dát | ||
+ | * displacement D8, D16 - relatívne posunutie ukazovateľa | ||
+ | |||
+ | * v podstate: | ||
+ | * pre adresu nejakého registra (DS, ES), offset je BX, prípadne môže byť zadaný ešte nejaký posun | ||
+ | * pre adresu inštrukcie v základnom nastavení použijete adresu CS:IP | ||
+ | * pre adresu zásobníku použijete adresu SS:SP, prípadne SS:BP | ||
+ | * | ||
+ | |||
+ | * príklad: | ||
+ | * CS=45F4h, SS=AB00h, DS=5541h, ES=1111h | ||
+ | * IP=2211h, SP=1FEOh, BX=3344h, BP=2244h, SI=1AD5h | ||
+ | * | ||
+ | * adresa inštrukcie: CS:IP = 45F40h + 2211h = 48151h | ||
+ | * adresa zásobníku: SS:SP = AB000h + 1FE0h = ACFE0h | ||
+ | * adresy operandov: | ||
+ | * [BX] => DS:[BX] = 55410h + 3344h = 58754h | ||
+ | * ES:[BX] => ES:[BX] = 11110h + 3344h = 14454h | ||
+ | * [BP+4] => SS:[BP+4] = AB00h + 2244h + 4h = AD248h | ||
+ | * [BX+SI+1] => DS:[BX+SI+1] = 55410h + 3344h + 01AD5h + 1h = 5A22Ah |