Assembler - 3.část. poslední změna této stránky: 9.2.2007. Zpět



Podobné dokumenty
Assembler - 5.část. poslední změna této stránky: Zpět

ISU Cvičení 7. Marta Čudová

ČÁST 1. Základy 32bitového programování ve Windows

IPA - Lab.1 Úvod do programování v ASM

Předmluva 13 Použité konvence 14. KAPITOLA 1 Základní číselné soustavy a pojmy Číselné soustavy a převody 15 1.

Struktura programu v době běhu

ISU Cvičení 3. Marta Čudová

DUM 06 téma: Tvorba makra pomocí VBA

8 Třídy, objekty, metody, předávání argumentů metod

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

8. Laboratoř: Aritmetika a řídicí struktury programu

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

x86 assembler and inline assembler in GCC

Jazyk symbolických adres

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Assembler DRUHÁ ČÁST OBSAH.

7. Datové typy v Javě

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Programovací jazyk Pascal

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

ISU Cvičení 2. Marta Čudová

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

MPASM a IDE pro vývoj aplikací MCU (Microchip)

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Opakování programování

2 Datové typy v jazyce C

Typy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu

1 Návod na instalaci prostředí LeJOS-NXJ a přehrání firmwaru NXT kostky

Programování v C++ 1, 1. cvičení

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

ISU Cvičení 2. Marta Čudová

Více o konstruktorech a destruktorech

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

dovolují dělení velkých úloh na menší = dekompozice

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 8

Výčtový typ strana 67

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Přerušovací systém s prioritním řetězem

MQL4 COURSE. By Coders guru -8- Proměnné

PB161 Programování v jazyce C++ Přednáška 4

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

Assembler RISC RISC MIPS. T.Mainzer, kiv.zcu.cz

Algoritmizace a programování

PROGRAMOVÁNÍ V C++ CVIČENÍ

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

PREPROCESOR POKRAČOVÁNÍ

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

přetížení operátorů (o)

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

Sdílení dat mezi podprogramy

ALGORITMIZACE A PROGRAMOVÁNÍ

Objektově orientované programování

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Seminář Java II p.1/43

Vyčtení / zapsání hodnot z/do OMC8000 pomocí protokolu UDP

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

CZ.1.07/1.5.00/

Architektury VLIW M. Skrbek a I. Šimeček

Úvod do programovacích jazyků (Java)

IUJCE 07/08 Přednáška č. 1

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

VISUAL BASIC. Práce se soubory

Úvod do programovacích jazyků (Java)

Programovací jazyk C++ Hodina 1

22. TVORBA UŽIVATELSKÝCH INSTRUKCÍ A MAKER

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 11

Programování v jazyce C a C++

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Transkript:

1 z 7 19.2.2007 7:51 Assembler - 3.část poslední změna této stránky: 9.2.2007 Zpět 1. Externí assembler O externí assembler se jedná v případě, že máte zdroják v samostatném souboru s příponou ASM (některé překladače používají jiné přípony, ale to je jedno). V Borland C++ 3.1 (DOS 16bit) se jednoduše přidá do projektu nový.asm soubor a můžete programovat. Výhoda je v tom, že v takovém externím souboru můžete používat i příkazy asm, které inline asm v BC 3.1 neumí (všechny 32bitové instrukce, makra apod.). BC volá svůj externí kompilátor assembleru TASM (Turbo Assembler), který vyrobí z.asm souboru.obj, který se už přilinkuje do EXE klasickým způsobem. Ve Visual C++ (Windows 32bit) používáme jeho MASM (Macro Assembler). Do verze Visual C++ 6.0 byl MASM distribuovaný zvlášť, ve Windows DDK (driver development kit). Buď si tedy MASM můžete doinstalovat z DDK, nebo můžete alternativně používat i TASM. Od verze Visual C++ 7.0/.NET /2002 je MASM součástí C++ instalace. Jelikož dnes se běžně používá verze 2003 nebo novější, pro použití externího assembleru MASM ve Visual Studiu nepotřebujete nic dalšího instalovat. Ve VC++ můžete do projektu přidat.asm soubor, bohužel se však soubor nebude automaticky kompilovat assemblerem. Musíte to nastavit ručně. Zde uvedený postup platí pro Visual C++ 2003: V seznamu soburů (Solution Explorer) klikněte na váš.asm soubor pravým tlačítkem a zvolte "Properties". Zde v "Custom Build Step " nastavte: MASM: (doporučené řešení) command line: ml /Zd /c /Cx /coff /Fo"$(OutDir)\$(InputName).obj" "$(InputPath)" outputs: $(OutDir)\$(InputName).obj TASM: (náhradní řešení) command line: tasm /t /zi /mx $(InputPath),$(OutDir)\$(InputName).obj outputs: $(OutDir)\$(InputName).obj Pokud máte starší verzi Visual Studia než 2002, musíte ještě udělat jednu věc: Zřístupnit TASM resp. MASM někde v pathu (nebo aspoň spouštěcí baťák). Verze 2002 a novější to už má automaticky.

