x86 assembler and inline assembler in GCC

Podobné dokumenty
IMTEE Přednáška č. 11

Procesor z pohledu programátora

REbejs. 1. workshop (draft0)

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/YOS: Přednáška I / 21

ISU Cvičení 3. Marta Čudová

ISU Cvičení 7. Marta Čudová

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

Registry 32 bitové pro všeobecné použití: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP.

Kubatova Y36SAP 8. Strojový kód Jazyk symbolických instrukcí asembler JSA pro ADOP a AVR Kubátová Y36SAP-strojový kód 1

Struktura a architektura počítačů (BI-SAP) 7

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

1 Systémová volání (celkem max. 1b)

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

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

Popis instrukční sady procesoru ADOP

PB071 Programování v jazyce C Jaro 2015

Přednáška 2 A4B38NVS - Návrh vestavěných systémů 2014, kat. měření, ČVUT - FEL, Praha J. Fischer A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 1

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

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

Operační systémy 2. Přednáška číslo 1. Úvod do OS

Základy digitální techniky

Kubatova Y36SAP procesor - control unit obvodový a mikroprogramový řadič RISC Y36SAP-control unit 1

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

Operační systémy. Přednáška 4: Komunikace mezi procesy

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

dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně izemek

Princip funkce počítače

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

Kubatova Y36SAP 9. Strojový kód ISA architektura souboru instrukcí střadačově, zásobníkově orientovaná, GPR Kubátová Y36SAP-ISA 1

Přednáška. Strojový kód a data. 4. Přednáška ISA J. Buček, R. Lórencz

Petr Krajča. 26. říjen, 2012

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Architektura počítačů. Instrukce a návrh instrukční sady. Lubomír Bulej KDSS MFF UK

Úroveň strojového kódu procesor Intel Pentium Zásobník a konvencie volania

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

WORKSHEET 1: LINEAR EQUATION 1

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

David Bednárek Jakub Yaghob Filip Zavoral.

Ukazatele, paměťové třídy, volání funkcí

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

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

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

A51 MACRO ASSEMBLER POKUSNY PROGRAM DATE 10/3/007 PAGE 1

Procesory, mikroprocesory, procesory na FPGA O. Novák, CIE 11 1

Metody připojování periferií BI-MPP Přednáška 2

Další aspekty architektur CISC a RISC Aktuálnost obsahu registru

Úroveň strojového kódu 32-bitový procesor Intel Pentium

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

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

Úroveň strojového kódu procesor Intel Pentium Úvod

Úvod do jazyka C. Úvod do jazyka C. Knihy 2/2. Knihy 1/2. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze.

Úroveň strojového kódu procesor Intel Pentium Zásobník a konvencie volania

Šablony, kontejnery a iterátory

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

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

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

Algoritmizace a programování

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

ISU Cvičení 2. Marta Čudová

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

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

Činnost CPU. IMTEE Přednáška č. 2. Několik úrovní abstrakce od obvodů CPU: Hodinový cyklus fáze strojový cyklus instrukční cyklus

Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem. Úvod do jazyka C. Jan Faigl

Struktura a architektura počítačů (BI-SAP) 9

Generování vnitřní reprezentace programu

Assembler x86. Studijní text pro předmět: Strojově orientované jazyky Petr Olivka. Katedra informatiky VŠB-TU Ostrava

Programování MCU ve vyšších programovacích jazycích

Čipové karty Lekařská informatika

Šablony, kontejnery a iterátory

PicoBlaze lekce 1: assembler, C překladač a simulační prostředí Jiří Svozil, Leoš Kafka, Jiří Kadlec svozil@utia.cas.cz

Programovací jazyk C++ Hodina 1

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

Mikrořadiče řady 8051.

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY. Stručný úvod do programování v jazyce C 2.díl. České vysoké učení technické Fakulta elektrotechnická

Strojový kód. Instrukce počítače

ISU Cvičení 2. Marta Čudová

Základní datové struktury

Funkční objekty v C++.

Architektura počítačů

Opakování programování

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY. Systémová struktura počítače

PB071 Programování v jazyce C Jaro 2017

Vektorové instrukční sady a použití assembleru v gcc

a operačních systémů

Operační systémy. Cvičení 3: Programování v C pod Unixem

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Příklady popisu základních obvodů ve VHDL

Osnova přednášky. Informační a řídicí systémy I. Programování PLC II. IEC Program ve strukturovaném textu. Strukturovaný text (ST)

Pohled do nitra mikroprocesoru Josef Horálek

Registry 8*32bit ERn (=16*16bit En+Rn, 8*16bit+16*8bit En+RnH+RnL)

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

POPIS TUN TAP. Vysvetlivky: Modre - překlad Cervene - nejasnosti Zelene -poznamky. (Chci si ujasnit o kterem bloku z toho schematu se mluvi.

CHARAKTERISTIKA PROCESORU PENTIUM První verze:

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Simulátory aplikačně specifických instrukčních procesorů Jazyk LISA. Masařík Karel

GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)

Operační systémy. Cvičení 4: Programování v C pod Unixem

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

Transkript:

x86 assembler and inline assembler in GCC Michal Sojka sojkam1@fel.cvut.cz ČVUT, FEL License: CC-BY-SA 4.0

