Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

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.

Podobné prezentace


Prezentace na téma: "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."— Transkript prezentace:

1 Programování v asembleru - TASM Jakub Yaghob

2 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

3 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

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

5 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

6 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

7 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

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

9 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)

10 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

11 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 0MOVAL,CL 2ADDAL,DL 4.idata 0 S1DB"bubak" 5.udata 0 V1DD? 4.code 4MOVEAX,[V1] 9

12 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 LINK

13 Čí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, B CMP AL,FEH

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

15 Adresové typy Jednoduché 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]

16 Operátory – obecně Vyskytují se v: Přímé operandy instrukcí MOVEAX,10+1 Přímé operandy direktiv IFMOJEKONST EQ 2 Inicializace V1DD20*3 Adresové výrazy MOVEAX,[pole+EBX+10] Kromě adresových výrazů to jsou konstantní výrazy MOVEAX,EBX+1

17 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: MOVEAX,10+1 MOVEAX,[EBX+10] – adresový výraz

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

19 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: IFMOJEKONST EQ 2 IFMOJEKONST = 2 IFMOJEKONST GE 2 IFMOJEKONST >= 2

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

21 Jiné operátory I. Reference položek struktur a unií. Maska na bitové pole, položku bitového pole, výčtový typ MASK 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

22 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

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

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

25 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, ??filename Stav překladu @Interface Zjednodušené

26 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

27 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 dmareqchsel:2,rqbit:1,_res:5

28 Strukturované typy Deklarace: STRUC ENDS[ ] UNION ENDS[ ] 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

29 Strukturované typy – příklad Příklad: STRUCS1 aDB? ALIGN4 bDD5 ENDSS1 mov eax,[(S1 ebx).b] ; mov eax,[ebx+4]

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

31 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 Nastavení číselného základu RADIX ; 2, 8, 10, 16

32 Deklarační direktivy Tyto direktivy slouží k emisi kódu/dat [ ]DB ; byte [ ]DW ; word (2 byty) [ ]DD ; dword (4 byty) [ ]DF ; fword (6 bytů) [ ]DP ; pword (6 bytů) [ ]DQ ; qword (8 bytů) [ ]DT ; tbyte (10 bytů) Příklady: iDD? poleDB128 DUP(?) cstrDB'bubak',0 int_poleDD10 DUP (5)

33 Deklarační direktivy - pokročilé Příklad 1: moveax,COSI DB0EAh; far jump 16:32 imm DDOFFSET far_label DWfar_selector Příklad 2: moval,VAL DB0D4h; D4,0A=AAM DB7

34 Deklarační direktivy – jiné Proměnné jiných typů Struktury, výčtové typy Inicializace Příklady: st1S1? st2S1 st3S1

35 Direktivy – zarovnání Zarovnání výstupu v logickém segmentu ALIGN ; 2, 4, 8, … ORG Příklady: ORG100h; začátek.COM V8DB? ALIGN4 V32DD?

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

37 Direktivy mezimodulové komunikace I. Zveřejnění symbolu pro jiné moduly PUBLIC[ ] Vložení symbolu z jiného modulu EXTRN[ ] : Zveřejnění nebo vložení symbolu GLOBAL[ ] : 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

38 Direktivy mezimodulové komunikace II. Příklady: PUBLICnejaky_symbol PUBLICPASCAL symbol_mlaskalu EXTRNnevim_co_to_je:UNKNOWN EXTRNC a_tohle_znam:WORD EXTRNC funkce:PROC GLOBALC nekde_definovano:PROC GLOBALPROLOG libove_jmeno:PTR QWORD

39 Segmentové direktivy I. Definice obecného logického segmentu SEGMENT [ ] ENDS[ ] 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í

40 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

41 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' SEGMENTvmem AT 0A000h

42 Segmentové direktivy IV. Skupiny Spojují několik logických segmentů do jednoho segmentu GROUP {, } Deklarace obsahu segmentových registrů Direktiva ASSUME nic nemění, pouze deklaruje ASSUME : ASSUMENOTHING

43 Segmentové direktivy V. Příklady: GROUPDGROUP _DATA,_BSS MOVAX,DGROUP MOVDS,AX ASSUMEDS:DGROUP MOVAX,_BSS MOVDS,AX MOVEAX,[prom]

44 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 [ ] [ ] [,[ ] ] [, ]

45 Modely II. Paměťové modely 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

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

47 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

48 Procedury I. Deklarace: PROC [[ ] ] [ ] [ARG {, } [=argsize]] [LOCAL {, } [=locsize]] [USES {, }] … RET ENDP[ ] Argument: [[počet1]] [: [: ]]

