780 likes | 908 Views
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.
E N D
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
CC .OBJ .C LINK .EXE ASM .OBJ .ASM .LIB .ASM ASM .OBJ LIB .LIB .C CC .OBJ LINK .EXE ASM .OBJ .C/inline ASM CC .ASM Asembler při překladu
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)
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
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
Spojování segmentů Modul A CODE.A 0 558 CODE.A IDATA.A 216 558 CODE.B 4096 UDATA.A 203 LINK IDATA.A 4312 IDATA.B 4412 Modul B 8192 115 CODE.B UDATA.A 100 IDATA.B 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 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 AND,OR,XOR • Unární logické operace NOT • Posuny SHL,SHR • Příklady: AND EAX,NOT ((1 SHL 16)-1)
EQual == EQ Not Equal != NE Greater Than > GT Greater or Equal >= GE Less Than < LT Less or Equal <= LE Operátory – relační • 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 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
Druh výrazu SYMTYPE Příklady: IF (SYMTYPE &p1 AND 6) EQ 0 ; [EBX] Jiné operátory III.
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: 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: 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: 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
Strukturované typy – příklad • 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 [<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 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 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: PUBLICnejaky_symbol PUBLICPASCAL 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 DS,AX 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 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 NORMAL, WINDOWS • Model FLAT • Všechny vzdálenosti blízké (near) • CS=_text, DS=SS=flat • Příklady: P386 MODEL FLAT PROLOG, NT P386
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: 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: 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