2 z 7 19.2.2007 7:51 Proč je Borlandí TASM horší: Používá totiž jinou syntaxi chybových hlášení a jiný formát OBJ souborů. První problém znamená, že VC++ vám vypíše jen seznam chyb a čísel řádků, ale nebudete moci chyby prohlížet stejně pohodlně jako chyby v C++ kódu. Druhý problém znamená, že MS Linker sice provede import OBJ souboru, ale bude vypisovat warning (varování) o špatném formátu OBJ souboru při každém linkování. V GCC (DOS/Windows 32bit) musíte použít MASM, protože GCC linker neumí importovat OBJ soubory z TASM. Parametry příkazové řádky jsou stejné jako ve VC++. Týká se to DJGPP, MinGW, CygWin a vůbec asi všech GCC portů na MS-operační systémy. V Linuxu je to s používáním MASM/TASM překladačů ještě složitější. Na závěr ještě vysvětlení parametrů MASM: /Zd generuje informace o číslech řádků (debug info) /c pouze přeložit, ale nelinkovat /Cx rozlišovat velká a malá písmena pouze u exportovaných symbolů /coff generuje formát souborů COFF /Fo jméno výstupního souboru 2. Struktura ASM souboru Soubor ASM může být v různých formátech a taky může mít různou strukturu. My si ukážeme jednu z možných (pro MASM a TASM), kterou budeme pro začátek používat. Tato struktura souboru mi připadá vůbec nejjednodušší..486 ;budeme používat procesor 486.model small,c ;paměťový model small, jazyk C jumps ;POUZE TASM - automatické řešení vzdálených podmíněných skoků locals ;POUZE TASM - lokální návěští (v rámci funkce) za @@.const ;začátek konstant ;deklarace konstant.data ;začátek inicializovaných dat ;deklarace proměnných.data? ;začátek neinicializovaných dat ;deklarace proměnných

3 z 7 19.2.2007 7:51.code ;začátek kódu ;kód programu end ;konec souboru V případě použití 32bitové verze MASM, což je nejobvyklejší situace při práci ve Windows, vynecháváme třetí a čtvrtý řádek, neboť irektivy jumps a locals zde nejsou potřeba. Překladač se totiž takto chová automaticky (tj. vzdálené skoky jsou vždy řešeny a návěští jsou vždy lokální). V TASM tyto direktivy pro pohodlnou práci potřeba jsou. Zatímco v TASM jsou datové segmenty automaticky seskupeny a je možno je adresovat bez uvádění segmentového prefixu ds:, MASM toto nedělá a ani nedovoluje seskupovat segmenty v režimu s přepínačem /coff. Tento poněkud složitě znějící popis se snaží vyjádřit jediné: Při použití MASM budete čelit problémům s globálními proměnnými. Pouze jediný ze tří datových segmentů můžete přiřadit registru ds. Ostatní doporučuji umístit do samostatných zdrojových souborů a odkazovat se na ně pomocí extrn (čímž překladač tak trochu ošálíte, neboť mu vsugerujete představu, že konstanty i inicializované proměnné jsou v sekci.data?, což sice není pravda, ale funguje to, neboť všechny datové segmenty jsou linkerem stejně seskupeny dohromady), nebo u ostatních segmentů prostě používat prefix ds: u každé adresace. Při používání globálních proměnných tedy kostra souboru pro MASM následovně..486 ;budeme používat procesor 486.model small,c ;paměťový model small, jazyk C.data? ;začátek neinicializovaných dat ;deklarace proměnných assume ds:_bss ;přiřazení ds registru k sekci.data?.code ;začátek kódu ;kód programu end ;konec souboru Poznámka: První řádek (v případě TASM i MASM) určuje typ procesoru, zde tedy 80486. Tato verze procesoru je podporována všemi překladači assembleru ve všech verzích, na které můžete narazit. Pouze novější překladače však podporují i Pentium (direktiva.586 - starý TASM nepodporuje, MASM ve verzi 6.11 ano) nebo Pentium Pro (direktiva.686 - opět TASM nepodporuje, MASM ve verzi 8.00 ano). Procesory Pentium Pro a kompatibilní

4 z 7 19.2.2007 7:51 přinesly řadu zajímavých instrukcí, je to však nad rámec výuky v jednom semestru. 3. Funkce V C++ jsou standardně všechna jména public, čili jsou přístupná i z ostatních souborů. V asm je tomu naopak. Standardně jsou všechna jména lokální (jakoby "static" v C++) a deklarací public jméno je zveřejníte. To taky musíte udělat u funkcí, které chcete volat z C++ do assembleru. public mocnina ;jméno mocnina je public mocnina proc value:dword ;deklarace funkce s jedním parametrem mov eax,value ;eax=value imul eax,value ;eax*=value ret ;návrat mocnina endp ;konec funkce Na uvedeném příkladu vidíme několik důležitých věcí: 1. Deklarace public může být klidně ještě před vlastní definicí jména. Obvykle se tyto deklarace pro větší přehlednost píší na začátek asm souboru. 2. Funkce/procedura začíná konstruktem jméno proc. První slovo je vámi zvolené jméno, za ním následuje klíčové slovo proc. 3. Funkce končí konstruktem jméno endp ("end procedure"). 4. Vstupní parametry se píší za klíčové slovo proc, formát je jako v Pascalu. Tzn. jméno:typ. 5. Návratová hodnota se nikde nespecifikuje, ale nechává se v registru eax (typ dword), případně ax (word) nebo al (byte). V 16bit prostředí se 32bitová hodnota vrací ve dvojici registrů dx:ax. 6. Na konci funkce VŽDY musí být instrukce ret, jinak program běží dál (pokračuje za koncem funkce!). 7. Na tomto příkladu to není vidět, ale nezapomínejte schovávat registry, které použijete. Volající funkci by mohly chybět! Nejjednodušší je použít instrukce pushad a popad, které uchovají resp. obnoví všechny registry kromě segmentových (ty zatím stejně nepoužíváme). Tyto instrukce však uloží na zásobník všechny registry, včetně eax! 4. Vstupní parametry funkce Vstupní parametry, je-li jich víc, se oddělují čárkami.