49 Procedury II. Pomocné direktivy uvnitř procedur: LOCALS[ ] NOLOCALS Poznámky Položky v USES jsou buď registry nebo paměť a jsou součty velikostí v argumentu udává násobnost 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

50 Procedury III. Příklad 1: PROCsoucet ENDP

51 Procedury IV. Příklad 2: PROCp1 USESesi,edi … ret ENDPp1

52 Procedury V. Situace na zásobníku pro příklad 2: Po volání před prologem RA ←ESP ESP offs. EBP offs. Po volání po prologu RA ←ESP ESP offs. EBP offs. Staré EBP ←EBP

53 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ů

54 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 MSVC IA-32 C __fastcall MSVC IA-32 C __stdcall MSVC IA-32 C++ _f1 GCC IA-32 C __Z2f1iPKcP1s GCC IA-32 C++ f1 MSVC IA-64 C MSVC IA-64 C++

55 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)

56 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 (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 (n=počet bytů parametrů)

57 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

58 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 [;] __asm { { } } [;] Podle normy asm { } ;

59 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

60 Inline asembler – MSVC III. Vlastní volací konvence: Lze donutit překladač, aby negeneroval prolog a epilog funkce Deklarace funkce: __declspec(naked) 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

61 Inline asembler – MSVC IV. Příklad: __declspec(naked) int f(long p) { int i; __asm {/* prolog */ pushebp movebp,esp subesp,__LOCAL_SIZE } /* Kód funkce */ __asm { /* epilog */ movesp, ebp popebp ret }

62 Inline asembler – GCC I. Zápis: asm [volatile] ( : {, } : {, } [ : {, } ] ) ; Vstupní omezení: [ ] "x" ( ) Výstupní omezení: [ ] "=[&]x" ( )

63 Inline asembler – GCC II. Omezení: mpaměť robecný registr ipřímá hodnota (konstanta) gcokoliv z předchozího qa,b,c,d (u 8-bitů nižší části) Qa,b,c,d vyšší části u 8-bitů AEDX:EAX tST(0) a,b,c,da,b,c,d S,Dsi,di xxmm SSE registr yMMX registr

64 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á %. Pokud není definováno, čísluje se od 0, tj. %n.

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

66 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

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

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

69 Direktivy podmíněného překladu – III. Příklad 1: IFNBregname movregname,1000 ELSE moveax,1000 ENDIF Příklad 2: IFDIFI, pusheax moveax,regname ENDIF

70 Jiné direktivy makroprocesoru Hlášení chyb: ERR ERRIFxxx[,] Vložení souboru: INCLUDE Příklady: ERRtak tudy ne ERRIFB, prázdný registr

71 Symbolické konstanty a řetězcové operace – I. Definice „textového“ symbolu: EQU Definice „proměnné“: = Řetězcové operace: CATSTR {, } SUBSTR, [, ] INSTR[,], SIZESTR

72 Symbolické konstanty a řetězcové operace – II. Příklady: ABCEQU ;ABC=“abc” ABC2EQUABC;ABC2=“abc” ABCEQU ;ABC=“def” (redef) ABC3CATSTRABC2,,ABC,,ABC2 ;ABC3=“abc,def,abc” ABCLENSIZESTRABC;ABCLEN=3 ABC3LENSIZESTRABC3;ABC3LEN=11 COMMA1INSTRABC3, ;COMMA1=4 COMMA2INSTRCOMMA1+1,ABC3, ;COMMA2=8 ABC4SUBSTRABC3,5;ABC4=“def,abc” ABC5SUBSTRABC3,5,3;ABC5=“def” ABC6EQU3+2+1;ABC6=6 (num) ABC7EQU%3+2+1;ABC7=“6” (text) ABC8EQU%COMMA1;ABC8=“4” ABCLEN=ABCLEN+1;ABCLEN=4

73 Víceřádková makra – I. Deklarace: MACRO ENDM Zrušení: PURGE {, } 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í: {, }

74 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, 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 %

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

76 Víceřádková makra – IV. Příklady: MACROTestik prm IFB EXITM ENDIF IFIDNI, GOTOdo_cycle ENDIF movecx,&prm& :do_cycle dececx ENDM

77 Cykly a opakování – I. Cykly: WHILE Opakování: REPT IRP, {, } IRPC, Příklady: REPT4 shleax,1 ENDM

78 Cykly a opakování – II. Příklady (pokračování): procyk=0 WHILEprocyk lt 5 nop procyk = procyk + 1 ENDM IRPCfp,abcd pushe&fp&x ENDM IRPfp, mov&fp&,0 ENDM


Stáhnout ppt "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."

Podobné prezentace


Reklamy Google