Top Banner
Programování v asembleru - TASM Jakub Yaghob
78

P rogramování v asembleru - TASM

Dec 31, 2015

Download

Documents

aladdin-francis

P rogramová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. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: P rogramování v asembleru - TASM

Programování v asembleru - TASM

Jakub Yaghob

Page 2: P rogramování v asembleru - TASM

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

Page 3: P rogramování v asembleru - TASM

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

Page 4: P rogramování v asembleru - TASM

GNU Assembler

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

Page 5: P rogramování v asembleru - TASM

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

Page 6: P rogramování v asembleru - TASM

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

Page 7: P rogramování v asembleru - TASM

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

Page 8: P rogramování v asembleru - TASM

Asembler při překladu

.ASM ASM .OBJ LIB .LIB

.C

.ASM

CC

ASM

.OBJ

.OBJ LINK .EXE

.LIB

.C

.ASM

CC

ASM

.OBJ

.OBJ

LINK .EXE

.C/inline ASM CC

Page 9: P rogramování v asembleru - TASM

Zdrojový soubor .ASM I.

Řádkově orientovaný (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)

Page 10: P rogramování v asembleru - TASM

Zdrojový soubor .ASM II.

Instrukce 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

Page 11: P rogramování v asembleru - TASM

Segmenty v asembleru 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

Page 12: P rogramování v asembleru - TASM

Spojování segmentů

CODE.A

IDATA.A

UDATA.A

Modul A

CODE.B

IDATA.B

UDATA.B

Modul B

CODE.A

IDATA.A

UDATA.A

CODE.B

IDATA.B

UDATA.B

558

216

203

115

472

250

0

558

4096

4312

8192

8395100

4412

LINK

Page 13: P rogramování v asembleru - TASM

Čí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

Page 14: P rogramování v asembleru - TASM

Ř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”

Page 15: P rogramování v asembleru - TASM

Adresové typy Jednoduché adresové typy

UNKNOWNBYTE, WORD, DWORDPWORD, FWORDQWORD, TBYTESHORT, NEAR, FARPROC, CODEPTR, DATAPTR

Složité adresové typy Struktury a unie Ukazatele

[dist] PTR [addrtype]

Page 16: P rogramování v asembleru - TASM

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

Page 17: P rogramování v asembleru - TASM

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

Page 18: P rogramování v asembleru - TASM

Operátory – logické

Binární logické operaceAND, OR, XOR

Unární logické operaceNOT

PosunySHL, SHR

Příklady:AND EAX,NOT ((1 SHL 16)-1)

Page 19: P rogramování v asembleru - TASM

Operátory – relační

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

Page 20: P rogramování v asembleru - TASM

Operátory – adresové

Změna segmentu:

Posunutí a segmentSEGOFFSET

Příklady:MOV EAX,[ES:EBX+5]MOV AX,SEG MUJ_LABELMOV EDX,OFFSET MUJ_LABEL

;=LEA EDX,[MUJ_LABEL]

Page 21: P rogramování v asembleru - TASM

Jiné operátory I. Reference položek struktur a unií

. Maska na bitové pole, položku bitového pole, výčtový

typMASK <jméno>

Nastavení adresového typutyp [PTR] výraztyp 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

Page 22: P rogramování v asembleru - TASM

Jiné operátory II.

Aktuální pozice v segmentu$

Hodnoty definice proměnných?, DUP

Velikosti a počtyLENGTH, SIZE

Příklady:ARR DW 10 DUP(4 DUP(?),0) ; LENGTH=10

; SIZE=50

Page 23: P rogramování v asembleru - TASM

Jiné operátory III.

Druh výrazuSYMTYPE

Příklady:IF (SYMTYPE &p1 AND 6) EQ 0 ; [EBX]

0 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.

Page 24: P rogramování v asembleru - TASM

Priorita operátorů – Ideal TASM

1. [], (), MASK, OFFSET, SEG, SIZE, LENGTH2. HIGH, LOW (ve výrazu)3. +, - (unární)4. *, /, MOD, SHL, SHR5. +, - (binární)6. EQ, NE, LT, LE, GT, GE7. NOT8. AND9. OR, XOR10. SYMTYPE11. : (změna segmentu)12. . (položka struktury)13. HIGH, LOW (v adrese), PTR, SMALL, LARGE, přetypování

Page 25: P rogramování v asembleru - TASM

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

Page 26: P rogramování v asembleru - TASM

Výčtový typ

Deklarace: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

Page 27: P rogramování v asembleru - TASM

Typ bitového záznamu

Deklarace: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

Page 28: P rogramování v asembleru - TASM

Strukturované typy Deklarace:

STRUC <jméno><položky struktury>

ENDS [<jméno>]UNION <jméno>