5 z 7 19.2.2007 7:51 theproc proc a:dword,b:dword ;deklarace funkce jménem "theproc" se dvěma parametry pushad ;uchování všech registrů... popad ;obnovení všech registrů ret ;návrat theproc endp ;konec funkce jménem "theproc" 5. Paměťové modely Jelikož naše programy v asm linkujeme s C++, používáme stejné paměťové modely. Tzn. v 32bit prostředí je to vždy model small (zvaný také flat), v 16bit prostředí je to jeden z tiny, small, medium, compact, large. Model huge v asm neexistuje. Uvědomte si, že zatím umíte používat jen model small! Uvedením C do deklarace modelu určíme, že chceme spolupracovat s jazykem C. To je důležité pro názvy funkcí (aby se funkce mezi C a asm vůbec "našly") a při předávání parametrů funkcí. Funkce v C++ potom deklarujeme jako extern "C", protože assembler by naše C++ funkce jinak nenašel. //budeme z C++ kódu volat naši funkci napsanou v assembleru extern "C" void theproc(int a, int b); int main() { //funkci teď zavoláme stejně, jako každou jinou theproc(1,2); } return 0; 6. Volání funkcí Instrukce call address Instrukce call zavolá podprogram, tedy funkci. Adresu můžete zadat buď jako jméno funkce nebo i nepřímo, tak že si do registru dáte adresu funkce a zavoláte ji přes tento registr. Následující ukázka kódu obsahuje mnoho nových věcí.

6 z 7 19.2.2007 7:51.const text db "Ahoj",0 ;definujeme řetězec (na konci řetězce musíme uvést binárí nulu!).code extrn printf:proc ;funkce printf z Céčka public theproc theproc proc push offset text ;vstupní parametry funkcí se předávají přes zásobník mov eax,offset printf ;načteme adresu printf call eax ;voláme printf nepřímým voláním pop eax ;po volání print musíme uklidit zásobník ret theproc endp Poznámka: V TASM můžeme použít pseudoinstrukci call k volání procedur včetně parametrů. Naproti tomu MASM má pseudoinstrukci invoke, která slouží k volání procedur s parametry, ovšem invoke vyžaduje uvedení prototypu (deklarace) volané funkce pomocí konstrukce proto. Syntaxe proto je stejná jako u proc. Ukažme tedy stejný příklad s využitím invoke..const text db "Ahoj",0 ;definujeme řetězec (na konci řetězce musíme uvést binárí nulu!).code printf proto text:dword ;funkce printf z Céčka - zjednodušená deklarace s jedním parametrem public theproc theproc proc invoke printf,offset text ;voláme printf pomocí pseudoinstrukce invoke ret theproc endp 7. Deklarace proměnných Proměnnou (s názvem text) jsme deklarovali již v předchozím příkladě. Je to tedy již jasné. jméno db hodnota ;1bajtová proměnná = typ byte (db=declare byte), také může být řetězec

7 z 7 19.2.2007 7:51 jméno dw hodnota ;2bajtová proměnná = typ word (dw=declare word) jméno dd hodnota ;4bajtová proměnná = typ dword (dd=declare double word) Proměnné takto deklarujeme pouze v externím assembleru. Nezapoměňte je psát do sekce "const", "data?" nebo "data". Neinicializované proměnné deklarujeme tak, že místo hodnoty napíšeme otazník. 8. Externí deklarace Externí jména deklarujeme, jak ukazuje příklad, pomocí klíčového slova extrn (jen jedno e!). extrn jméno:byte ;proměnná typu byte extrn jméno:word ;proměnná typu word extrn jméno:dword ;proměnná typu dword extrn jméno:proc ;procedura (bez parametrů) extrn jméno:pointer ;proměnná typu pointer (TASM) extrn jméno:ptr ;proměnná typu pointer (MASM) extrn jméno:integer ;proměnná typu integer (TASM) Poznámka: Deklarace prototypu funkce pomocí proto (viz výše) zcela nahradí deklaraci pomocí extrn. To berte jako návod pro práci v MASM, týkající se jen funkcí, nikoliv proměnných. (Je přímo zakázáno použít současně extrn i proto.) Zpět