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, IPR) 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í

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

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

väzba medzi segmentovými registrami a offsetom:

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