360 likes | 452 Views
P rogramování v asembleru - prostředí. Jakub Yaghob. Motivace. Dříve 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) Přístup do „přízemí“
E N D
Programování v asembleru- prostředí Jakub Yaghob
Motivace • Dříve 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) Přístup do „přízemí“ Obtížné programování Není přenositelné (procesor, překladač, OS) 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 • SmartCache • Core 2 Duo, Core 2 Quadro • 2006 • 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í
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ů
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ů – II • CF – carry 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 • 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]
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