Ještě než začnu cokoliv psát MUSÍM doporučit skvělé čtení na toto téma Great Microprocessors of the past and present. Což je fascinující čtení o plahočení se za maximálním procesorovým výkonem, které prostě musíte přečíst jinak u mě nejste Geek !!
Jinak je to jasné - mládež je z dnešního příspěvku plná zklamání ze "strejda je chce unudit k smrti" když přece kažej ví, že o ten hnusný strojový kód se stará kompilátor Céčka. Jenomže, to není zdaleka tak snadné - názory na instrukční sady procesorů se vyvíjely, a máme neúspěšné instruční sady jko je Intanium, nebo Intel 432. Pak máme instrukční sady, které jsou schopny poskytnout obrovský výkon, ale jsou složité, takže kompilátory to nezvládají jako je Intel 860.
Pak je docela zajímavé sledovat zásadu čím je jednodušší hardware, tím musí být (většinou) komplikovanější software, toho je příkladem vývoj procesorů od PIC10 po PIC32.
Všechno se dočtete v "procesorech", které jsem vám doporučoval, co ale chci dneska probrat je mikrokontrolér a mikroprocesor současnosti a patrně i dlouhé budoucnosti a to je ARM a ty záležitosti jeho designu a instrukční sady, které jsem nakousl minule.
Takže vezměme nejprve jak vypadá procesor - když jsme my chteli mít jedničku museli jsme u tabule vykládat, že se sklárá z aritmeticko - logické jednotky, řadiče a bůh ví čeho ještě, co jsme už tehdy věděli, že není tak úplně pravda.
Takže procesor je "továrna" na výpočty, pokud má více jader - je to více továren v jedné hale. Středem haly vede pás na "rozdělané" instrukce, který je z obou stran hustě obstoupen "trpajzlíky" kteří na výpočtech intenzivně dělají.
Před tímto pásem jsou dvě skladiště - nazvaná data a program. Pokud jsou data i program ve stejné paměti je to Von Neumannovský procesor, pokud jsou data i program každá ve své paměti je to Harvardský procesor. Paní učitelka dává za neznalost tohoto rozdělení pětky, ale stejně je to jedno protože dneska všechny procesory se z venku jeví jako Von Neumanovské ale uvnitř maji rozdělenou datovou a instrukční cache, takže jsou bez výjimky Harvardské.
Montážní linka s trpajzlíky končí zase v paměti pro data - bez ohledu na architekturu procesoru.
Už minule jsem psal, že existují CISC s komplexními instrukcemi a RISC procesory s jednoduchými instrukcemi, což zase je důvod dávat ve škole pětky, ale dávno to není pravda, protože dneska jsou CISC procesory architektonicky neodlišitelné od RISC a naopak existují RISC procesory zrovna jako ARM nebo PowerPC, které mají tak komplexní a složité instrukční sady, že by se za to ani leckterý CISC nemusel stydět.
Prakticky je dělení jiné - filosoficky - jsou dvě velké skupiny procesorů - LOAD / STORE - ty si představujte tak, že na začátku výrobní linky je velký bagr LOAD, který vybírá data z paměti a klade je na pás a na druhé straně je buldozer STORE, který tlačí data zpátky do paměti a nikdo s trpajzlíků už nemá do paměti přístup. Takhle je udělána většina procesorů označovaných jako RISC.
Druhá varianta je tzv. MEMORY / DATA architektura - ta je starší a dá se popsat tak že každý trpajzlík kolem pásu jednou rukou se hrabe v tom co jede po pásu a druhou rukou - ohromně dlóóóúhou se hrabe v paměti. Takhle jsou udělány starší procesory typu CISC. Už z tohoto dětského příměru je jasné, která architektura je rychlejší, dneska používanější a proč tomu tak je.
Tvrdíte, že jste četli že nějaké to CORE i7 u vás doma je procesor typu 8086 a tudíž je CISC - taky jste naletěli na tu fintu? Problém je v tom, že jednoduché procesory typu RISC se ukázaly natolik výkonnější, že dnešní procesory, které z důvodu historické instrukční sady musí být CISC se vyrábějí jako "procesor v procesoru". To znamená, že nejprve je hardwarový překladač z kódu 8086 do nám utajeného RISCového kódu - tenhle hardwarový překladač je sám o sobě složitější než celé procesory v minulosti - teprve jeho výstupem je RISC kód, kterému CORE rozumí.
Pokud se chystáte rozebrat doma notebook - tak zadržte - překladač je uvnitř čipu samotného CORE - takže nekažte taťkovi notebook.
Hardwarový překlad 8086 instrukcí je opravdu extrém, ale každý procesor potřebuje bajty v paměti nějak překládat na instrukce a instrukce zase potřebuje překládat na příkazy "za které páky tahat". Takže centrem každého procesoru je instrukční dekodér, který rozhoduje o tom jestli takový procesor bude v assembleru "radost" nebo "hrůza" programovat.
Jak to tedy funguje - řekněme že máme RISC který má 32 registrů - což vzato číselně je binární číslo o 5 bitech. Instrukce takového procesoru musí obsahovat minimálně 3 části. Co se má dělat - řekněme že je to extrémní RISC, který má jenom 16 možností - to jsou 4 bity v instrukci, pak odkud brát data - to je jednočíslo registru - 5 bitů a pak kam dát výsledek - druhé číslo registru - to je dalších 5 bitů. Každá taková RISCová instrukce má tedy 14 bitů. U harwardských procesorů typu PIC to může znamenat, že máte i paměť pro program složenou ze 14 bitových slov - což je zrovna případ PIC16 jestli se nepletu. U Von Neumannovských procesorů je lepší zachovat instrukce jako násobky 16 bitů takže instrukce často bývá doplněna o další bity se speciální funkcí.
Jak tedy takový procesor pracuje - vezme instrukci a 4 "příkazové" bity vyšle do aritmetické jenotky na znamení co se má udělat. A 2x 5 bitů pošle na vnitřní sběrnici procesoru, která má většinou dvě větve "zdrojový" a "cílový" registr - patřičné dva registry se připojí k vstupním a výstupním hradlům aritmetické jednoty a ta v příštím taktu udělá výpočet.
Jednnoduché jako facka ?
Zas ta jednoduché to není - budu se ptát a sám si odpovídat - jak moderní procesory stihnou udělat v každém taktu jednu instrukci když každá instrukce vyžaduje několik operací ? - Princip je právě v tom pásovém zpracování - anglicky "pipelined insruction" - jako v automobilce na páse jde procesorem pás různě nehotových instrukcí a každým taktem se instrukce o jednu pozici posunou - ergo každým taktem na konci jedna hotová vypadne.
Jak se dělají instrukce, které nic nikam nezapisují ? Většina RISCových instrukčních sad má své "finty" které uživateli moc neukazuje - když dáte v AVR instrukci CLR R16 tedy vynuluj registr - budete překvapeni že assembler to přeloží jako XOR R16, R16, protože žádná instrukce nulování de facto neexistuje. Navíc spousta RISC procesorů má jeden registr na tvrdo nastavený na 0 - ať do něj píšete co chcete pořád je to nula - pak třeba instrukce NOP - čekej jeden takt se překládá ADD R1, R0 kde R0 je "nulový registr".
Nebo některé procesory (zrovna ARM) je tříregistrový procesor takže umí udělat ADD R1, R2, R3 což znamená že v instrukci jsou 3 pole pro číslo registru a instukce znamená že R1 = R2 + R3. pak jednoduchá instrukce MOV R1, R2 vlastně je identická s instrukcí ADD R1, R2, R0 neboli R1 = R2 + 0.
Opět jsem přecenil své možnosti, takže na samotný ARM se dostaneme příště.
Dnes už jenom tradiční rada pro blondýny : když máte 160 cm výšky a 80 kilo váhy je to body mass index 31,3 - v pásmu obezity, pokud si vezmete 20 centimetrové podpatky budete mít 180 cm a to je při stejné váze body mass index 24,7 - v pásmu normy - a pak že prý "podpatky škodí zdraví" - pche....
To clr r16 se mi nezdá, ale koukám do popisu instrukční sady a je to tam... Studovat instrukci clr by mě teda vážně nenapadlo.