Poznámka na úvod: Vety ktoré som nevedel preložiť, prípadne ktorými som si nebol istý, som napísal v pôvodnom znení s titulkami. Tak isto mená vecí a názvy kapitol sú v angličtine. Ku koncu ma trochu mrzelo, že som to vôbec začal prekladať, ale tak už som to dokončil, keď som to začal. Snažil som sa to utriasť, aby to nevyzeralo jak z automatického prekladača anglického jazyka. Ak sa vám to zapáči, tak si kúpte knihu. Opakujem - je to učebnica assembleru a nie elektrotechniky. To, čo sa tu dozviete, potrebujete, aby ste mohli začať písať programy v assembleri.
-= Branch prediction unit =-
Použitie niekoľkých vrstiev cache je jedným zo spôsobov, ako urýchliť beh programu, no stále to nerieši problém pri skokoch. Ak má program veľa logických vetiev, môže byť jednoducho nemožné, aby jednotlivé vrstvy stíhali, výsledkom čoho je viacej prístupov k pamäti "na poslednú chvíľu", ako pre inštrukcie, tak aj pre dáta.
Procesory platformi IA-32 prišli so systémom predpovedania vetiev (branch prediction) aby pomohli vyriešiť tento problém. Predpovedanie vetiev sa snaží zistiť, aká inštrukcia bude najbližšie potrebná vo vetve programu. Na určenie najpravdepodobnejšej cesty, ktorou sa kód vydá, sa používajú špeciálne štatistické algoritmy a analýzy. Inštrukcie "pozdĺž tejto cesty" prejdu cez predvýber a sú uložené do vrstiev cache.
Procesor Pentium 4 používa tri techniky pri predpovedi vetiev:
- Deep branch prediction
- Dynamic data flow analysis (dynamická analýza dátového toku)
- Speculative execution
Deep branch prediction umožnuje procesoru pokúsiť sa dekódovať inštrukcie ďaleko za niekoľkými vetvami v programe. Opäť, na predpoveď najpravdepodobnejšej cesty cez vetvy sa použijú štatistické algoritmy. Táto technika je síce nápomocna, no nie je úplne blbuvzdorná.
Dynamická analýza dátového toku vykonáva štatistickú real-time analýzu dátového toku cez procesor. Inštrukcie, ktoré sa ukazujú byť nevyhnutné pre chod programu, ale instruction pointer k nim ešte neprišiel, sú presunuté do out-of-order execution core (opísané ďalej). Navyše, akákoľvek inštrukcia, ktorá môže byť vykonaná, kým procesor čaká na dáta pre inú inštrukciu, je spracovaná.
Speculative execution umožňuje procesoru určiť, ktoré vzdialené inštrukcie, nenachádzajúce sa nutne v práve vykonávanej vetve, budú pravdepodobne vyžadované a spracovať ich použitím out-of-order execution engine.
-= Out-of-order execution engine =-
Je to jedno z najlepších vylepšení procesora Pentium 4 v zmysle rýchlosti. Toto je miesto, kde sa inštrukcie pripravujú na spracovanie "execution unit"-om. Out-of-order execution engine obsahuje niekoľko buffrov, aby mohol zmeniť poradie inštrukcií v pipeline na zvýšenie výkonu kontrolnej jednotky (control unit). Toto je demonštrované na nasledujúcom obrázku:
Inštrukcie získané z prefetch and decoding pipeline sú analýzované a ich poradie je zmenené, čo umožňuje, aby boli vykonané tak rýchlo, ako je to len možné. Analýzou veľkého množstva inštrukcií vie out-of-order execution engine nájsť nezávislé inštrukcie, ktoré môžu byť vykonané (a ich výsledok uložený), až kým nebudú potrebné pre zvyšok programu. Procesor Pentium 4 môže mať kedykoľvek až 126 inštrukcií v out-of-order execution unit.
V out-of-order execution unit sú tri sekcie
- The allocator
- Register renaming
- The micro-operation scheduler
Alokátor je policajt pre traffic. Jeho úlohou je zabezpečiť, aby bolo správne vyhradené miesto v buffri pre každú inštrukciu, ktorú out-of-order execution unit spracováva. Ak nie je potrebné miesto voľné, alokátor pozastaví vykonávanie tejto inštrukcie a prejde k takej, ktorej môže vyhradiť miesto a môže byť spracovaná.
Sekcia pre premenovávanie registrov alokuje logické registre na spracovanie inštrukcií, ktoré potrebujú prístup do registrov. Miesto ôsmych všeobecných registrov, ktoré IA-32 poskytuje, obsahuje sekcia premenovávania registrov 128 logických registrov. Mapuje žiadosti inštrukcií o prístup k registrom na jeden z logických registrov, aby umožnila súčasný prístup niekoľkých inštrukcií k tomu istému registru. Mapovanie sa robí pomocou Register Allocation Table (RAT). Toto pomáha urýchliť spracovanie inštrukcií, ktoré potrebujú prístup k rovnakej skupine registrov.
Micro-operation plánovač určuje, kedy je mikro operácia pripravená na spracovanie a to tak, že preskúma vstupné elementy, ktoré operácia potrebuje. Úlohou tohoto plánovača je posielať operácie pripravené na spracovanie do Retirement Unit a počas toho stále dohliadať na závislosti programu. Plánovač používa dva rady (queues), kam umiestňuje mikro operácie. Jedna rada je pre operácie, ktoré vyžadujú prístup do pamäte a druhá pre tie ktoré ho nevyžadujú. Rady sú zviazané do "Dispatch portov" (The queues are tied to dispatch ports). Rôzne typy procesorov Pentium môžu obsahovať rôzny počet dispatch portov. Dispatch porty posielajú mikrooperácie do Retirement Unit.
-= Retirement unit =-
Prijíma všetky mikrooperácie z pipeline dekóderov a z out-of-order execution engine a pokúša sa zostaviť mikrooperácie do správneho poradia pre program, aby sa správne vykonali.
Retirement Unit posúva mikrooperácie do Execution Unit na spracovanie v poradí, v akom ich posiela out-of-order execution engine, ale potom sleduje výstup, zmení poradie výsledkov tak, aby ich program dostal v správnom poradí. Toto je splnené za pomoci veľkých buffrov na uchovávanie mikrooperácií.
Keď je mikrooperácia skončená a výsledky sú uložené do správneho poradia, tak je operácia považovaná za "retired" (vyslúžilá, už v dôchodku) a je odstránená z Retirement Unit. Retirement Unit taktiež update-uje informácie v Branch Prediction Unit, aby si bola istá, ktoré vetvy boli vzaté a aké inštrukčné kódy sú spracovávané.
-= Execution unit =-
Hlavnou úlohou procesora je vykonávať inštrukcie. Táto funkcionalita je zahrnutá v execution unit. Jeden procesor môže v skutočnosti obsahovať niekoľko execution unit, ktoré sú schopné spracovať inštrukcie súčasne.
Execution unit pozostáva z jednej alebo viacerých Arithmetic Logic Unit (ALU). ALU je špeciálne navrhnutá pre matematické operácie pre rôzne typy dát. Execution unit procesora Pentium 4 má niekoľko ALU pre nasledovné operácie:
- Single-integer operations
- Complex-integer operations
- Flotaing-point operations
Low-latency integer execution unit (LLIEU): sa používa na jednoduché matematické operácie s celými číslami ako napr. sčítanie, odčítanie a boolean operácie. P4 sú schopné vykonať 2 low-latency integer operácie za hodinový cyklus, čo z efektívneho hľadiska zdvojnásobuje rýchlosť spracovania. (povodná veta: Pentium 4 processors are capable of performing two low-latency integer operations per clock cycle, effectively doubling the processing speed)
Complex-integer execution unit (CIEU): stará sa o vačsinu posunutí a rotácií v 4 hodinových cykloch. Násobenie a delenie trvajú dosť dlho, často 14 až 60 cyklov.
Floating-point execution unit (FPEU): je rozdielna medzi rôznymi procesormi architektúry IA-32. Všetky procesory Pentium dokážu pracovať s operáciami s desatinnou čiarkou použitím štandardnej FPEU. Procesory s MMX a SSE podporou robia tieto výpočty tiež v FPEU. FPEU obsahuje registre pre dáta s dlžkou od 64bit do 128bit. Toto umožňuje použiť väčšie hodnoty vo výpočte, čo môže urýchliť komplexné floating-point operácie ako napr. digital signal processing a kompresiu videa.
-= Registers =-
Väčšina operácií procesora potrebuje spracovávať aj dáta. Nanešťastie najpomalšia operácia do ktorej sa môže procesor pustiť ja čítanie a zápis dát z pamäte. Ako je ukázané na obrázku (predošlá časť, prvý obrázok), keď procesor pristupuje k nejakému dátovéme elementu žiadosť musí putovať mimo procesor, cez kontrolnú zbernicu do memory storage unit. Tento proces je nielen komplikovaný, no navyše núti procesor čakať na prístup do pamäte. Tento čas by sa dal využiť spracovaním iných inštrukcií.
Na pomoc pri riešení tohoto problému obsahuje procesor vnútornú pamäť zvanú register. Registre sú schopné uchovať dáta pre spracovanie bez toho aby bolo nutné pristupovať do memory storage unit. Nedostatočné na tom je to, že počet registrov je obmedzený.
Procesory platformy IA-32 majú niekoľko skupín registrov rôznej dĺžky. Niektoré procesory platformy IA-32 taktiež obsahujú špeciálne registre. Základné typy registrov sa nachádzajú vo všetkých typoch procesorov IA-32, sú to:
Register | Opis |
pre všeobecné použitie | osem 32bitových registrov na ukladanie dát |
Segment | šesť 16bitových registrov pre prístup do pamäte |
Instruction pointer | jeden 32bitový register ktorý obsahuje adresu inštrukcie ktorá sa najbližšie vykoná. |
Floating-point data | osem 80bitových registrov pre aritmetické operácie s floating-point data |
Control | päť 32bitových registrov používaných na určenie režimu v ktorom procesor pracuje |
Debug | osem 32bitových registrov používanych pre uloženie informácií spojených s debugovaním |
-= General-purpose registers (registre pre všeobecné použitie) =-
Používajú sa na dočasnú úschovu dát keď sú tie spracovávané procesorom. Vyvinuli sa zo starých 8-bitových v procesore 8080 k dnešným 32bitovým ktoré sú dostupné v Pentiách. Každá nová verzia registra pre všeobecné použitie je plne spätne kompatibilná s predošlými procesormi. Preto kód ktorý používa 8-bitové registre na čipe 8080 je stále funkčný pre 32bitový Pentium čip (cháp v zmysle assemblerovského kódu).
Zatiaľ čo väčšina registrov pre všeobecné použitie môže byť použitá na uloženie akéhokoľvek typu dát, niektoré registre získali špeciálne použitie, ktoré je dôsledne dodržané v assemblerovských programoch. Nasledujúca tabuľka hovorí o najčastejšom použití všeobecných registrov.
Register | Opis |
EAX | register pre operandy a výsledné dáta |
EBX | pointer na dáta v data memory segment |
ECX | Counter pre operácie s reťazcami a slučkami |
EDX | I/O pointer |
EDI | Pointer pre cieľové dáta v operáciách s reťazcami |
ESI | Pointer pre zdrojové dáta v operáciách s reťazcami |
ESP | Pointer pre stack |
EBP | Pointer pre dáta stacku |
Na 32bitové EAX, EBX, ECX a EDX registre môže byť pristupované cez ich 16 a 8 bitové mená z minulých čias, tak ako znázorňuje obrázok:
Použitím AX sa použije dolných 16 bitov EAX. Použitím AL dolných 8 bitov EAX.
-= Segment registers =-
Sú určené špeciálne na odkazovanie sa do miest v pamäti. Procesory platformy IA-32 umožňujú prístup do pamäte troma rôznymi spôsobmi:
- Flat memory model
- Segmented memory model
- Real-address memory model
Segmented memory model delí systémovú pamäť na skupiny nezávislých segmentov, na ktoré sa odkazuje pointrami v segmentových registroch. Každý segment je určený pre špecifický typ dát. Jeden je na uloženie inštrukčných kódov, ďalší na dátové elementy a tretí na stack programu. Miesta v pamäti sú definované logickou adresou. Pozostáva z adresy segmantu a offsetu. Procesor si preloží logickú adresu na zodpovedajúcu lineárnu adresu na to aby pristúpil k miestu v pamäti.
Tabuľka dostupných segmentových registrov:
Segmentový registers | Popis |
CS | Code segment |
DS | Data segment |
SS | Stack segment | ES | Extra segment pointer |
FS | Extra segment pointer |
GS | Extra segment pointer |
Každý segmentový register je veľkých 16 bitov a obsahuje pointer na začiatok segmentu daného typu pamäte. Register CS obsahuje pointer na code segment. Je to miesto v pamäti, kde sú uložené inštrukcie. Procesor číta inštrukcie z pamäte na základe hodnoty v CS a hodnoty offestu v EIP. Program nemôže explicitne meniť hodnotu v CS. Procesor tam priradí hodnotu v momente keď je programu vyhradené miesto v pamäti.
DS,ES,FS a GS sú registre, ktoré ukazujú do dátového segmentu. Štyri separátne dátové segmenty umožňujú, aby program rozdelil dátové elementy a zaistil aby sa neprelínali (pôvodná veta: By having four separate data segments, the program can help separate data elements, ensuring that they do not overlap). Program musí naplniť registre dátových segmentov správnymi adresami a pristupovať k miestam v pamäti za pomoci offsetu (V knihe na tomto konkretnom mieste nie je uvedené (až neskor v inej kapitole) tak dopĺňam, že offset je relatívna adresa so začiatkom v adrese segmentu).
SS register sa používa na adresu stack segmentu. Je to miesto, kde sú uložené dáta, ktoré sú argumentami funkcií a procedúr v programe.
Keď program používa real-address mód, tak všetky segmentové registre ukazujú na lineárnu adresu 0 a nie sú menené programom. Všetky inštrukčné kódy, dátové elementy a veci v stacku sú prístupné priamom cez ich lineárnu adresu.
-= Instruction pointer register =-
Je to EIP register, tiež občas zvaný program counter, obsahuje adresu ďalšej inštrukcie, ktorá sa má vykonať. Aj keď to znie ako jednoduchá úloha s použitím predvýberu inštrukcie, tak nie je.
Program samotný nemôže priamo meniť hodnotu tohoto registra. Musíte použiť normálne inštrukcie, ako napríklad skoky, aby ste zmenili EIP a teda ďalšiu inštrukciu, ktorá bude načítaná do prefetch cache.
Vo flat memory model obsahuje EIP lineárnu adresu miesta v pamäti pre nasledujúcu inštrukciu. Ak aplikácia používa segmented model, instruction pointer ukzauje na logickú adresu, na ktorú sa odkazuje obsah CS.
-= Contol registers =-
Päť kontrolných registrov sa používa na určenie operačného módu procesora a charakteristiky práve vykonávanej úlohy. Registre sú opísané v tejto tabuľke:
Register | Opis |
CR0 | Systémový príznak, ktorý kontroluje operačný mód a stavy procesora |
CR1 | Zatiaľ navyužitý |
CR2 | Memory page fault information |
CR3 | Memory page directory information |
CR4 | Flags, that enable processor features and indicate feature capabilities of the processor |
K hodnotám v kontrolných registroch sa nedá priamo pristúpiť, no dáta v nich môžu byť presunuté do všeobecných registrov. Akonáhle sú dáta vo všeobecných registroch, tak môže program zanalyzovať, aký je operačný stav procesora a/alebo práve bežiaceho procesu.
Ak chcem zmeniť hodnotu v kontrolnom registri, spraví sa to tak, že hodnotu nastavím vo všeobecnom registri a presuniem do kontrolného registra. Systémoví programátori zväčša modifikujú hodnotu kontrolných registrov. Programátori obyčajných aplikácií väčšinou nie, no môžu si napríklad chcieť zistiť aké možnosti ponúka procesor na ktorom aplikácia beží.
-= Flags =-
Pre každú operáciu vykonanú procesorom musí existovať mechanizmus ako zistiť, či bola úspešne vykonaná alebo nie. Na toto slúžia príznaky (Flags) procesora.
Sú dôležité pre programovanie v assembleri, pretože sú jedinou možnosťou ako zistiť, či funkcia programu zlyhala alebo nie. Napríklad, ak aplikácia urobila operáciu odčítania, ktorej výsledkom je záporné číslo, tak sa nastavý špeciálny príznak v procesore. Bez overenia tohoto príznaku by assemblerovský program nemal ako zistiť, že niečo neprešlo tak ako malo.
Platforma IA-32 používa jeden 32bitový register pre skupinu stavových, kontrolných a systémových príznakov. Register EFLAGS obshauje 32 bitov informácií, ktoré sú namapované tak aby predstavovali konkrétny príznak (že sa niečo stalo, pozn. prekladateľa). Niektoré bity sú vyhradené pre budúce použitie na definovanie dodatočných príznakov pre budúce procesory. V dobe písania tejto knihy sa používa 17 bitov.
Príznaky sú na základe funkcionality rozdelené do troch skupín:
- Status flags
- Control flags
- System flags
-= Status flags =-
Používajú sa na určenie výsledku matematickej operácie. Sú to nasledovné príznaky:
Príznak | Bit | Meno |
CF | 0 | Carry flag |
PF | 2 | Parity flag |
AF | 4 | Adjust flag |
ZF | 6 | Zero flag |
SF | 7 | Sign flag |
OF | 11 | Overflow flag |
Carry flag sa nastavý, ak matematická operácia na hodnote typu unsigend integer zmenila hodnotu najvyššieho bitu (povodná veta: The Carry flag is set if a mathematical operation on an unsigend integer value generates a carry or borrow for the most significant bit). Toto reprezentuje pretečenie údajov pre register, ktorý bol použitý v matematickej operácii. Keď nastane pretečenie, tak dáta v registri nie sú správnou odpoveďou na matematickú operáciu.
Parity flag sa používa na indikovanie toho, či register v ktorom je výsledok po matematickej operácii obsahuje pokaznené dáta. Ako jednoduchý test správnosti, parity flag sa nastaví ak je celkový počet bitov s hodnotou 1 vo výsledku párny a nenastavý (presnejšie nastavý na 0) ak je ich nepárny počet. Sledovaním parity flagu si aplikácia môže zistiť, či došlo k porušeniu dát v registri po operácii.
Adjust flag sa používa pri Binary Coded Decimal matematických operáciách. The adjust flag is set if a carry or borrow operation occurs from bit 3 of the register used for the calculation.
Zero flag je nastavený, ak je výsledkom operácie 0. Toto sa často používa na rýchle zistenie, či je výsledok operácie 0.
Sign flag určuje, či je výsledok operácie záporný alebo kladný a je zhodný s najvyšším bitom vo výsledku.
Overflow flag sa používa pri práci so signed integer, keď je kladná hodnota príliš veľká, alebo záporná príliš malá na to aby bola správne reprezentovaná v registri.
-= Control Flags =-
Používajú sa na kontrolu správania sa procesora. Momentálne je definovaný len jeden DF - Direction Flag. Používa sa na kontrolu spôsobu akým sú reťazce spracovávané procesorom. Ak je nastavený (na 1), inštrukcie na prácu s reťazcami automaticky znižujú adresu pamäte aby dostali ďalší byte z reťazca. Ak je zmazaný (nastavený na 0), inštruckie na prácu s reťazcami adresu zvyšujú.
-= System Flags =-
Používajú sa na kontrolu operating system-level operácie. Aplikácie by sa nikdy nemali pokúšať metiť tieto príznaky. Sú to nasledovné príznaky:
Flag | Bit | Meno |
TF | 8 | Trap flag |
IF | 9 | Interrupt enable flag |
IOPL | 12 a 13 | I/O priviledge level flag |
NT | 14 | Nested task flag |
RF | 16 | Resume flag |
VM | 17 | Virtual-8086 mode flag |
AC | 18 | Alignment check flag |
VIF | 19 | Virtual interrupt flag |
VIP | 20 | Virtual interrupt pending flag |
ID | 21 | Identification flag |
Nastavením Trap Flagu sa zapína single-step mód. V tomto móde vykoná procesor naraz práve jednu inštrukciu a čaká na signál aby mohol vykonať ďalšiu. Používa sa to hlavne pri debuggovaní kódu.
Interrupt flag kontroluje, ako procesor odpovedá na signály z externých zdrojov.
I/O priviledge field indikuje IOPL pre práve bežiaci proces. To jest definovanie úrovne prístupu pre I/O adresový priestor. Hodnota priviledge field musí byť menšia alebo rovná prístupovej úrovni pre I/O adresový priestor. Ak nie, tak je prístup do tohoto priestoru zamietnutý.
Nested task flag kontroluje, či je práve bežiaci task spojený s naposledy vykonávaným taskom. This is used for chaining interrupted and called tasks.
Resume flag kontroluje, ako procesor zareaguje na výnimky v debuggovacom režime.
Virtual-8086 flag indikuje, že procesor pracuje v režime virtual-8086 a nie v protected alebo reálnom režime.
Alignment check flag sa používa (spolu s AM bitom v CR0 registri) na zapnutie podporu sledovania zarovnania odkazov v pamäti.
Virtual interrupt flag replikuje IF flag keď procesor pracuje vo virtuálnom režime.
Virtual interrupt pending flag sa používa, keď procesor pracuje vo virtuálnom režime a určuje či je prerušenie v stave pending.
ID flag indikuje, či procesor podporuje inštrukciu CPUID. Ak procesor vie nastaviť alebo zmazať tento príznak, tak inštrukciu podporuje, ak nie tak nie.
-= Advanced IA-32 Features =-
Základné vlastnosti platformy IA-32, ktoré boli doteraz spomenuté sú prístupné na každom procesore, počnúc 80386. Táto časť opisuje niektoré vylepšené funkcie, ktoré môže programátor v assembleri použiť keď píše program špeciálne pre procesory Pentium.
-= The x87 floating-point unit =-
Prvé procesory rodiny IA-32 vyžadovali ďalší čip na vykonávanie mateimatických operácií s desatinnou čiarkou. Procesory 80287 a 80387 boli špeciálne určené práve na túto vec. Programátori, ktorí potrebovali rýchle spracovávanie operácií s desatinnou čiarkou boli nútení siahnuť po ďalšom hardware-y, aby uspokojili svoje potreby.
Počnúc procesorom 80486 sa aritmetické funkcie nachádzajúce sa pôvodne v 80287 a 80387 zahrnuli do hlavného procesora. Na podporu týchto funkcií boli potrebné dodatočné inštrukčné kódy, registre a execution units. Dokopy sa im hovorí x87 floating-point unit (FPU).
x87 FPU zahŕňa nasledovné registre:
FPU Register | Opis |
Data register | Osem 80bitových registrov pre dáta s desatinnou čiarkou |
Status register | 16bitový register na indikovanie stavu FPU |
Control register | 16bitový register na kontrolu presnosti FPU (precision) |
Tag register | 16bitový register na opis obsahu osmych dátových registrov |
FIP register | 48bitový FPU instruction pointer, ukazuja na najbližšiu FPU inštrukciu |
FDP register | 48bitový FPU data pointer, ukazuje na dáta v pamäti |
Opcode register | 11bitový register v ktorom je posledná inštrukcia vykonávaná FPU |
FPU registre a inštrukcie umožňujú programátorom v assembleri rýchle spracovanie zložitých matematických operácií s desatinnou čiarkou, ktoré sú potrebné napríklad pre spracovanie grafiky, digitálne spracovanie signálu, a complexné aplikácie pre biznis. FPU dokže spracovávať floating-point aritmetiku podstatne rýchlejšie ako softwareová simulácia v štandardnom CPU. Akonáhle je to možné a potrebné, programátori v assembleri by maly využívať FPU.
-= Multimedia Extension (MMX) =-
Procesor Pentium II priniesol ďalšiu metódu pre programátorov na vykonávanie zložitej matematiky s celými číslami. MXX bola prvá technológia, ktorá podporovala Single Instruction, Multiple Data (SIMD) execution model.
SIMD model bol vyvinutý na spracovanie veľkého množstva čísiel, bežne sa nachádzajúcich v multimediálnych aplikáciách. The SIMD model uses expanded register sizes and new number formats to speed up the complex number crunching required for real-time multimedia presentations.
Prostredie MMX prináša tri nové floating-point (v texte je naozaj floating point, asi chcel napisat integer) dátové typy ktoré môžu byť spracované procesorom:
- 64-bit packed byte integers
- 64-bit packed word integers
- 64-bit packed doubleword integers
Na používanie dátových formátov používa technológia MMX osem registrov FPU ako registrov pre špeciálny účel. Registre MMX sa volajú MM0 až MM7 a používajú sa na integer aritmetíku na 64-bit packed integre.
Aj keď MMX technológia vylepšila rýchlosť spracovania zložitých aritmetických operácií, nepriniesla nič nové pre programy, ktoré vyžadovali zložitú floating-point aritmetiku. Toto bolo vyriešené v prostredí SSE.
-= Streaming SIMD extensions (SSE) =-
Ďalšia generácia technológie SIMD bola implementovaná v procesore Pentium II. SSE zvyšuje výkon zložitých aritmetických operácií, často používaných v 3D grafike, videu a pri videokonferenciách.
Prva implementácia SSE v procesoroch Pentium III pridala osem nových 128bitových registrov (volali sa XMM0 až XMM7) a nový dátový typ - 128-bit packed single-precision floating point. SSE technológia taktiež priniesla nové inštrukčné kódy na spracovanie až štyroch "128-bit packed single-precision floating point" čísiel v jedinej inštrukcii.
Druhá implementácia SSE (SSE2) v procesoroch Pentium 4 má tie isté registre ako SSE a priniesla päť nových dítových typov:
- 128-bit packed double-precision floating point
- 128-bit packed byte integers
- 128-bit packed word integers
- 128-bit packed doublewoprd integers
- 128-bit packed quadword integers
(Tu je ďalej vetam že sú dátové typy viac opísané v časti 7 a 17 knihy, tam sa opisuje ako pracovať na úrovni assemblera s SSE, SSE2 a je vysvetlené čo je čo v tých 128 bitoch, tú kapitolu sem ale nedávam). Nové dátové typy a prislúchajúce inštrukčné kódy umožňujú programátorom používať ešte zložitejšie matematické operácie v ich programoch. "128-bit packed single-precision floating point" dátový typ umožňuje robiť advanced 3D grafické operácie akými sú napríklad ray tracing s použitím minimálneho množstva procesorového času.
Tretia implementácia SSE (SSE3) neprináša žiadne nové dátové typy, ale prináša niekoľko nových inštrukcií na spracovanie ako celých čísiel tak aj čísiel s plávajúcou desatinnou čiarkou v XMM registroch.
-= Hyperthreading =-
Jedna z najvzrušujúcejších vlastonstí pridaných do rady procesorov Pentium 4 je hyperthreading. Umožňuje jednému IA32 procesoru obslúžiť niekoľko vlákien procesu súčasne.
Technológia hyperthreading pozostáva z dvoch alebo viacerých logických procesorov umiestnených fyzicky na jedinom procesore. Každý logický procesor obsahuje plnú sadu svojich registrov (t.j. všeobecné, segmentové, kontrolné a debugovacie). Všetky logické procesory zdieľajú tú istú execution unit. Out-of-order execution core je zodpovedné za spracovanie oddelených vlákien inštrukčných kódov ktoré dodávajú jednotlivé logické procesory.
Najviac výhod hyperthredingu sa ukazuje na úrovni operačného systému. Multitaskingové OS, ako napríklad MS Windows, alebo rôzne implementácie UNIXových systémov môžu priradiť vlákna procesov jednotlivým logickým procesorom. Pre programátora obyčajných aplikácií sa hyperthreading nemusí zdať ako veľká výhra.
-= The IA-32 Processor Family =-
V dobe písania tejto knihy je architektúra IA-32 najpopulárnejšou počítačovou platformou pre desktopové stoje a mnohé servery. Najpopulárnejší (cháp najčastejšie používaný) operačný systém je MS Windows, aj keď na IA-32 bežia aj iné populárne OS, ako napríklad Novell file servers a UNIX-based ako GNU/Linux, či BSD. Aj keď za poseldných pár rokov bolo vyvinutých plno vylepšení procesorov platformi IA-32, veľa funkcií zostáva spoločných pre všetky IA-32 procesory. Vlastnosti, ktoré boli opísané v tejto kapitole sú jadrom (základ) všetkých assemblerovských programov pre IA-32. Napriek tomu znalosť špeciálnych vlastností daného typu procesora môže zrýchliť chod vašich assemblerovských programov veľmi pekne. Táto časť opíše rôzne procesory IA-32 a ich špeciálne vlastnosti, ktoré by mali byť brané do úvahy pri programovaní kódov pre ne.
-= Intel Procesory =-
Intel je hlavným dodávateľom procesorov pre IA-32 platformu. V súčasnosti je najpoužívanejšou platformou Pentium. Je neobvyklé stretnúť sa so starším hardwareom ako napríklad 80486.
Nanešťastie niekoľko rôznych typov procesorov Pentium je ešte stále aktívnych v obchode (bussines), školách a aj v domácnostiach. Vytváranie assemblerovských programov, ktoré používajú advanced vlastnosti IA-32 dostupné len v nových modeloch môže dosť znížiť predajnosť vašich produktov. Na druhej strane vedomosť o cieľovej architektúre procesora, pre ktorý je vaša aplikácia písaná, môže za pomoci použitia špeciálnych vlastností tohoto procesora dodať rýchlosť vašej aplikácii a vykúriť tak konkrucenciu.
Táto časť opisuje rôzne typy procesorov Pentium bežne dostupných v pracovných staniciach a serveroch a zdôrazňuje vlastnosti ktoré sú pre daný procesor dostupné.
-= The Pentium processor family =-
Základom je samozrejme procesor Pentium. Prvý krát bol predstavený v roku 1993 ako náhrada za 80486. Bol to prvý procesor ktorý mal v sebe zahruntú dual execution pipeline a bol to prvý procesor, ktorý využíval plnú 32-bitovú adresu a 64-bit internal data path.
Aj keď výhody rýchlosti procesora Pentium boli očividné tak z hladiska programovania nepriniesol nič nové nad rámec 80486. Všetky registre a inštrukčné kódy zostali rovnaké ako pri 80486 a to vrátane podpory internej FPU.
-= The P6 processor family =-
Táto rodina bola predstavená v roku 1996 a to procesorom Pentium Pro. Ten obsahoval úplne novú architektúru oproti procesoru Pentium. Procesory P6 boli prvé, čo používali superscalar microarchitecture, ktorá veľmi zvýšila performance tým, že poskytla niekoľko execution units a instruction prefetch pipelines.
Pentium MMX a Pentium II procesory, boli prvé procesory ktoré použili MMX technológiu, a aj nové low-power stavy, ktoré umožňujú procesoru dať sa do stavu sleep keď idluje. To pomohlo šetriť energiou a stalo sa to ideálnou platformou pre laptopy.
Procesor Pentium III bol prvý čo obsahoval SSE technológiu, čím umožnnil programátorom používať zložitú floating-point aritmetiku rýchlo a ľahko.
-= The Pentium 4 processor family =-
Bol predstavený v roku 2000 a opäť začal nový trend v dizajne mikroprocesorov. Používa Intel Netburst architektúru ktorá poskytuje extrémne rýchle spracovanie použitím instruction pipeline, out-of-order execution core a execution units. Procesor Pentium 4 podporuje SSE3 - vylepšená verzia technológie SSE ktorá implementuje dodatočné operácie s plávajúcou desatinnou čiarkou a podporuje high-speed multimedia výpočty.
-= The Pentium Xeon processor family =-
V roku 2001 bol predstavený procesor Pentium Xeon. Primárne je určený pre multiprocesorové servre. Podporuje MMX, SSE, SSE2 a SSE3 technológie.
-= Non-Intel processors =-
Zatiaľ čo IA-32 platforma je často považovaná za vec Intelu, existuje veľa iných neIntelovských procesorov na trhu, ktoré implementujú vlastonsti IA-32. Je možné že váš assemblerovský kód bude určený pre neintelovskú platformu, preto je dobré poznať niektoré rozdieli medzi nimi.
-= AMD Processors =-
Dnes je najväčším konkurentom intelu AMD. AMD vydalo konkurenčný chip pre každý typ procesora Pentium. Nie je ťažké naraziť na AMD procesor na workstationoch s Windowsom. Nasledujúca tabuľka zobrazuje históriu procesorov AMD:
AMD Procesor | Intel ekvivalent | Poznámky |
K5 | Pentium | 100% softwareovo kompatibilné |
K6 | Pentium MMX | Pentium s plnou podporou MMX |
K6-2 | Pentium II | Používa 3D Now technológiu |
K6-III | Pentium III | |
Athlon | Pentium 4 | |
Athlon XP | Pentium 4w/SSE |
Pre programátorov v assembleri možno najdôležitejší rozdiel medzi AMD a Intel badať pri použití SIMD technológie. AMD plne skopírovalo (duplicated) MMX technológiu, no neskopírovale plne SSE technológiu. Intel predstavil SSE v procesore Pentium II. AMD sa vydalo inou cestou. Procesor AMD K6-2 používa rozdielnu SIMD technológiu zvanú 3D Now. Tá používa podobné registre a dátové typy ako SSE ale nie je s ňou softwareovo kompatibilná. Toto spôsobuje ťažkosti pre programátorov programov s SSE funkciami, kde je potrebná vysoká rýchlosť spracovania.
S vypustením Athlon XP procesora v roku 2001, AMD už podporuje SSE integer aritmetiku. V dobe písania tohoto článku už najnovší čip AMD plne podporuje SSE technológiu.
-= Cyrix processors =-
Aj keď už firma Cyrix nie je niekoľko rokov na trhu, jej procesory pre platformu IA-32 sa ešte stále nájdu na niektorých pracovných staniciach a low-end serveroch. Je stále možné naraziť na procesor Cyrix.
Evolúcia procesorov Cyrix odzrkadľovala Intelovské procesory po mnoho verzií. Prvý procesor, konkurent procesora Pentium, sa oficálne volal 6x86 procesor. Je 100 percentne softwareovo kompatibilný s procesorom Pentium. Keď Intel prišiel s MMX, Cyrix pustil procesor 6X86MX (nemali licenciu na to aby ho volali MMX ale MX bolo dostatočne blízko).
Keď Cyrix predali spoločnosti Via chipset company, pôvodná línia procesorov Cyrix bola premenovaná. Procesor 6x86 bol nazvaný M1 a procesor 6x86MX bol nazvaný M2. Tieto procesori si udržali kompatibilitu so zodpovedajúcimi procesormi rady Pentium.
Pred skončením vývoja Cyrixovských procesorov sa dostala ešte jedna finálna verzia na trh. Cyrix III, bol kompatibilnýs procesorom Pentium III. Nanešťastie, podobne ako pri AMD a jeho 3D Now, nebol kompatibilný s assemblerovskými programami písanými pre SSE.
-= Summary =-
Predtým, než začnete písať assemblerovský kód musíte vedieť, na akom procesory bude spúšťaný. Najpopulárnejšia platforma dnes je IA-32. Táto platforma zahŕňa procesory Intel Pentium a AMD Athlon. Vlajkovou loďou platformy IA-32 je procesor Intel Pentium 4. Používa technológiu NetBurst na rýchle a jednoduché spracovanie dát a inštrukcií. Jadro NetBurst architektúry tvorí control unit, execution unit, registre a príznaky.
Control unit kontroluje, ako execution unit spracováva inštrukcie a dáta. Rýchlosť sa dosahuje prefetchom a dekódovaním inštrukcií z pamäte ešte predtým, než ich spracuje execution unit. Inštrukcie môžu byť taktiež spracovaná v out-of-order a výsledky uložené, až kým ich aplikácia nebude potrebovať.
Execution unit v procesore Pentium 4 má schopnosť spracovávať súbežne niekoľko inštrukcií. Jednoduché procesy s celými číslami sú vykonávané rýchlo a uložené v oblasti out-of-order v control unit, až kým nie sú potrebné. Complex integer and floating point processes are also streamlined to increase performance.
Registere sa používajú ako lokálne úložiská dát v procesore, aby sa predišlo nákladnému prístupu do pamäte. Platforma IA-32 má niekoľko registrov na všeobecné použitie, pre uloženie dát a pointrov počas vykonávania programu. Inštrukcie sú čítané z pamäte na základe hodnoty v instruction pointer registry. Kontrolné registre ovládajú správanie sa procesora. Špeciálny register obsahuje niekoľko príznakov, ktoré určuju stav a vykonávanú operáciu procesora. Každý príznak reprezentuje inú operáciu vykonanú procesorom. Príznaky stavu (status flags) indikujú výsledok operácie (t.j. nie operáciu samotnú) vykonanej procesorom. Kontrolné príznaky určujú, ako sa má procesor správať pri určitých operáciách. Systémové príznaky určujú správanie sa operačného systému a programátor bežných programov by sa ich nemal chytať.
Inovácia v IA-32 platforme je živá a dobrá. Mnoho nových vlastností bolo predstavených v jednotlivých vydaniach procesorov. Floating Point Unit bola zahrnutá do procesora Pentium na pomoc pri matematických operáciách s plávajúcou desatinnou čiarkou.
Single Instruction Multiple Data (SIMD) technológia umožňuje spracovanie veľkých hodnôt, ako celočíselných tak aj floating-point a pomáha pri zložitých matematických operáciách. Tehcnológia MMX umožňuje programátorom použiť 64bitové celé čísla v high-precision integer výpočtoch. Naväzujúca technoĺogia SSE umožňuje programátorom použiť 128 bitové single precision floating-point hodnoty a následne SSE2 128-bitové double precision floating point hodnoty. Tieto dátové typy ohromne zrýchlili spracovanie matematicky náročných programov, akými sú napríklad spracovnie multimédií a digital signal processing.
Keď píšete program pre IA-32 platformu, mali by ste si byť vedomí rozdielov medzi procesormi a aké poskytujú možnosti. Jadrom platformy IA-32 je pôvodný procesor Pentium. Podporuje základné IA-32 registre a inštrukčné sady, a aj jediná vstavaná FPU. Podobne ako procesor K5 od AMD a procesor 6x86 od Cyrix. Každý z týchto procesorov je na 100% kompatibilný s IA-32 inštrukčnou sadou.
Intel predstavil technológiu MMX v procesoroch Pentium II. Nasledovalo ho AMD s K6 a Cyrix s 6x86MX. Všetky tieto procesory obsahujú registre MMX a dodatočnú inštrukčnú sadu pre MMX.
Technológia SSE je bod keď sa veci v IA-32 skomplikovali. Pentium II implementoval SSE s príslušnými registrami a inštrukčnou sadou no ostatní výrobcovia neboli schopní zahrnúť SSE do svojich procesorov. Namiesto toho AMD a Cyrix implementovali 3D Now technológiu do ich K-6 (AMD) a Cyrix III (Cyrix) procesorov. Technológia 3D Now poskytuje také isté 64bitové celočíselné dátové typy ako SSE, ale inštrukčné kódy sú rôzne.
V dobe písania tejto knihy je vlajkovou loďou Intelu Pentium 4. Podporuje SSE3 a Netburst technológiu. Rivalom od AMD je Athlon XP, ktorý už podporuje SSE aj s inštrukciami a je teda softwareovo kompatibilný s Pentium 4 procesorom.
------------------------------------
Moja poznámka na záver
V knihe nájdete taktiež vysvetlené, aké inštrukcie sa používajú pri práci s MMX a SSE pri použití GNU assemblera. Kniha vysvetľuje použitie debuggera a profilera pre assmblerovský kód a používa syntax AT&T. Hovorí a zameriava sa na použitie assemblera v Linuxe. Vysvetľuje, ako sa správajú funkcie jazyka C pri použití prekladača gcc z pohľadu dissasemblovaného kódu. Taktiež hovorí čosi o tom, ako používať Linuxové systémové volania cez preušenie 0x80 (niečo čo sa v DOSe robilo volaním prerušenia 0x21 ak sa nemýlim). Posledná kapitola je určená advanced IA-32 fičúram a učí ako ich použiť. No a samozrejme kopec ďalších vecí.
Existuje - z ohľadom na problematiku programovania v assembleri ešte jedna kniha (Kníh a tutorialov existuje veľa, hovorím skor o knihe, ktorá mi niečo dala), ktorá sa volá Assembly Language Step-by-Step Second Edition, Programming with DOS and Linux od pana Jeff Duntermann-a, ISBN 0-471-37523-3. Tá je staršia z roku 2000. Tá, z ktorej časť som preložil, je z roku 2004, ale používa netwide assembler syntax (intelovský).
Hľadal som už dávnejšie oficálnu knihu pre programovanie v assembleri vo Windowse, no nič som nenašiel. Tie 2 knihy, čo som tu spomenul, sa vystríhajú Windowsu a tá druhá dokonca tvrdí, že keď je niekto taký masochista, že sa chce pustit do bordelu, aký je v OS Windows, tak nech sa páči a veľa šťastia.
To, čo ma zaujímalo v podstate bolo:
- Windows Portable Executable formát, čiže EXE (linka na wordovský dokument)
- Windows Authenticode Portable Executable Signature Format, čiže spôsob podpisovania aplikácií vo windowse - trusted application (linka na wordovský dokument)
V zátvorke sú ovedené linky na plné znenie špecifikácie, tak ako to uvolnil Microsoft. Po odsúhlasení sa stiahne DOCX. To, čo ma naposledy zaujalo, bol článok od pána Matta Pietreka - An In-Depth Look into the Win32 Portable Executable File Format, publikovaný na MSDN (zdroj tu).
Porovnanie x86_32 a x86_64 možno nájsť na wikipedii.
Vyborny clanok daco take som presne potreboval diky :)
Neviem, ci to bolo prekladom (ale podla tej jednej dlhej vety, co tam bola uvedena, je preklad doslovny), alebo je to v knihe, ale nicim, co je v tejto knihe napisane, by som sa radsej neriadil. Vcelku by ma zaujimali referencie autora knihy, co robil a kde pracoval, pretoze bud nevie pisat, alebo platforme x86 vobec nerozumie... ale najskor to bude kombinacia oboch.
Errata toho povodneho clanku by mozno boli dlhsie, ako tento preklad.
---
Cuchat s nadchou, to je ako sniffovat bez promiscu.
Bohuzial, ventyl ma pravdu, naozaj mam z toho pocit ako keby autor alebo prekladatel velmi nerozumeli tomu o com pisu. Chyb je tam az-az. Ale aj tak je to viac k veci ako prva cast, dajme tomu ze ako uvod do ASM programovania vcelku posluzi aj toto.
Hľadal som už dávnejšie oficálnu knihu pre programovanie v assembleri vo Windowse, no nič som
nenašiel.
No, mam pocit ze existuje Win32 verzia Art of Assembly od Randalla Hyde-a. Akurat ta kniha je dost kruto "vysokoskolska", je tam hrozne vela teorie kym sa dostane k veci. Ale narozdiel od toho co citam tu, to co tam je napisane je aj pravda a pisal to clovek co uz ma svoje v assembleri odprogramovane. Len autor je trochy taky... ehm (mal som tu cest par razy s nim "diskutovat"), odkedy si vymyslel svoj vlastny "high level assembler" (HLA) tak ho vsade za kazdu cenu pretlaca. Doporucil by som radsej tu staru MASM verziu knihy.
Tie 2 knihy čo som tu spomenul sa vystríhajú Windowsu a tá druhá dokonca tvrdí, že keď je niekto taký masochista, že sa chce pustit do bordelu aký je v OS Windows, tak nech sa páči a veľa šťastia.
Programoval som v assembleri vo Windovse aj v linuxe, a mozem povedat ze v linux-e je prostredie na programovanie v assembleri horsie snad po vsetkych strankach:
- nemas systemove headery (pre MASM existuju uz davno tie co vytvoril Hutch, tzv. MASM32, pre linux len dost nedavno vzniklo nieco dost nekompletne pre FASM a GAS - lscr). aj celkova podpora pre linux v assembleri je v podstate nulova
- linux nema binarny interface (ABI), moze sa kludne stat ze nebudu sediet velkosti
- v linuxe sa tazsie vola libc (treba dynamicke linkovanie atd.), vo windofse je takpovediac defaultne. v praxi vecsina ludi v linuxe vola rovno syscally, co je ale o dost tazsie a menej dokumentovane
- v linuxe je defaultny assembler GAS, ktory je strasne uchylny (http://x86asm.net/articles/what-i-dislike-about-gas/index.html <- anglictinu som mal vtedy hroznu)
... atd ...
To ich tvrdenie sa da mozno vysvetlit tak ze autori sa odvolavali na serie Win9x, nie na NT serie. Tam to bolo naozaj take vselijake, aj ked pre obycajnu user-mode aplikaciu ten rozdiel nebol moc vidiet. Skor ide o klasicky linux zeal podla mna.
nieco, co sa vola GAS, nemoze byt normalne.
ale skutocny majstrovsky kusok humusu sa z toho stava az ked ho spojis s Cckom ako inline assembler... to uz atakuje aj simul.
---
Cuchat s nadchou, to je ako sniffovat bez promiscu.
Co ja viem, tam praveze sa mi zdal aj ked hnusny, ale kurva silny, tym ze narozdiel od MS Cecka tam mas k instrukciam vselijake flagy ktore to umoznuju efektivne miesat s C kodom. Ja som to teda nikdy nerobil, ale ak som to spravne pochopil, mozes kompilatoru povedat ktore registre pouzivas, do ktorych premennych pristupujes, atd., co umozni rozumnejsie optimalizovat okolie kodu. V tejto oblasti ho teda este beriem, pri tych par instrukciach v leaf procedurach je to naozaj jedno ci je syntax skareda alebo nie.
to sice nepopieram, kazdopadne sa to tam zapisuje pravdepodobne jednym z najhorsich moznych formatov, ktory si pre ten zapis mohli vybrat. ja radsej vzdy ked vidim kus inlineoveho asm skrze gas, tak ten kus kodu preskakujem. bojim sa, ze by som si na tom zlomil mozog.
---
Cuchat s nadchou, to je ako sniffovat bez promiscu.
To aj ja, ale zvycajne kvoli tomu ze nepoznam vyznam tych flagov pre kompilator :) GAS syntax som sa uz naucil, je sice extra hnusna (historicke dovody preco je taka aka je chapem, ale dnes je to uz fakt prezitok), ale zase ked je to par riadkov v leaf procedure tak by som to obetoval za tie vyhody tych flagov. V tomto MS Visual C fakt zaostava (aspon teda neviem ze by take nieco podporoval).
Pozrel som si tu druhu knihu, hovori o 95 a 98. A az potom zacal zvazovat alternativy: Linux, konzola v NT, DOS v protected mode. Na konci pre 95 a 98 dodal vety "Good luck. Heh-heh. You will need it."
Blum a jeho literatura:
PostgreSQL 8 for Windows (©2007)
Professional Assembly Language (©2005)
Network Performance Toolkit: Using Open Source Testing Tools (©2003)
C# Network Programming (©2002)
Open Source E-mail Security (©2001)
Postfix (©2001)
Running qmail (©2000)
Sendmail for Linux (©2000)
Hodnotania jeho knih na Amazon najdes tu. Vsetky maju 4-5 hviezdieciek z 5tich - aj ked je otazne nakolko je to relevantne pri 18 ludoch co knihu hodnotilo. O texte a o knihe sa dozvies viac ked kliknes na jej meno.
major_kusanagi
/* no comment */
Na konci pre 95 a 98 dodal vety "Good luck. Heh-heh. You will need it."
A ja zase tvrdim ze zaciatocnik rozdiel medzi asm kodenim pre NT a 9x nespozna. Ovela evidentnejsi by bol rozdiel medzi Win a Linux, v neprospech linuxu (samotne programovanie je rovnake, ale v linuxe je k tomu nulova podpora, ako som spominal).
ako som ti uz napisal do query. pre mna je dostatocnym hodnotenim tej knihy to, ze si si precital knihu o assembleri na x86 (o ktorej hovoris, ze by mala fungovat ako ucebnica) a pritom ani nevies, ako kedy a kde funguje segmentacia (a ked si to myslis, za 5 sekund ti dokazem, ze nie).
---
Cuchat s nadchou, to je ako sniffovat bez promiscu.
Prisiel som na to (pocitil) o com hovoris. Tu IA-32 si pozriem este raz a poriadne z relevantneho zdroja. Prave totizto samaelovi vysvetlujem preco jeho clanok nie je dobry a z toho co som tam napisal mi pride ze si mal takky isty pocit ty o mojom clanku :-)
major_kusanagi
/* no comment */
ak ti mozem odporucit, pozri si najprv povodne x86 (8086), potom hacky v 80286 a tak skoc na 386+ (tak popularne nazyvane IA32). Znalost real mode programming-u sice nie je pre assemblering v protected mode bezpodmienecne nutna, ale aspon ti spravi poriadok v hlave s tou segmentaciou, ktoru ti tam ta kniha zasiala.
Navyse, ziskas presny pohlad na to, ako MMU na Inteli pracuje, takze nebudes mat taky velky zmatok v adresovacich a pseudoadresovacich rezimoch, ako teraz :)
Celkom dobre je to popisane v intelich referencnych manualoch, bohuzial ten je rozdeleny na userspace programmera a system programmera, pricom realny programator assemblerovskych veci potrebuje nieco medzi tym. A neviem, ako Pentium a vyssie, ale 386tkovy referencny manual nejako moc nepocita s tym, ze by sa segmentacia nepouzivala.
---
Cuchat s nadchou, to je ako sniffovat bez promiscu.