Useful instructions mov moves data between registers and memory mov $1,%eax # move 1 to register eax n:.int 123 # label n points to an integer # variable mov n,%eax # move value of the variable to eax mov %eax,%ebx # copy the value in eax to ebx push/pop stack manipulation Useful when we need to store data for later and we cannot use registers for that push %eax # push content of eax to the stack pop %ebx # pop a value from the stack to ebx

Useful instructions 2 add adds two operands add $2,%eax # eax = eax + 2 add %eax,%ebx # ebx = ebx + eax sub subtracts two operands sub $2,%eax # eax = eax 2

Useful instructions 3 call calls a subroutine ret returns from a subroutine to the caller plusone: main: add $1,%eax ret mov $12,%eax call plusone...

Useful instructions 4 div integer division (not a simple instruction) http://x86.renejeschke.de/html/file_module_x86_id_72.html 8 bit operand: ax divided by the operand result: al = ax / operand, ah = ax % operand mov $42,%ax mov $12,%bl div %bl # al = 42/12 = 3 16 bit operand: dx:ax divided by the operand result: ax = dx:ax / operand, dx = dx:ax % operand... mov $0x1,%dx mov $0x2345,%ax mov $10,%bx div %bx # ax = 0x12345 / 10

Useful instructions 5 cmp compare two values cmp $2,%eax # compare eax with 2 and set eflags register je label # jump to the label if eax was equal to 2 jl label # jump if eax was less jg label # jump if eax was greater jlelabel # jump if less or equal jge label # jump if greater or equal Example: cmp $0x30,%al jl nodigit cmp $0x39,%al jg nodigit digit:... do something... nodigit:... handle error

Extended assembler Dovoluje použití výrazů jazyka C v instrukcích assembleru Programátor specifikuje šablonu assemblerovských instrukcí (viz "mov % %esp,%0;" níže) Překladač v šabloně nahradí parametry (např. %0 níže) reálnými operandy (registry, adresami v paměti,...) na základě specifikovaných omezení Kompilátor se nesnaží porozumět tomu, co programátor do šablony napsal. Proto musí programátor říct kompilátoru, jak dané instrukce mění stav programu. // Compile with gcc - m32 - O2 - Wall... #include <stdio.h> int main() { void *stack_ptr; asm volatile ("mov %%esp,%0;" : "=g" (stack_ptr)); printf("value of ESP register is %p\n", stack_ptr); return 0; }

Syntaxe extended assembleru #include <stdio.h> int main(int argc, char *argv[]) { int result, op1 = 4, op2 = 2; asm volatile ( "mov %1,%0;" "add %2,%0;" : "=r" (result) : "r" (op1), "r" (op2) : "cc"); printf("result = %d\n", result); return 0; } Syntaxe extended assembleru: asm ( šablona instrukcí : výstupní operandy /* nepovinné */ : vstupní operandy /* nepovinné */ : co je instrukcemi změněno /* nepov. */ ); Syntaxe operandů za : je: <omezení> (<výraz v C>),... každý operand se vztahuje k odpovídajícímu parametru (%<číslo>) v šabloně (vlevo %0 odpovídá result, %1 odpovídá op1 a %2 odpovídá op2). https://gcc.gnu.org/onlinedocs/gcc/extended-asm.html Compiles into (see objdump -d...):... 80482c0: ba 02 00 00 00 mov $0x2,%edx 80482c5: b8 04 00 00 00 mov $0x4,%eax 80482ca: 89 c0 mov %eax,%eax 80482cc: 01 d0 add %edx,%eax...

Omezení v extended assembleru V seznamu vstupních nebo výstupních operandů říkají překladači, jaké registry nebo jiné operandy může použít s danou instrukcí v šabloně https://gcc.gnu.org/onlinedocs/gcc/constraints.html Obecné r any register asm ( mov %0,%eax : : r (var) : a ) se může přeložit jako mov %ebx,%eax s tím, že překladač zajistí, že v registru ebx bode hodnota proměnné var. m memory location asm ( mov %0,%eax : : m (var) : a ) se přeloží jako mov ($var),%eax (v instrukci bude přímo adresa proměnné var). i immediate operand asm ( mov %0,%eax : : i (123) : a ) se přeloží mov $123,%eax Architekturně (HW) závislé a *ax register (for x86) b *bx register (for x86) Modifikátory: = před omezením říká, že se jedná o výstupní operand.

Omezení v extended assembleru Za 3. dvojtečkou (co je změněno) říkají překladači, co instrukce mění. Může to být např. konkrétní registry a, b, atd. To je nutné jen pokud nejsou uvedeny jako vstup nebo výstup (za 1. nebo 2. dvojtečkou) cc říká, že instrukce modifikují registr příznaků (condition codes, někdy také označovaný jako flags). Toto je potřeba uvést, například pokud šablona obsahuje instrukci add. Ta totiž nastavuje příznak carry podle toho, jestli výsledek sčítání přetekl nebo ne. memory říká, že instrukce čtou nebo zapisují do paměti (na jiná místa než ta uvedená jako vstup nebo výstup) Pokud toto neuvedete a nemáte nebo v navazujícím kódu nepoužijete výstupní operand (omezení s = ), překladač si může myslet, že daný kus assembleru nedělá nic užitečného a vyoptimalizuje (smaže) ho. Toto budete potřebovat minimálně pro systémová volání read a write, která pracují s pamětí předanou jádru pomocí ukazatele.