Kontakty Webpage přednášky: – Slajdy (MS PowerPoint): –ftp://ulita.ms.mff.cuni.cz/predn/PRG017 Technické informace (manuály ap.): –ftp://ulita.ms.mff.cuni.cz/techdoc/index.html Mail:
Programování v asembleru: + & - Historicky: +rychlost, efektivita kódu +přístup „do přízemí“ –složitost –obtížná udržovatelnost, rozšiřitelnost –nulová přenositelnost Aktuální stav: –rychlost, efektivita kódu ±přístup „do přízemí“ –složitost –obtížná udržovatelnost, rozšiřitelnost –nulová přenositelnost
Asemblery pro Intel x86 MASM (Microsoft): –„klasický“ asembler (alespoň v MS - DOS, Win - prostředí) –ve zmíněném prostředí de-facto standard podpora např. i od překladačů VPJ (inline asm, volací konvence atd.) –nepříliš přehledný, z výukového hlediska dost nevhodný víceznačné konstrukce ap. TASM (Borland): –mód kompatibility s MASMem –nový mód činnosti (IDEAL), který odstraňuje některé z nedostatků MASMu –není tak rozšířený jako MASM NASM (public-domain): –má blízko k TASMu (IDEAL módu) –zadarmo –silný a „čistý“ makroprocesor –postrádá některé užitečné konstrukty –! záludné nekompatibility s TASMem
Struktura asemblerského kódu Zjednodušeně: –asembler = user-friendly hex feeder –asm kód představuje nejnižší rozumnou úroveň programování –jde vlastně o přímou definici obsahu paměti Př.: int fce(int a, int b)DATASEG {_cntDD10 static int cnt=10;CODESEG _fce:moveax,[esp+4]; a int p;shleax,2; a*4 p = glob+a*4;addeax,[_cnt] return p-b;subeax,[esp+8]; -b }ret
Struktura asemblerského kódu II Z jazykového hlediska se v asemblerském kódu vyskytuje několik tříd konstruktů: –popis instrukcí procesoru umožňují zápis instrukcí procesoru v lidsky srozumitelné formě shl[_pole+ebx*4], 2 moveax, [es:ebx+2*ecx] –direktivy asembleru řídí činnost asembleru (překladače) ALIGN 4 EXTERN_pole: BYTE speciálním případem jsou direktivy pro emisi dat _poleDB128 DUP (?) –direktivy preprocesoru rozšiřují možnosti asembleru o konstrukty pro zpracování textu (include, macro,...) INCLUDE “header.inc”
Struktura asemblerského kódu III Asembler má přísnější požadavky na formát zdrojového textu než např. většina VPJ: –každá řádka zdrojového textu odpovídá následujícímu schématu: [ :] [ ] [ ] [; ] –Všechny tři výše zmíněné kategorie konstruktů jsou podřízeny tomuto schématu Produkovaný kód a data jsou organizovány do tzv. logických segmentů (sekcí) –umožňují přizpůsobení kódu požadavkům OS (např. oddělení kódu od dat ap.) –umožňují použitelnost i na složitějších architekturách (např. segmentovaných) –zjednodušují a zpřehledňují kód
Překlad Překlad kódu probíhá v několika fázích: –preprocesor (preprocess) zajistí vyhodnocení preprocesorových direktiv probíhá na čistě textové úrovni (Unixové asemblery a preprocesory) je do jisté míry ovlivněn a podřízen struktuře a syntaxi asembleru (DOS-Windows asemblery) –vlastní překlad (assemble) zajistí překlad mnemonik instrukcí do binární formy vyhodnotí symbolické adresy je řízen direktivami v kódu –spojování (link) - někteří guru používají český termín zlinkování zkombinuje binární relokovatelný výstup(y) předchozí fáze překladu do výsledného binárního souboru vyřeší relokace (mezimodulové odkazy), které zůstaly z fáze překladu
Překlad II (pp) SRC asm OBJ link EXE Modul A Sekce TEXT Sekce DATA Sekce BSS Modul B Sekce TEXT Sekce PRIVDATA Modul C Sekce TEXT Sekce DATA Sekce PRIVDATA OBJ Modul A Sekce TEXT Sekce DATA Sekce BSS OBJ Modul B Sekce TEXT Sekce PRIVDATA OBJ Modul C Sekce TEXT Sekce DATA Sekce PRIVDATA EXE... Sekce TEXT Sekce A:TEXT Sekce B:TEXT Sekce C:TEXT Sekce DATA Sekce A:DATA Sekce C:DATA
Př.: „Hello world“ I TESTMAIN.ASM: IDEAL MODELsmall, C CODESEG EXTRNreverse:PROC movds,ax movch,0 movcl,[es:80h]; UPA len movebx,81h; UPA leaedi,[buffer] callreverse
Př.: „Hello world“ II TESTMAIN.ASM (pokr.): mov[BYTE ds:edi],’$’ leaedx,[buffer] movah,09h int21h; print moveax,4C00h int21h; exit DATASEG bufferDB128 DUP (?) STACK512 ENDstart
Př.: „Hello world“ III TESTREV.ASM: IDEAL MODELsmall, C PUBLICreverse CODESEG reverse:addebx,ecx lp:decebx moval,[es:ebx] mov[ds:edi],al incedi dececx jnzlp ret END
Př.: „Hello world“ IV Postup kompilace (TASM): –> TASM /zi testmain –> TASM /zi testrev –> TLINK /v testmain testrev, test