Programování v asembleru - TASM

Slides:



Advertisements
Podobné prezentace
A1PRG - Programování – Seminář Ing. Michal Typová konverze, oblast platnosti, paměťové třídy 9 Verze
Advertisements

Standardní knihovní funkce pro práci s textovými řetězci
VISUAL BASIC Práce s řetězci Použitá literatura: Kvoch: Visual Basic 4.
Programování v C jazyku - SEMINÁŘ
Počítače a programování 1 Přednáška 13 Jiří Šebesta.
Dynamické dokumenty na straně klienta Informatika pro ekonomy II.
Programovací jazyk C++
Programování v asembleru - multiprocesory Jakub Yaghob.
Programování funkcí v Excelu
Programování v Pascalu
25/08/20141 Typ struktura (1) Datový typ struktura ( struct ) je agrego- vaný heterogenní datový typ Jedná se o skupinu několika proměnných, které mohou.
Programovací jazyky Programovací jazyky jsou jazyky sloužící k tvorbě počítačových programů Dělení:  nižší  vyšší jazyky primitivní, jejichž instrukce.
Programování v Pascalu Přednáška 3
C# pro začátečníky Mgr. Jaromír Osčádal
Programování v C++ Cvičení.
Principy překladačů Běhová podpora Jakub Yaghob. Běhová podpora Statická podpora jazyka Překladač Interface na knihovny Hlavičkové soubory Dynamická podpora.
Principy překladačů Mezikód Jakub Yaghob.
Algoritmizace a programování
Druhé cvičení Vytváření identifikátorů Datové typy
Programování v Pascalu Přednáška 7
Programování PA - 2.
Materiály k přednášce Úvod do programování Ondřej Čepek.
Generování mezikódu Jakub Yaghob
Kontakty Webpage přednášky: – Slajdy (MS PowerPoint): –ftp://ulita.ms.mff.cuni.cz/predn/PRG017 Technické.
J a v a Začínáme programovat Lucie Žoltá. Odkazy - oficiální stránky (překladače, help, metody, vývojové prostředí NetBeans,...)
8. přednáška typedef - preprocesor Studijní materiály najdete na adrese:
Informatika I 3. přednáška
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro práci se soubory 13 Verze
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
AVR Assembler Symboly Návěští
Sémantická analýza Jakub Yaghob
Datové typy a práce s nimi
Počítače a programování 1
3. Příkazy  Příkazy dělíme na jednoduché a strukturované.  Jednoduché příkazy - žádnou jejich dílčí částí neni příkaz - přiřazovací, vstupu a výstupu,
VISUAL BASIC PRALG.
Datové typy a struktury
Programovací jazyk PASCAL
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Kontakty Webpage přednášky: – Slajdy (MS PowerPoint): –ftp://ulita.ms.mff.cuni.cz/predn/PRG017 Technické.
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
Pokročilé programování v C++ (část B)
JUI přednáška Vstup a výstup, cykly RNDr. Jiří Dvořák, CSc.
Datové typy a operátory. Co jsou datové typy  Charakterizují proměnnou nebo konstantu – jaká data obsahuje  Data jsou v počítači ukládána jako skupiny.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
4. Typ pole 4.1 Jednorozměrná pole
Programování v JSA.
Roman Nasadil – ME4C PROGRAMOVÁNÍ V JSA. CO TO JE JSA?
Kontakty Webpage přednášky: – Slajdy (MS PowerPoint): –ftp://ulita.ms.mff.cuni.cz/predn/PRG017 Technické.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Kontakty Webpage přednášky: – Slajdy (MS PowerPoint): –ftp://ulita.ms.mff.cuni.cz/predn/PRG017 Technické.
Pokročilé datové typy (struktury, unie, dynamické proměnné)
CZ.1.07/1.5.00/ Využití ICT pro rozvoj klíčových kompetencí CZ.1.07/1.5.00/ Střední odborná škola elektrotechnická, Centrum odborné přípravy.
Překladače 1. Překladače a programovací jazyky © Milan Keršlágerhttp:// Obsah:
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY Datové typy a operátory Základní programové.
Překladače 6. Sémantická analýza
Programování ÚVOD, PROMĚNNÉ, OPERÁTORY A PODMÍNĚNÝ PŘÍKAZ ERIK KRÁL.
Programování v jazyce C++ Speciality jazyka C++, úvod do OOP.
Makra v Excelu syntaxe. Zápis nahraného makra SubEnd Sub O klíčová slova Sub a End Sub – začátek a konec makra O komentáře O text za znakem ', až do konce.
Typ struktura (1) Datový typ struktura (struct) je agrego-vaný heterogenní datový typ Jedná se o skupinu několika proměnných, které mohou mít různé datové.
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Výukový materiál zpracován v rámci projektu
Překladače Syntaktická analýza
Funkce výstupu (2) Funkce printf: deklarována v: stdio.h
Oblast platnosti identifikátoru (1)
Opakování základních příkazů a syntaxí v programovacím jazyce Pascal
Překladače 6. Sémantická analýza
C# přehled vlastností.
CU01 Informatika II 2/13 Základy algoritmizace
Transkript prezentace:

Programování v asembleru - TASM Jakub Yaghob

MASM Dodáván s VC „zdarma“ Jeden z nejstarších Intelský zápis instrukcí Téměř úplná podpora pro spolupráci s VPJ Nejednoznačné paměťové výrazy Minimální typová kontrola „Špatná“ interpretace segmentů uvnitř skupin segmentů Pouze MS Windows

NASM GNU licence - úplně zdarma Více OS Intelský zápis instrukcí Slabá podpora pro spolupráci s VPJ Jednoznačné paměťové výrazy Striktní typová kontrola Slabší makroprocesor

GNU Assembler GNU licence - úplně zdarma Více OS Vlastní zápis instrukcí

TASM Dodáván s produkty Borland „zdarma“ Intelský zápis instrukcí Úplná podpora pro spolupráci s VPJ (včetně objektů) Jednoznačné paměťové výrazy Striktní typová kontrola Pouze MS Windows

GoASM Volně dostupný, náhrada za NASM Intelský zápis instrukcí Podpora Intel 64 Jednoznačné paměťové výrazy Striktní typová kontrola Pouze MS Windows

Yasm Volně dostupný, náhrada za NASM Intelský zápis instrukcí i GAS zápis Podpora Intel 64 Jednoznačné paměťové výrazy Striktní typová kontrola Pro MS Windows i Unixy

Asembler při překladu .C .ASM CC ASM .OBJ LINK .EXE .LIB .ASM ASM .OBJ .C/inline ASM

Zdrojový soubor .ASM I. Řádkově orientovaný Návěští Case-insensitivity (Někdy i sloupcově orientované) Návěští Relativní adresy v segmentech Case-insensitivity Některá návěští sensitivní Komentáře Do konce řádku pomocí ; (Někdy i blokové komentáře)

Zdrojový soubor .ASM II. Instrukce Direktivy Makroprocesor Výrazy Generují kód Direktivy Řídí překlad Generují proměnné Makroprocesor Podmíněný překlad Jednoduchá makra - konstanty Složitá makra s parametry Výrazy Operandy instrukcí i direktiv

Segmenty v asembleru .code 0 MOV AL,CL 2 ADD AL,DL 4 .idata Logické části programu, které patří z různých modulů dohromady a z nichž každá má nějaké jiné vlastnosti Příklad: .code 0 MOV AL,CL 2 ADD AL,DL 4 .idata 0 S1 DB "bubak" 5 .udata 0 V1 DD ? 4 .code 4 MOV EAX,[V1] 9

Spojování segmentů Modul A CODE.A 558 CODE.A IDATA.A 216 558 CODE.B 558 CODE.A IDATA.A 216 558 CODE.B UDATA.A 4096 203 LINK IDATA.A 4312 IDATA.B Modul B 4412 8192 CODE.B 115 UDATA.A IDATA.B 100 8395 472 UDATA.B UDATA.B 250

