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í:
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
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
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