<položky unie>ENDS [<jméno>]

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

Page 29: P rogramování v asembleru - TASM

Strukturované typy – příklad

Příklad:STRUC S1

a DB ?ALIGN 4

b DD 5ENDS S1

mov eax,[(S1 ebx).b]; mov eax,[ebx+4]

Page 30: P rogramování v asembleru - TASM

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í

Page 31: P rogramování v asembleru - TASM

Direktivy – základní Mód překladu

IDEALMASM

Volba cílového procesoruP8086, P186P286, P286P, P286NP386, P386P, P386NP486, P586, P686P8087, P287, P387, P487

Konec zdrojového kóduEND <startovní_adresa>

Nastavení číselného základuRADIX <n> ; 2, 8, 10, 16

Page 32: P rogramování v asembleru - TASM

Deklarační direktivy Tyto direktivy slouží k emisi kódu/dat[<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',0int_pole DD 10 DUP (5)

Page 33: P rogramování v asembleru - TASM

Deklarační direktivy - pokročilé

Příklad 1:mov eax,COSIDB 0EAh ; far jump 16:32 immDD OFFSET far_labelDW far_selector

Příklad 2:mov al,VALDB 0D4h ; D4,0A=AAMDB 7

Page 34: P rogramování v asembleru - TASM

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'>

Page 35: P rogramování v asembleru - TASM

Direktivy – zarovnání

Zarovnání výstupu v logickém segmentuALIGN <n> ; 2, 4, 8, …ORG <n>

Příklady:ORG 100h; začátek .COM

V8 DB ?ALIGN 4

V32 DD ?

Page 36: P rogramování v asembleru - TASM

Direktivy – výstup

Výstup v době překladuDISPLAY "<text>"

%OUT <text> Příklady:

DISPLAY "tady je to rozbitý"

Page 37: P rogramování v asembleru - TASM

Direktivy mezimodulové komunikace I.

Zveřejnění symbolu pro jiné modulyPUBLIC [<jazyk>]<symbol>

Vložení symbolu z jiného moduluEXTRN

[<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

Page 38: P rogramování v asembleru - TASM

Direktivy mezimodulové komunikace II.

Příklady:PUBLIC nejaky_symbolPUBLIC PASCAL symbol_mlaskalu

EXTRN nevim_co_to_je:UNKNOWNEXTRN C a_tohle_znam:WORDEXTRN C funkce:PROC

GLOBAL C nekde_definovano:PROCGLOBAL PROLOG libove_jmeno:PTR

QWORD

Page 39: P rogramování v asembleru - TASM

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í

Page 40: P rogramování v asembleru - TASM

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

Page 41: P rogramování v asembleru - TASM

Segmentové direktivy III. Kombinační atribut

PRIVATE, PUBLICCOMMON, VIRTUALAT adresa

Atribut zarovnáníBYTE, WORD, DWORDPARA, PAGE, MEMPAGE

Atribut velikostiUSE16, USE32

Příklady:SEGMENT _TEXT PUBLIC DWORD USE32 'CODE'SEGMENT _DATA PUBLIC DWORD USE32 'DATA'SEGMENT vmem AT 0A000h

Page 42: P rogramování v asembleru - TASM

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

Page 43: P rogramování v asembleru - TASM

Segmentové direktivy V. Příklady:

GROUP DGROUP _DATA,_BSS

MOV AX,DGROUPMOV DS,AXASSUME DS:DGROUP

MOV AX,_BSSMOV DS,AX

MOV EAX,[prom]

Page 44: P rogramování v asembleru - TASM

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>]

Page 45: P rogramování v asembleru - TASM

Modely II. Paměťové modely

TINYSMALL, MEDIUM, COMPACT, LARGE, HUGEFLAT

Modifikátory modeluUSE16, USE32NT, OS_NT

JazykyPASCAL, C, CPP, BASIC, FORTRAN, PROLOGSYSCALL, STDCALLNOLANGUAGE

Page 46: P rogramování v asembleru - TASM

Modely III.

Modifikátory jazykaNORMAL, WINDOWS

Model FLAT Všechny vzdálenosti blízké (near) CS=_text, DS=SS=flat

Příklady:P386MODEL FLAT PROLOG, NTP386

Page 47: P rogramování v asembleru - TASM

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

Page 48: P rogramování v asembleru - TASM

Procedury I. Deklarace:PROC <jméno> [[<mod_jaz>] <jazyk>]

[<dist>][ARG <arg> {,<arg>} [=argsize]][LOCAL <arg> {,<arg>} [=locsize]][USES <item> {,<item>}]

…RETENDP [<jméno>]

Argument:<jméno> [[počet1]] [:<typ> [:<počet2>]]

Page 49: P rogramování v asembleru - TASM

Procedury II.

Pomocné direktivy uvnitř procedur: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 @@

Page 50: P rogramování v asembleru - TASM

Procedury III.

Příklad 1:PROC soucet

ARG @@a:DWORD,@@b:DWORD=@@rsize

mov eax,[@@a]

add eax,[@@b]

ret @@rsize

ENDP

Page 51: P rogramování v asembleru - TASM

Procedury IV. Příklad 2:PROC p1ARG @@a:DWORD,@@b:DWORDLOCAL @@p:DWORDUSES esi,edi

mov eax,[@@a]mov [@@p],0…retENDP p1

Page 52: P rogramování v asembleru - TASM

Procedury V.

Situace na zásobníku pro příklad 2:

Po volánípřed prologem

@@b

@@a

RA0

+4

+8

←ESP

ESPoffs.

EBPoffs.

Po volánípo prologu

@@b

@@a

RA

0

+4

+8

←ESP

ESPoffs.

EBPoffs.

Staré EBP

@@p

+12

+16

0

+4

+8

+12

-4

←EBP

Page 53: P rogramování v asembleru - TASM

Rozhraní VPJ – ASM

Paměťový model 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ů

Page 54: P rogramování v asembleru - TASM

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++

Page 55: P rogramování v asembleru - TASM

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)