Číselné konstanty Vždy začínají číslicí 0-9 Znakové konstanty: 'a' Různé číselné soustavy určené příponou Pokud chybí, použije se default určený direktivou RADIX, jinak 10 Přípony B, O/Q, D, H Příklady: MOV AL,0C8H AND EAX,10010010B CMP AL,FEH

Řetězcové konstanty Pouze v inicializacích Řetězce znaků uzavřené mezi apostrofy nebo uvozovky Příklady: DB ’bubak’ DB ”vetsi bubak” DB ’jeste vetsi’’bubak’ DB ’spatny bubak”

Adresové typy Jednoduché adresové typy Složité adresové typy UNKNOWN BYTE, WORD, DWORD PWORD, FWORD QWORD, TBYTE SHORT, NEAR, FAR PROC, CODEPTR, DATAPTR Složité adresové typy Struktury a unie Ukazatele [dist] PTR [addrtype]

Operátory – obecně Vyskytují se v: Přímé operandy instrukcí MOV EAX,10+1 Přímé operandy direktiv IF MOJEKONST EQ 2 Inicializace V1 DD 20*3 Adresové výrazy MOV EAX,[pole+EBX+10] Kromě adresových výrazů to jsou konstantní výrazy MOV EAX,EBX+1

Operátory – aritmetické Sčítání, odčítání U adresových výrazů mohou + a – určovat adresový mód +, - (binární, unární) Násobení, dělení *, /, MOD Priorita (, ) Příklady: MOV EAX,10+1 MOV EAX,[EBX+10] – adresový výraz

Operátory – logické Binární logické operace Unární logické operace AND, OR, XOR Unární logické operace NOT Posuny SHL, SHR Příklady: AND EAX,NOT ((1 SHL 16)-1)

Operátory – relační Příklady: IF MOJEKONST EQ 2 IF MOJEKONST = 2 EQual == EQ Not Equal != NE Greater Than > GT Greater or Equal >= GE Less Than < LT Less or Equal <= LE Příklady: IF MOJEKONST EQ 2 IF MOJEKONST = 2 IF MOJEKONST GE 2 IF MOJEKONST >= 2

Operátory – adresové Změna segmentu Posunutí a segment Příklady: : SEG OFFSET Příklady: MOV EAX,[ES:EBX+5] MOV AX,SEG MUJ_LABEL MOV EDX,OFFSET MUJ_LABEL ;=LEA EDX,[MUJ_LABEL]

Jiné operátory I. Reference položek struktur a unií Maska na bitové pole, položku bitového pole, výčtový typ MASK <jméno> Nastavení adresového typu typ [PTR] výraz typ LOW výraz, typ HIGH výraz Příklady: MOV AL,[BYTE EDX] MOV EAX,[(BOD EBX).X1] MOV AX,[BYTE LOW WORD HIGH V4B] ; 3.byte ze 4

Jiné operátory II. Aktuální pozice v segmentu $ Hodnoty definice proměnných ?, DUP Velikosti a počty LENGTH, SIZE Příklady: ARR DW 10 DUP(4 DUP(?),0) ; LENGTH=10 ; SIZE=50

Jiné operátory III. Druh výrazu Ukazatel na kód 4 Obsahuje registr 1 SYMTYPE Ukazatel na kód 4 Obsahuje registr 1 Ukazatel na data 5 Symbol je definován 2 Konstanta 3 Přímý adresový mód 7 Obsahuje externí sym. Příklady: IF (SYMTYPE &p1 AND 6) EQ 0 ; [EBX]

Priorita operátorů – Ideal TASM [], (), MASK, OFFSET, SEG, SIZE, LENGTH HIGH, LOW (ve výrazu) +, - (unární) *, /, MOD, SHL, SHR +, - (binární) EQ, NE, LT, LE, GT, GE NOT AND OR, XOR SYMTYPE : (změna segmentu) . (položka struktury) HIGH, LOW (v adrese), PTR, SMALL, LARGE, přetypování

