1 / 78

P rogramování v asembleru - TASM

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.

hali
Télécharger la présentation

P rogramování v asembleru - TASM

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

  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,10010010B 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í 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

  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: MOV EAX,10+1 MOV EAX,[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: AND EAX,NOT ((1 SHL 16)-1)

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

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

  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. Druh výrazu SYMTYPE Příklady: IF (SYMTYPE &p1 AND 6) EQ 0 ; [EBX] Jiné operátory III.

  24. 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í

  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, ??date, @FileName, ??filename • Stav překladu ??version, @Cpu • Podle modelu @Model, @32Bit @CodeSize, @DataSize, @Interface • Zjednodušené segmentové direktivy @code, @data, @curseg, @stack

  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 dmareq chsel:2,rqbit:1,_res:5

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

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

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

  32. 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)

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

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

  35. 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 ?

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

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

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

  39. 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í

  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' SEGMENT vmem AT 0A000h

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

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

  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 [<mod_mod>] <mem_mod>[<jméno_cs>] [,[<mod_jaz>]<jazyk>] [,<mod_mod>]

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

  49. 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 @@

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

More Related