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/17 15:14] 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 21: | Řádek 23: | ||
*EBP (Base Pointer) ukazatel na data v zásobníkovém segmentu | *EBP (Base Pointer) ukazatel na data v zásobníkovém segmentu | ||
*ESP (Stack Pointer) ukazatel zásobníku | *ESP (Stack Pointer) ukazatel zásobníku | ||
+ | |||
+ | **Registr EFLAGS** | ||
+ | |||
+ | Registr příznaků EFLAGS obsahuje příznaky stavové, řídící a systémové. | ||
+ | *DF Direction Flag nastavuje směr operací u řetězových instrukcí | ||
+ | *CF Carry Flag indikuje přenos/výpůjčku z/do nejvyššího bitu | ||
+ | *PF Parity Flag indikuje sudou paritu v nejméně významné slabice výsledku (nastavuje se při sudém počtu jedniček) | ||
+ | *AF Auxiliary Flag indikuje přenos/výpůjčku z/do bitu č. 3 | ||
+ | *ZF Zero Flag indikuje nulový výsledek (při nulovém výsledku se nastaví na jedničku, jinak se nuluje) | ||
+ | *SF Sign Flag indikuje záporný výsledek (při záporném výsledku se nastaví na jedničku, jinak se nuluje) | ||
+ | *OF Overflow Flag indikuje přetečení výsledku operací se znaménkovými čísly (při přetečení se nastaví na jedničku, jinak se nuluje) | ||
+ | |||
+ | **Registr EIP** | ||
+ | |||
+ | Registr EIP obsahuje 32 bitový ukazatel následující instrukce, tj. instrukce, která se bude jako další v pořadí provádět. V 16ti bitovém režimu obsahuje registr IP 16 ti bitový ukazatel následující instrukce. Obsah registru EIP, resp. IP mohou měnit pouze skokové instrukce. | ||
+ | |||
Nejmenší adresovatelnou jednotkou hlavni paměti je byte - slabika. | Nejmenší adresovatelnou jednotkou hlavni paměti je byte - slabika. | ||
Řádek 46: | Řádek 64: | ||
*instrukce řetězové | *instrukce řetězové | ||
*instrukce řídící | *instrukce řídící | ||
+ | |||
+ | [[https://www.fit.vutbr.cz/study/courses/IAS/private/10ias_4.pdf|link na slidy s instrukcemi]] | ||
====Činost počitače==== | ====Činost počitače==== | ||
Řádek 73: | Řádek 93: | ||
*Pokud je všem symbolům přirazená jedinečná adresa, proběhne preklad | *Pokud je všem symbolům přirazená jedinečná adresa, proběhne preklad | ||
- | Preruseni, | + | |
- | odkaz na zakladni instruce | + | ====FPU==== |
- | fyzicka a efektivni adresa | + | *Slouží pro práci s desetinými čísly |
- | fpu | + | *Používá speciální zásobník |
+ | |||
+ | Tyto typy instrukcí: | ||
+ | *přenosové instrukce | ||
+ | *aritmetické instrukce | ||
+ | *porovnávací instrukce | ||
+ | *transcendentní instrukce | ||
+ | *řídící instrukce | ||
+ | |||
+ | [[https://www.fit.vutbr.cz/study/courses/IAS/private/09ias_12.pdf|Link na slidy s instrukcemi]] | ||
+ | |||
+ | ====Přerušení==== | ||
+ | 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 | ||
+ | *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). | ||
+ | *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 |