Předdefinované symboly Jejich hodnota nastavena překladačem podle stavu překladu, stavu prostředí nebo použitých direktiv Stav prostředí ??time, ??date, @FileName, ??filename Stav překladu ??version, @Cpu Podle modelu @Model, @32Bit @CodeSize, @DataSize, @Interface Zjednodušené segmentové direktivy @code, @data, @curseg, @stack

Výčtový typ Deklarace: Chování Příklad: ENUM jméno [enum_var [,enum_var …]] var_name [=value] Chování Lze použít jako typ proměnné Ukládá na nejmenší počet bitů, kam se vejde Vytvořené hodnoty jsou redefinovatelné číselné hodnoty s globální viditelností Příklad: ENUM bool FALSE,TRUE

Typ bitového záznamu Deklarace: Chování Příklad: RECORD jméno [rec_field [,rec_field …]] field_name : width_expr [=value] Chování Délka typu je součet délek Podpora výčtového typu Příklad: RECORD dmareq chsel:2,rqbit:1,_res:5

Strukturované typy Deklarace: Rozdíly od některých VPJ STRUC <jméno> <položky struktury> ENDS [<jméno>] UNION <jméno> <položky unie> Rozdíly od některých VPJ Explicitní zarovnání (ALIGN n) Typová informace u ukazatelů Možnost anonymního vnořování Jména položek struktury viditelná pouze "uvnitř" struktury

Strukturované typy – příklad STRUC S1 a DB ? ALIGN 4 b DD 5 ENDS S1 mov eax,[(S1 ebx).b] ; mov eax,[ebx+4]

Direktivy Jazykové konstrukce, které typicky neslouží k emisi kódu nebo dat, ale řídí překlad Repertoár a syntaxe direktiv představuje největší rozdíl mezi jednotlivými překladači V TASMu je zápis direktiv velmi podobný zápisu instrukcí

Direktivy – základní Mód překladu IDEAL MASM Volba cílového procesoru P8086, P186 P286, P286P, P286N P386, P386P, P386N P486, P586, P686 P8087, P287, P387, P487 Konec zdrojového kódu END <startovní_adresa> Nastavení číselného základu RADIX <n> ; 2, 8, 10, 16

Deklarační direktivy Tyto direktivy slouží k emisi kódu/dat Příklady: [<jméno>] DB <výraz> ; byte [<jméno>] DW <výraz> ; word (2 byty) [<jméno>] DD <výraz> ; dword (4 byty) [<jméno>] DF <výraz> ; fword (6 bytů) [<jméno>] DP <výraz> ; pword (6 bytů) [<jméno>] DQ <výraz> ; qword (8 bytů) [<jméno>] DT <výraz> ; tbyte (10 bytů) Příklady: i DD ? pole DB 128 DUP(?) cstr DB 'bubak',0 int_pole DD 10 DUP (5)

Deklarační direktivy - pokročilé Příklad 1: mov eax,COSI DB 0EAh ; far jump 16:32 imm DD OFFSET far_label DW far_selector Příklad 2: mov al,VAL DB 0D4h ; D4,0A=AAM DB 7

Deklarační direktivy – jiné Proměnné jiných typů Struktury, výčtové typy Inicializace Příklady: st1 S1 ? st2 S1 <'a',10> st3 S1 <b=10,a='a'>

Direktivy – zarovnání Zarovnání výstupu v logickém segmentu Příklady: ALIGN <n> ; 2, 4, 8, … ORG <n> Příklady: ORG 100h ; začátek .COM V8 DB ? ALIGN 4 V32 DD ?

Direktivy – výstup Výstup v době překladu Příklady: DISPLAY "<text>" %OUT <text> Příklady: DISPLAY "tady je to rozbitý"

Direktivy mezimodulové komunikace I. Zveřejnění symbolu pro jiné moduly PUBLIC [<jazyk>]<symbol> Vložení symbolu z jiného modulu EXTRN [<jazyk>]<symbol>:<typ> Zveřejnění nebo vložení symbolu GLOBAL [<jazyk>]<symbol>:<typ> Rozdíly od VPJ (zvláště C): Symboly jsou implicitně lokální v modulu Modul nesmí obsahovat EXTRN a definici symbolu Dovážený symbol může mít neznámý typ

Direktivy mezimodulové komunikace II. Příklady: PUBLIC nejaky_symbol PUBLIC PASCAL symbol_mlaskalu EXTRN nevim_co_to_je:UNKNOWN EXTRN C a_tohle_znam:WORD EXTRN C funkce:PROC GLOBAL C nekde_definovano:PROC GLOBAL PROLOG libove_jmeno:PTR QWORD

Segmentové direktivy I. Definice obecného logického segmentu SEGMENT <jméno> [<atributy>] ENDS [<jméno>] Vícenásobné použití logického segmentu v jednom modulu: Při překladu se spojí do jednoho logického segmentu Pořadí spojování odpovídá pořadí ve zdrojovém textu Při spojování v rámci jednoho modulu se neuplatní zarovnání logického segmentu Při vícenásobném použití logického segmentu se už nemusí specifikovat jiné atributy pouze jméno; pokud jsou uvedeny atributy, tak se musí shodovat s první definicí

Segmentové direktivy II. Logické segmenty lze vnořovat Atributy segmentu: Kombinování Jak linker spojí segmenty z různých modulů se stejnými jmény Třída Řetězec pro pojmenování skupiny segmentů, linker je pak dá dohromady Zarovnání Zarovnání začátku segmentu Velikost Defaultní velikost operandů/adresace Přístup Nastavení přístupových práv pro segment

Segmentové direktivy III. Kombinační atribut PRIVATE, PUBLIC COMMON, VIRTUAL AT adresa Atribut zarovnání BYTE, WORD, DWORD PARA, PAGE, MEMPAGE Atribut velikosti USE16, USE32 Příklady: SEGMENT _TEXT PUBLIC DWORD USE32 'CODE' SEGMENT _DATA PUBLIC DWORD USE32 'DATA' SEGMENT vmem AT 0A000h

Segmentové direktivy IV. Skupiny Spojují několik logických segmentů do jednoho segmentu GROUP <jméno> <jméno_ls> {,<jméno_ls>} Deklarace obsahu segmentových registrů Direktiva ASSUME nic nemění, pouze deklaruje ASSUME <segreg>:<výraz> ASSUME NOTHING

Segmentové direktivy V. Příklady: GROUP DGROUP _DATA,_BSS MOV AX,DGROUP MOV DS,AX ASSUME DS:DGROUP MOV AX,_BSS MOV EAX,[prom]

Modely I. Direktiva modelu Určuje implicitní jazyk Volací konvence Generovaný prolog a epilog procedur Mandlování jmen na rozhraní modulu Definuje chování, jména a atributy logických segmentů definovaných zjednodušenými segmentovými direktivami MODEL [<mod_mod>] <mem_mod> [<jméno_cs>] [,[<mod_jaz>] <jazyk>] [,<mod_mod>]

Modely II. Paměťové modely Modifikátory modelu Jazyky TINY SMALL, MEDIUM, COMPACT, LARGE, HUGE FLAT Modifikátory modelu USE16, USE32 NT, OS_NT Jazyky PASCAL, C, CPP, BASIC, FORTRAN, PROLOG SYSCALL, STDCALL NOLANGUAGE

Modely III. Modifikátory jazyka Model FLAT Příklady: NORMAL, WINDOWS Všechny vzdálenosti blízké (near) CS=_text, DS=SS=flat Příklady: P386 MODEL FLAT PROLOG, NT

Zjednodušené segmentové direktivy Použivají předdefinované atributy podle paměťového modelu CODESEG DATASEG, UDATASEG CONST, STACK FARDATA, UFARDATA Nemají „ukončovací“ závorku, platnost končí při Použití jiné segmentové direktivy (i nejednoduché) Konci zdrojového textu Nelze je vnořovat

Procedury I. Deklarace: Argument: PROC <jméno> [[<mod_jaz>] <jazyk>] [<dist>] [ARG <arg> {,<arg>} [=argsize]] [LOCAL <arg> {,<arg>} [=locsize]] [USES <item> {,<item>}] … RET ENDP [<jméno>] Argument: <jméno> [[počet1]] [:<typ> [:<počet2>]]

Procedury II. Pomocné direktivy uvnitř procedur: Poznámky LOCALS [<prefix>] NOLOCALS Poznámky Položky v USES jsou buď registry nebo paměť <argsize> a <locsize> jsou součty velikostí <počet2> v argumentu udává násobnost <počet1> v argumentu udává násobnost všeho Viditelnost lokálních jmen lze omezit použitím prefixu z direktivy LOCALS, na počátku @@

Procedury III. Příklad 1: PROC soucet ARG @@a:DWORD,@@b:DWORD=@@rsize mov eax,[@@a] add eax,[@@b] ret @@rsize ENDP

Procedury IV. Příklad 2: PROC p1 ARG @@a:DWORD,@@b:DWORD LOCAL @@p:DWORD USES esi,edi mov eax,[@@a] mov [@@p],0 … ret ENDP p1

Po volání před prologem Procedury V. Situace na zásobníku pro příklad 2: Po volání před prologem ESP offs. EBP offs. Po volání po prologu ESP offs. EBP offs. @@b @@b +8 +16 +12 @@a @@a +4 +12 +8 RA RA ←ESP +8 +4 Staré EBP +4 ←EBP @@p -4 ←ESP

Rozhraní VPJ – ASM Paměťový model Volací konvence Rozložení paměti Pojmenování a atributy segmentů Volací konvence Mandlování veřejných jmen Mechanismus volání funkcí a procedur Způsob předávání parametrů Způsob předávání návratové hodnoty funkcí Požadavky na uchování stavu registrů

Mandlování veřejných jmen Původně „names mangling/decorating“ mangle mandlovat rozsekat, roztrhat, rozbít, rozdrtit, těžce poškodit, potlouci, pohmožditi přen. pokazit, znetvořit, k nepoznání změnit, překroutit, zkomolit Příklady: long f1(int i, const char *m, struct s *p) _f1 MSVC IA-32 C __cdecl @f1@12 MSVC IA-32 C __fastcall _f1@12 MSVC IA-32 C __stdcall ?f1@@YAJHPBDPAUs@@@Z MSVC IA-32 C++ _f1 GCC IA-32 C __Z2f1iPKcP1s GCC IA-32 C++ f1 MSVC IA-64 C ?f1@@YAJHPEBDPEAUs@@@Z MSVC IA-64 C++

Volací konvence MSVC IA-32 I. Obecné pravdy: Jména jsou case-sensitivní Parametry na zásobníku jsou zarovnány na 32-bitů Je třeba uchovat ESP, EBP, EBX, ESI, EDI, DF, segmentové registry Návratová hodnota (pokud je) je v AL, AX, EAX, EDX:EAX nebo na ST(0) koprocesoru Velké návratové hodnoty se „vrací“ předáním „tajného“ 0. parametru volané funkci odkazujícího na vytvořené místo na zásobníku volající funkce Po ukončení funkce musí být vyčištěn zásobník koprocesoru kromě případu vracení numerické hodnoty, kdy zůstane jen ST(0)

Volací konvence MSVC IA-32 II. „Standardní zásobníková“ volací konvence (__cdecl): Parametry ukládány na zásobník zprava doleva Parametry odstraňuje volající funkce (lze ...) Jméno je tvořeno _jméno Konvence volání WinAPI (__stdcall): Parametry odstraňuje funkce volaná (nelze ...) Jméno je tvořeno _jméno@n (n=počet bytů parametrů) Rychlé volání (__fastcall): Parametry ukládány na zásobník zprava doleva, první dva 32-bitové nebo menší v ECX, EDX Jméno je tvořeno @jméno@n (n=počet bytů parametrů)

Volací konvence MSVC Intel 64 První 4 parametry předávány registry, zbytek na zásobníku Pouze pokud je velikost 1, 2, 4, 8, jinak předání referencí RCX, RDX, R8, R9 nebo XMM0L-XMM3L, pokud je parametr typu float/double x87 se nepoužívá Může být použit, ale může být během volání jiné funkce zničen Ke zničení jsou registry RAX, R10, R11, XMM4, XMM, ostatní musí být zachovány Na zásobníku vždy vyhrazeno místo pro 4 parametry, i když je funkce volaná nemá Návratová hodnota v RAX nebo XMM0 podle typu

Inline asembler – MSVC I. Zápis: Norma ISO/IEC 9899:1999 má klíčové slovo asm, MSVC.NET 2003 má zatím jen __asm __asm <instrukce> [;] __asm { {<instrukce>} } [;] Podle normy asm { <řetězec> } ;

Inline asembler – MSVC II. Použití: Používá MASM zápis výrazů Nelze použít deklarační direktivy Dx ani struktury Místo DB lze použít pseudoinstrukci _emit Lze používat viditelná jména a návěští, konstanty včetně enumů, jména typů včetně definovaných pomocí typedef Není třeba uchovávat obsah registrů EAX, EBX, ECX, EDX, ESI, EDI, ale překladač je sám uloží v případě potřeby Lze skákat z inline bloku do C/C++ i obráceně, pozor na použití jmen knihovních funkcí jako návěští Překladač neoptimalizuje přes inline bloky

Inline asembler – MSVC III. Vlastní volací konvence: Lze donutit překladač, aby negeneroval prolog a epilog funkce Deklarace funkce: __declspec(naked) <deklarátor_funkce> Nelze použít return, alloca a setjmp Nelze inicializovat lokální proměnné před prologem Překladač definuje symbol __LOCAL_SIZE, který udává velikost lokálních proměnných; lze ho použít pouze jako přímý operand

Inline asembler – MSVC IV. Příklad: __declspec(naked) int f(long p) { int i; __asm { /* prolog */ push ebp mov ebp,esp sub esp,__LOCAL_SIZE } /* Kód funkce */ __asm { /* epilog */ mov esp, ebp pop ebp ret

Inline asembler – GCC I. Zápis: Vstupní omezení: Výstupní omezení: asm [volatile] ( <řetězec> : <výstup> {,<výstup>} : <vstup> {,<vstup>} [ :<změna> {,<změna>} ] ) ; Vstupní omezení: [<vnitřní_jméno>] "x" (<vnější_jméno>) Výstupní omezení: [<vnitřní_jméno>] "=[&]x" (<vnější_jméno>)

Inline asembler – GCC II. Omezení: m paměť r obecný registr i přímá hodnota (konstanta) g cokoliv z předchozího q a,b,c,d (u 8-bitů nižší části) Q a,b,c,d vyšší části u 8-bitů A EDX:EAX t ST(0) a,b,c,d a,b,c,d S,D si,di x xmm SSE registr y MMX registr

Inline asembler – GCC III. Vlastnosti: GCC optimalizuje i přes asm bloky, volatile říká, že kód má vedlejší efekty a překladač to nebude optimalizovat GCC předpokládá, že jako výstup může použít i vstupy. Pokud tomu tak není, je třeba použít &. V řetězci se používá %<vnitřní_jméno>. Pokud není definováno <vnitřní_jméno>, čísluje se od 0, tj. %n.

Inline asembler – GCC IV. Příklad: static __inline__ uSINT32 MTSyncIlck32_inc(volatile uSINT32 *var) { uSINT32 prev; asm volatile( "\t" "movl $1,%%eax\n\t" "lock xadd %%eax,(%1)\n" :"=&a"(prev) :"r"(var) :"memory" ); return(prev); }

Makroprocesor Každý asembler obsahuje makroprocesor: Podmíněný překlad Vkládání souborů Definice symbolických konstant Cykly, opakování Řetězcové manipulace Víceřádková parametrizovaná makra

Direktivy podmíněného překladu – I. Obecný tvar podmínky: IFxxx <blok> { ELSEIFxxx <blok> } [ ELSE <blok> ] ENDIF

Direktivy podmíněného překladu – II. Varianty: Vyhodnocení číselného výrazu: IF <výraz> IFE <výraz> Porovnání řetězců: IFIDN <s1>,<s2> IFIDNI <s1>,<s2> IFDIF <s1>,<s2> IFDIFI <s1>,<s2> IFB <s> IFNB <s> Definovanost symbolu: IFDEF <symbol> IFNDEF <symbol>

Direktivy podmíněného překladu – III. Příklad 1: IFNB regname mov regname,1000 ELSE mov eax,1000 ENDIF Příklad 2: IFDIFI <regname>,<eax> push eax mov eax,regname

Jiné direktivy makroprocesoru Hlášení chyb: ERR <text> ERRIFxxx [<parametry>,]<text> Vložení souboru: INCLUDE <text> Příklady: ERR tak tudy ne ERRIFB <regname>, prázdný registr

Symbolické konstanty a řetězcové operace – I. Definice „textového“ symbolu: <jméno> EQU <text> Definice „proměnné“: <jméno> = <výraz> Řetězcové operace: <tsymbol> CATSTR <s>{,<sx>} <tsymbol> SUBSTR <s>,<pos>[,<sz>] <nsymbol> INSTR [<pos>,]<s1>,<s2> <nsymbol> SIZESTR <s>

Symbolické konstanty a řetězcové operace – II. Příklady: ABC EQU <abc> ;ABC=“abc” ABC2 EQU ABC ;ABC2=“abc” ABC EQU <def> ;ABC=“def” (redef) ABC3 CATSTR ABC2,<,>,ABC,<,>,ABC2 ;ABC3=“abc,def,abc” ABCLEN SIZESTR ABC ;ABCLEN=3 ABC3LEN SIZESTR ABC3 ;ABC3LEN=11 COMMA1 INSTR ABC3,<,> ;COMMA1=4 COMMA2 INSTR COMMA1+1,ABC3,<,> ;COMMA2=8 ABC4 SUBSTR ABC3,5 ;ABC4=“def,abc” ABC5 SUBSTR ABC3,5,3 ;ABC5=“def” ABC6 EQU 3+2+1 ;ABC6=6 (num) ABC7 EQU %3+2+1 ;ABC7=“6” (text) ABC8 EQU %COMMA1 ;ABC8=“4” ABCLEN = ABCLEN+1 ;ABCLEN=4

Víceřádková makra – I. Deklarace: Zrušení: Parametry: Použití: MACRO <jméno> <formální_parametry> <tělo makra> ENDM Zrušení: PURGE <jméno> {,<jméno>} Parametry: Seznam formálních parametrů oddělených čárkami Při použití v těle makra je třeba použít aspoň jeden oddělovač formálního parametru & Použití: <jméno_makra> <param> {,<param>}

Víceřádková makra – II. Předávání parametrů: Souvislá skupina znaků, která neobsahuje mezery, čárky nebo středníky Skupina znaků uzavřená mezi < a >, která může obsahovat mezery, čárky a středníky Jeden libovolný znak s předchozím ! Vypočtený výraz jako text podle defaultního základu pomocí operátoru %

Víceřádková makra – III. Komentáře v makrech: ;; komentář v těle makra Lokální symboly: LOCAL <symbol> {,<symbol>} Skoky v makrech: EXITM GOTO <tag_symbol> :<tag_symbol> ;; cíl skoku

Víceřádková makra – IV. Příklady: MACRO Testik prm LOCAL @@ctg IFB <&prm&> EXITM ENDIF IFIDNI <&prm&>,<ecx> GOTO do_cycle mov ecx,&prm& :do_cycle @@ctg: ... dec ecx jnz @@ctg ENDM

Cykly a opakování – I. Cykly: Opakování: Příklady: WHILE <výraz> REPT <výraz> IRP <fparm>,<arg1>{,<argx>} IRPC <fparm>,<text> Příklady: REPT 4 shl eax,1 ENDM

Cykly a opakování – II. Příklady (pokračování): procyk = 0 WHILE procyk lt 5 nop procyk = procyk + 1 ENDM IRPC fp,abcd push e&fp&x IRP fp,<eax,ebx,ecx,edx> mov &fp&,0