Programování v asembleru - prostředí Jakub Yaghob
Motivace Dříve Nyní Rychlejší a menší kód Přístup do „přízemí“ Obtížné programování Není přenositelné (procesor, překladač, OS) Nyní Ruční kód horší než generovaný (složitost CPU) Obtížné programování Rozvoj aplikací jednočipů GPU se programují v „asembleru“
Obsah přednášky Aplikační prostředí vybrané současné architektury Instrukční soubor Vybraný asembler Historie mikroprocesorů a architektur Navazující přednáška „Systémové architektury mikroprocesorů“
Současné a nedávné architektury IA-32 Intel, dříve nejrozšířenější, dnes postupně nahrazována AMD64 IA-64 Intel, zcela odlišná od IA-32, servery, upadá v zapomnění AMD64/Intel 64 (EM64T) AMD, rozšíření IA-32, přidal se po čase i Intel, dnes nejrozšířenější SPARC Sun, servery, už se nevyrábí PA-RISC HP, servery, už se nevyrábí PPC IBM, velmi výkonná, servery, Cell ARM Není přímo vlastněna firmou, výhodný poměr výkon/příkon – mobilní zařízení
Historie IA-32 – I 8086, 8088 16-bitová data, 20-bitová adresace 80286 chráněný režim, 24-bitová adresace Intel 386 1985, první zástupce IA-32 32-bitová data, 32-bitová adresace stránkování, pipeline (6 stupňů)
Historie IA-32 – II Intel 486 1989 rychlá pipeline (5 stupňů) L1 cache 8KB na čipu integrovaný x87 FPU SMM
Historie IA-32 – III Pentium 1993 dvojitá pipeline (u a v) L1 cache 8KB data, 8KB kód MESI protokol pro cache rozšíření stránkování (4MB) BTB APIC MMX (později)
Historie IA-32 – IV P6 (Pentium Pro, Pentium II, Pentium III) 1995 třícestně superskalární dynamické vykonávání (microdataflow analysis, out-of-order execution, branch prediction, speculation execution) přidána 256KB L2 cache 36-bitová fyzická adresa MMX (Pentium II), SSE (Pentium III) Celeron, Xeon
Historie IA-32 – V Pentium 4 2000 NetBurst (rapid execution engine, hyper pipelined technology, advanced dynamic execution) SSE 2/SSE 3 HyperThreading
Historie IA-32/Intel 64 – VI Core Duo/Core Solo 2006 2/1 jádra Smart Cache Core 2 Duo, Core 2 Quadro 2/4/6 jádra Intel 64, virtualizace Nová mikroarchitektura SSE 4.1
Historie IA-32/Intel 64 – VII Core i7/i5/i3 2008 4 jádra Nová mikroarchitektura zaměřená spíše na servery Integrovaný paměťový řadič, QPI (Quick Path Interconnect), opět Hyper-threading SSE 4.2
Historie IA-32/Intel 64 – VIII Core i7/i5/i3 – 2nd generation (Sandy Bridge) 2011 Nová mikroarchitektura GPU u CPU AVX Turbo Boost RDRAND (Ivy Bridge)
Historie IA-32/Intel 64 – IX Core i7/i5/i3 – 3rd generation (Haswell) 2013 Nová mikroarchitektura AVX2, FMA3, gather, bit manipulation Transakční paměť
Intel 64/AMD64 Prodloužení agonie IA-32 64-bitový plochý (flat) adresový prostor 8 přidaných obecných registrů 8 přidaných registrů pro SSE 64-bitové obecné registry a ukazatele Jednotné bytové adresování v registrech Relativní adresace vůči ukazateli instrukcí
P6 mikroarchitektura
NetBurst mikroarchitektura
Core i7 prostředí
Výpočetní prostředí IA-32 – I Adresový prostor Lineární adresový prostor 4GB (32 bitů) Fyzický adresový prostor 64GB (36 bitů) Základní registry 8 „obecných“ registrů (32 bitů) Dělení na menší (16 a 8 bitů) 6 segmentových registrů (16 bitů) Příznakový registr EFLAGS (32 bitů) Ukazatel instrukcí EIP (32 bitů)
Výpočetní prostředí IA-32 – II x87 FPU registry 8 datových (80 bitů) Řídící, stavový a tag registry (16 bitů) x87 FPU ukazatel instrukce, ukazatel dat Registr operačního kódu MMX 8 MMX registrů (64 bitů)
Výpočetní prostředí IA-32 – III XMM 8 XMM registrů (128 bitů) Registr MXCSR YMM Rozšíření XMM na 256 bitů pro AVX Zásobník V paměti Podpora pro volání funkcí a předávání parametrů Roste směrem k nižším adresám
Výpočetní prostředí Intel 64 Podobné IA-32 až na následující změny Adresový prostor Lineární adresový prostor teoretický 264 Lineární adresový prostor skutečný 248 Fyzický adresový prostor 240 Rozšíření základních registrů (kromě segmentových) na 64-bitů, přejmenování s předponou R (např. RAX, RIP) Přidání 8 základních registrů Přidání 8 XMM/YMM registrů
Obecné registry IA-32 EAX střadač EBP ukazatel na data do zásobníku EBX ukazatel dat ESI zdroj řetězcových operací ECX čítač EDI cíl řetězcových operací EDX obecný registr (ukazatel I/O) ESP ukazatel vrcholu zásobníku
Obecné registry Intel 64
Segmentové registry IA-32 Obsahují 16-bitové selektory CPU je stále používá, nelze je „vypnout“ CS – kódový segment Instrukce čtena z CS:EIP DS, ES, FS, GS – datové segmenty SS – zásobníkový segment Vrchol zásobníku na SS:ESP
Segmentové registry Intel 64 Segmentace téměř zrušena CS, DS, ES, SS mají začátek segmentu 0 a jsou přes celý adresový prostor FS, GS jsou přes celý adresový prostor, ale začátky segmentu jsou platné a používají se Výjimka vynucená systémem Windows TLS
Paměťové modely IA-32 – I Flat model Dnes běžně užíván OS
Paměťové modely IA-32 – II Segmentovaný model Dřívější OS
Registr příznaků – I
Registr příznaků – II CF – carry flag PF – parity flag Přetečení, přesuny při rotacích PF – parity flag Parita na nejnižších 8 bitech AF – adjust flag Přetečení z nižších 4 bitů ZF – zero flag Výsledek je 0 SF – sign flag Nejvyšší bit výsledku = znaménko OF – overflow flag Přetečení ve znaménkové aritmetice DF – direction flag Směr řetězcových operací
Operandy instrukcí – I Operandy Přímý operand Implicitní – předem dány instrukcí Explicitní – zapsány u instrukce (i tak někdy neortogonální) U dvojoperandových instrukcí zápis zprava do leva (pozor na GNU asm!!!) OPER dst,src dst = dst OPER src Přímý operand Číslo ADD EAX,14
Operandy instrukcí – II Registrový operand Základní registry (bez EIP) (32, 16, 8 bitů) X87 FPU, MMX, XMM registry Systémové registry Adresa I/O Přímý operand (jen 8 bitů) OUT 20,AL Registr DX IN AL,DX
Operandy instrukcí – III Paměťový operand Paměť vždy adresována segmentovým selektorem a posunem v segmentu Posun v segmentu určen adresovým výrazem Offset = [Base] + [Index [* Scale]] + [Displacement]
Operandy instrukcí – IV Výběr segmentového selektoru Explicitně – zapsán před instrukcí jako prefix, kromě: Instrukce se vždy čtou z CS:EIP Cílový adresa řetězcových instrukcí vždy užívá ES Instrukce PUSH a POP vždy adresují zásobník přes SS MOV EAX,[ES:EAX+EDX*4+4] Implicitně – podle použití MOV EAX,[EBP+8] CS Čtení instrukcí SS Všechny operace se zásobníkem Bázový registr ESP, EBP DS Všechny odkazy na data, kromě výjimek ES Cíl řetězcových instrukcí
Datové typy Uložení v paměti Little endian Zarovnání v paměti na svoji velikost Quadword od i486 Double Quadword od Pentia III (SSE)
Formát instrukce IA-32 Prefixy ve skupinách LOCK, REPNE/REPNZ, REP/REPE/REPZ Segmentové prefixy, nápověda pro skoky (taken/not taken) Velikost operandu Velikost adresy
Formát instrukce Intel 64 Podobný jako pro IA-32 Přidány prefixy REX Defaultní velikost operandů zůstává 32 bitů kromě Blízkých skoků Instrukcí implicitně pracujících s RSP