Page 56: P rogramování v asembleru - TASM

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 ukládány na zásobník zprava doleva 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 Parametry odstraňuje funkce volaná (nelze ...) Jméno je tvořeno @jméno@n (n=počet bytů parametrů)

Page 57: P rogramování v asembleru - TASM

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

Page 58: P rogramování v asembleru - TASM

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> } ;

Page 59: P rogramování v asembleru - TASM

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

Page 60: P rogramování v asembleru - TASM

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

Page 61: P rogramování v asembleru - TASM

Inline asembler – MSVC IV. Příklad:__declspec(naked) int f(long p){ int i;

__asm { /* prolog */push ebpmov ebp,espsub esp,__LOCAL_SIZE

}/* Kód funkce */

__asm { /* epilog */mov esp, ebppop ebpret

}}

Page 62: P rogramování v asembleru - TASM

Inline asembler – GCC I.

Zápis: 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>)

Page 63: P rogramování v asembleru - TASM

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

Page 64: P rogramování v asembleru - TASM

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.

Page 65: P rogramování v asembleru - TASM

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);}

Page 66: P rogramování v asembleru - TASM

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

Page 67: P rogramování v asembleru - TASM

Direktivy podmíněného překladu – I.

Obecný tvar podmínky:IFxxx

<blok>

{ ELSEIFxxx

<blok> }

[ ELSE

<blok> ]

ENDIF

Page 68: P rogramování v asembleru - TASM

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>

Page 69: P rogramování v asembleru - TASM

Direktivy podmíněného překladu – III. Příklad 1:

IFNB regnamemov regname,1000

ELSEmov eax,1000

ENDIF Příklad 2:

IFDIFI <regname>,<eax>push eaxmov eax,regname

ENDIF

Page 70: P rogramování v asembleru - TASM

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

Page 71: P rogramování v asembleru - TASM

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>

Page 72: P rogramování v asembleru - TASM

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=3ABC3LEN SIZESTR ABC3 ;ABC3LEN=11COMMA1 INSTR ABC3,<,> ;COMMA1=4COMMA2 INSTR COMMA1+1,ABC3,<,> ;COMMA2=8ABC4 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

Page 73: P rogramování v asembleru - TASM

Víceřádková makra – I. Deklarace:

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>}

Page 74: P rogramování v asembleru - TASM

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 %

Page 75: P rogramování v asembleru - TASM

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

Page 76: P rogramování v asembleru - TASM

Víceřádková makra – IV. Příklady:

MACRO Testik prmLOCAL @@ctgIFB <&prm&>

EXITMENDIFIFIDNI <&prm&>,<ecx>

GOTO do_cycleENDIFmov ecx,&prm&

:do_cycle@@ctg:

...dec ecxjnz @@ctg

ENDM

Page 77: P rogramování v asembleru - TASM

Cykly a opakování – I.

Cykly:WHILE <výraz>

Opakování:REPT <výraz>IRP <fparm>,<arg1>{,<argx>}IRPC <fparm>,<text>

Příklady:REPT 4

shl eax,1ENDM

Page 78: P rogramování v asembleru - TASM

Cykly a opakování – II. Příklady (pokračování):

procyk = 0WHILE procyk lt 5

nopprocyk = procyk + 1

ENDM

IRPC fp,abcdpush e&fp&x

ENDM

IRP fp,<eax,ebx,ecx,edx>mov &fp&,0

ENDM