Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

temata:37-prog_jsi:main [2011/03/15 13:51]
sgs vytvořeno
temata:37-prog_jsi:main [2012/04/11 13:26] (aktuální)
conyx [Programování v jazyku symbolických instrukcí]
Řádek 1: Řádek 1:
-aa+~~ODT~~ 
 + 
 +=====Programování v jazyku symbolických instrukcí===== 
 + 
 +Základní části počítače: 
 +  *aritmeticko-logická jednotka (Arithmetic and Logic Unit, ALU) 
 +  *řadič / řídící jednotka (Control Unit, CU) 
 +  *zdroj taktovacích impulsů/hodin (clock) 
 +  *registry (registers) 
 +  *hlavní paměť (Memory Storage Unit / Main Memory) 
 +  *vstupní a výstupní zařízení (Input/Output Devices, I/O Devices) 
 +  *adresova, datova a kontrolni sbernice 
 + 
 +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** 
 +  *EAX (Accumulator) střádač 
 +  *EBX (Base) ukazatel na data v datovém segmentu 
 +  *ECX (Counter) čítač řetězových a smyčkových operací 
 +  *EDX (Data) rozšíření střádače, ukazatel na I/O zařízení 
 +  *ESI (Source Index) ukazatel na zdrojová data řetězových operací, index 
 +  *EDI (Destination Index) ukazatel na cílová data řetězových operací, index 
 +  *EBP (Base Pointer) ukazatel na data v zásobníkovém segmentu 
 +  *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. 
 + 
 +**strojový kód/jazyk** - úplný soubor všech instrukcí daného procesoru, pro různé počítače rozdílný, 
 +programovani ve strojovem kodu je prakticky nemozny 
 + 
 +**hlavní pamět** - dva typy objektů – data a instrukce, procesor považuje za instrukci ten objekt, na 
 +který ukazuje registr ukazatele instrukcí (IPR) 
 + 
 + 
 +====Instrukce==== 
 +Instrukce jsou příkazy pro procesor, které bezprostředně řídí 
 +jeho činnost. Každá instrukce obsahuje operační kód a může 
 +obsahovat i adresy operandů, nebo přímo operandy. 
 +Operační kód jednoznačně určuje operaci a jeho součástí 
 +mohou být i adresy registrů, se kterými instrukce pracuje. 
 +Přes rozdíly v instrukčních souborech různých procesorů lze 
 +vysledovat několik základních typů instrukcí: 
 +  *instrukce přenosové 
 +  *instrukce aritmetické 
 +  *instrukce logické 
 +  *instrukce posuvů a rotací 
 +  *instrukce skokové 
 +  *instrukce řetězové 
 +  *instrukce řídící 
 + 
 +[[https://www.fit.vutbr.cz/study/courses/IAS/private/10ias_4.pdf|link na slidy s instrukcemi]] 
 + 
 +====Činost počitače==== 
 +1. Do instrukčního registru se uloží obsah paměťového místa, které 
 +je adresováno registrem ukazatele instrukcí. 
 + 
 +2. Nastaví se nový obsah registru ukazatele instrukcí (ukazuje na 
 +následující instrukci). 
 + 
 +3. Obsah instrukčního registru je dekódován, t.j. určí se požadovaná 
 +operace a adresy příslušných operandů. 
 + 
 +4. Provede se určená operace (u instrukcí skokových se nastaví nový 
 +obsah registru ukazatele instrukcí). 
 + 
 +5. Pokud nebyla provedená instrukce pokynem k zastavení 
 +procesoru, pokračuje se znovu od bodu 1. 
 + 
 +====Symbolický jazyk==== 
 +nízkoúrovnový jazyk jazyk, implementace symbolických reprezentací číselných strojových kódů. Definovano vyrobcem HW, založené na zkratkach (direktivach) pro lepsi orientaci programátora. 
 +Preklad do strojového jazyka provádí překladač (Assembler). V češtině se oba předchozí pojmy často nerozlišují a označují se stejným slovem „asembler“. 
 +Aby překladač byl překlad schopen provést, musí mu být poskytnuty některé dodatečné informace, které se označují jako direktivy (pokyny pro překladač). 
 + 
 +Pruchod překladače zdrojovým kódem 2x: 
 + 
 +  *Prvně syntaktická správnost, vytváří tabulku symbolů, přirazuje adresy 
 +  *Pokud je všem symbolům přirazená jedinečná adresa, proběhne preklad 
 + 
 + 
 +====FPU==== 
 +  *Slouží pro práci s desetinými čísly 
 +  *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
temata/37-prog_jsi/main.1300193462.txt.gz · Poslední úprava: 2011/03/15 13:51 autor: sgs
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki