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

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

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

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

Strojový kód, assembler, emulátor počítača

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

ISU Cvičení 7. Marta Čudová

ISU Cvičení 3. Marta Čudová

Operačný systém Úvodná prednáška

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

x86 assembler and inline assembler in GCC

REbejs. 1. workshop (draft0)

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

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

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

Príklad ponuky: Riešenie: vrch. hodnota 3 hodnota 2 hodnota 1

Jednoduchá správa pamäte

Programovanie v jazyku C - to chce dynamiku

Segmentovanie a stránkovanie v procesoroch Intel Pentium

Užívateľská príručka systému CEHZ. Základné zostavy Farmy podľa druhu činnosti

Základy algoritmizácie a programovania

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

Programovanie v jazyku C - pole treba poorat...

Prevody z pointfree tvaru na pointwise tvar

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

Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/YOS: Přednáška II. 14. říjen, / 26

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

Obsah. Reprezentácia údajov v počítači. Digitalizácia číselnej informácie. Digitalizácia znakov a textovej informácie.

Predaj cez PC pokladňu

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

2. Nahratie mapy pre Locus Map - formát sqlite alebo mbtiles do zariadenia (telefón, tablet) s OS Android.

Adresní mody procesoru

ISU Cvičení 2. Marta Čudová

VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

Zvyškové triedy podľa modulu

Import Excel Univerzál

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

MATLAB (1) - úvod do programovania vedeckých problémov. LS 2017, 8.predn.

Programovanie.NET, C++ - najbližšie termíny:

Program "Inventúra program.xlsm"

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

Katolícka univerzita v Ružomberku Pedagogická fakulta. programovací jazyk ASSEMBLER. 1. ročník IN-FY

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

KOMISNÝ PREDAJ. Obr. 1

Programovanie I. Úvod do programovania Mgr. Stanislav Horal, Katedra informatiky, FPV, UCM

OBOZNÁMTE SA S VAŠÍM TELEFÓNOM

Hromadná korešpondencia v programe Word Lektor: Ing. Jaroslav Mišovych

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

ISU Cvičení 2. Marta Čudová

Mgr. Stanislav Fila, psychológ CPPPaP Banská Bystrica Centrum pedagogicko-psychologického poradenstva a prevencie (bývalá KPPP) Banská Bystrica

Objektovo orientované programovanie v C# ERIK KUČERA METÓDY VÝPOČTOVEJ INTELIGENCIE PREDNÁŠKA 3

Skákalka. Otvoríme si program Zoner Callisto, cesta je Programy Aplikácie Grafika Zoner Callisto.

UŽÍVATEĽSKÁ PRÍRUČKA. TCP Optimizátor

Struktura programu v době běhu

M úlohy (vyriešené) pre rok 2017

Programovanie v jazyku C - funkcie a makra

Multiplexor a demultiplexor

Popis instrukční sady procesoru ADOP

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

Konfigurácia IP Bell 02C Dverný vrátnik a FIBARO Home Center 2

DOBROPISY. Dobropisy je potrebné rozlišovať podľa základného rozlíšenia: 1. dodavateľské 2. odberateľské

Polia a matice v jazyku C. Michal Kvasnica

Blokové a prúdové šifry

Spracovanie informácií

Zápis predmetov do AiSu na aktuálny akademický rok

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

ALGORITMY A PROGRAMOVANIE VO VÝVOJOVOM PROSTREDÍ LAZARUS. Vývojové prostredie Lazarus, prvý program

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

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

Procesor z pohledu programátora

Finančné riaditeľstvo Slovenskej republiky

STRUČNÝ NÁVOD NA OBSLUHU DATALOGERA KIMO KT110 / 150

Architektura počítačů

Aritmetické operácie v rôznych číselných sústavách. Ľudmila MACEKOVÁ, KEMT-FEI-TUKE, sep. 2017

Dodanie tovaru a reťazové obchody Miesto dodania tovaru - 13/1

Import cenových akcií FRESH

Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu?

AudaNEXT. Najčastejšie dotazy v súvislosti s migráciou na platformu. AudaNEXT II

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

Hodnotenie záverečnej práce

Total Commander. Základné nastavenia

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

Naformátuj to. Naformátuj to. pre samoukov

Konstruktory a destruktory

Iracionálne rovnice = 14 = ±

TELCO PH 578. telefónny prístroj. Návod na obsluhu Návod na obsluhu Návod na obsluhu VLASTNOSTI:

Programovanie v jazyku C - ti to zratam...

Moderné vzdelávanie pre vedomostnú spoločnosť/projekt je spolufinancovaný zo zdrojov EÚ. Grafy

Automatický timer pre DX7 návod na inštaláciu a manuál

Tlač do PDF a odosielanie dokladov cez . OBSAH

Pozičné číselné sústavy. Dejiny. Číselná sústava je spôsob, akým sú zapisované čísla pomocou znakov (nazývaných cifry).

MAIS. Verejný portál - kalendárny rozvrh. Používateľská minipríručka pre používateľov systému MAIS. APZ Bratislava

Kontrola väzieb výkazu Súvaha a Výkaz ziskov a strát Príručka používateľa

Vysoké školy na Slovensku Prieskum verejnej mienky

Ak stlačíme OK, prebehne výpočet a v bunke B1 je výsledok.

Mgr. Stanislav Fila, psychológ CPPPaP Banská Bystrica Centrum pedagogicko-psychologického poradenstva a prevencie (bývalá KPPP) Banská Bystrica

Více o konstruktorech a destruktorech

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Návod k servisnému programu pre fiskálny modul FM2000. manuál. (c)varos

KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO ASSEMBLER VÝVOJ TOHOTO UČEBNÍHO TEXTU JE SPOLUFINANCOVÁN

Transkript:

Úroveň strojového kódu procesor Intel Pentium Zásobník a konvencie volania Práca so zásobníkom Prenos parametrov do funkcie konvencia cdecl Aktivačný záznam procedúry Volanie služby Windows - konvencia stdcall Konvencia fastcall Praktické programovanie assemblerových procedúr Autor: Peter Tomcsányi, Niektoré práva vyhradené v zmysle licencie Creative Commons http://creativecommons.org/licenses/by-nc-sa/3.0/

Práca so zásobníkom Zásobník je údajová štruktúra LIFO - Last In, First Out Má definované operácie PUSH (pridaj do zásobníka) a POP (vyber zo zásobníka) Zásobník je vhodná dátová štruktúra pre niektoré typy algoritmov Načo je zásobník v strojovom kóde? Na ukladanie návratových adries podprogramov Na ukladanie lokálnych premenných Na ukladanie medzivýsledkov aritmetických výpočtov Implementácia zásobníka v procesoroch Intel Pentium Je uložený v časti pamäti Adresa jeho vrcholu je uložená v registri ESP Rastie smerom do nižších adries

Explicitné použitie zásobníka Programátor môže používať zásobník na uloženie akýchkoľvek údajov: Ukladanie medzivýsledkov pri výpočte zložitých výrazov keď nie je dosť registrov Uchovanie registrov keď ich dočasne treba na niečo iné PUSH EAX Ulož EAX do zásobníka POP EBX Vyber EBX zo zásobníka PUSHFD Ulož EFLAGS do zásobníka POPFD Vyber EFLAGS do zásobníka

Príklad použitie zásobníka najprv v C Naprogramujte funkciu: void str_c(unsigned long x, char result[]) ktorá prevedie číslo x do znakovej reprezentácie v poli result. Teda pre vstup x=289 bude po zavolaní funkcie v poli result uložený reťazec "289". Kratší zápis: stack[i++] = x % 10; Kratší zápis: *p++ = stack[--i] + '0'; void str_c(unsigned long x,char result[]) { char stack[11]; // long ma max. 10 cifier int i; char *p; // uloz zvysky po deleni 10 do stack i = 0; do { stack[i] = x % 10; i++; x = x / 10; while (x!= 0); // prepis zo stack do result p = result; do { i--; *p = stack[i] + '0'; // plus kod nuly *p++; while (i > 0); *p = 0; // na konci znak s kodom 0

Príklad použitie zásobníka v assembleri Naprogramujte assemblerovú funkciu: void str(unsigned long x, char result[]) ktorá prevedie číslo x do znakovej reprezentácie v poli result. inštrukcia div s 32-bitovým operandom vydelí spojené registre EDX:EAX operandom a uloží podiel do EAX a zvyšok do EDX asm { mov eax, x mov ebx, 10 mov ecx, 0 a1: mov edx, 0 div ebx push edx // do zasobnika inc ecx cmp eax, 0 jne a1 mov ebx, result a2: pop eax // zo zasobnika add eax, '0' mov [ebx], eax inc ebx loop a2 mov [ebx], 0

Implicitné použitie zásobníka Pocitaj: ADD ECX,ECX ADD ECX,10 MOV EAX,ECX RET F: MOV ECX,10 CALL Pocitaj MOV EBX,EAX MOV ECX,20 CALL Pocitaj ADD EAX,EBX RET Volanie podprogramu - do zásobníka sa uloží obsah EIP a do EIP sa uloží adresa podprogramu. Návrat z podprogramu - EIP sa vyberie zo zásobníka int pocitaj(int x) { return 2*x + 10; int f (){ return pocitaj(10)+pocitaj(20); Program v assembleri robí to isté, čo program v C, ale skutočný preklad z jazyka C by bol iný (vysvetlíme neskôr)

Narábanie s bitmi registra EFLAGS Niektoré bity registra EFALGS sa dajú meniť špeciálnymi inštrukciami: Je to napríklad bit CF: STC - Nastav CF na 1 CLC - Nastav CF na 0 CMC - Neguj CF alebo bit IF STI - Nastav IF na 1 (teda povoľ prerušenia) CLI - Nastav IF na 0 (teda zakáž prerušenia)

Nastavenie Visual Studia pre ďalšie ukážky

Parametre funkcií Zoberme Šiesty príklad z minulej prednášky, breakpoint na prvú inštrukciu, Run (F5), po zastavení na breakpointe zvoliť Debug/Windows/Disassembly. V záložke Disassembly pravý klik, zaškrtnúť Show line numbers a Show symbol names: riadky začínajúce číslom riadku a dvojbodkou zobrazujú zdrojový program 99: asm { explicitné určenie dĺžky 100: mov ebx, a // p = a; operandu (byte, word, dword) 00F74934 mov ebx,dword ptr [a] 101: mov edx, x // disassembler nám stále 00F74937 mov edx,dword ptr [x] ukazuje názvy parametrov riadky začínajúce adresou zobrazujú preložený strojový kód vyjadrený v assembleri (disassemblovaný) V záložke Disassembly pravý klik, odškrtnúť Show symbol names: 99: asm { 100: mov ebx, a // p = a; 00914934 mov ebx,dword ptr [ebp+8] 101: mov edx, x // 00914937 mov edx,dword ptr [ebp+10h] teraz vidíme skutočnú adresu bázované adresovanie registrom EBP. vysvetlenie nasleduje na ďalších stranách

smer rastu zásobníka Bázovaná adresa Jednoduchá lokálna premenná alebo parameter Parametre aj lokálne premenné sú uložené v zásobníku. Register EBP pomáha pri adresovaní lokálnych premenných. PUSH EBP MOV EBP,ESP SUB ESP,4 void p(long i) { long j;... j = i + 1;... int main() { p(12); PUSH 12 CALL p ADD ESP, 4 2. Volaný uloží EBP, nastaví EBP a urobí miesto pre lok. premenné. Tým dobuduje svoj aktivačný záznam MOV EBX,[EBP+8] INC EBX MOV [EBP-4],EBX MOV ESP,EBP POP EBP RET 1. Volajúci uloží do zásobníka paremeter (PUSH 12) a návratovú adresu (CALL p). Tým sa vytvorí časť aktivačného záznamu pre p. Aktivačný záznam (Stack frame) je úsek zásobníku, ktorý obsahuje informácie jedného vyvolania funkcie. Aktivačný záznam našej funkcie p: EBP+8 EBP+4 EBP EBP-4 ESP návr. adresa staré EBP 3. Parametre a lokálne premenné v zásobníku sa adresujú relatívne k registru EBP, nazývame to bázovaná adresa 4. Volaný odstráni tú časť aktivačného záznamu, ktorú vytvoril: Zníži zásobník, vyberie staré EBP (na vrch zásobníka sa dostane návratová adresa) a vykoná návrat (RET). 5. Volajúci odstránený zo zásobníka parameter a tým je odstránený celý aktivačný záznam funkcie p. i j

smer rastu zásobníka Bázovaná a indexovaná adresa (2) Prvky lokálnych polí Ak je lokálna premenná pole, môžeme pri jej indexovaní použiť bázované a indexované adresovanie s registrom EBP ako bázou. void p2(long i, long j) { long a[2]; PUSH EBP... MOV EBP,ESP SUB ESP,8 a[i] = j+1;... int main() { p2(1,89); MOV EAX,[EBP+12] INC EAX MOV ECX,[EBP+8] MOV [EBP-8+ECX*4],EAX MOV ESP,EBP POP EBP RET PUSH 89 PUSH 1 CALL P ADD ESP,8 4 je sizeof long EPB-8 je adresa začiatku poľa a Stack frame funkcie p2: EBP+12 EBP+8 EBP+4 EBP EBP-4 EBP-8 ESP j i návr. adresa staré EBP a[1] a[0] parametre sa dávajú do zásobníka v opačnom poradí než sú zapísané vo volaní odstránenie parametrov zo zásobníka. Toto sa nazýva konvencia volania (calling convention) cdecl a používa ho prevažná väčšina kompilátorov jazyka C. Ale existujú aj iné konvencie volania...

Úloha z cvičenia (trochu zmenená) Naprogramujte assemblerovú funkciu: unsigned char ntybitx(unsigned char n, unsigned long x) Jej výsledkom je hodnota n-tého bitu čísla x v zmysle číslovania bitov podľa mocnín dvojky, ktorú daný bit zastupuje. Výsledkom je 0 alebo 1. Môžete predpokladať, že nedostanete nesprávny vstup, teda, že n<=31 unsigned char ntybitx(unsigned char n, unsigned long x) { asm { mov eax,x mov cl,n shr eax,cl and eax,1

Vyvolanie funkcie z assembleru Naprogramujte assemblerovú funkciu: void vyber_bity(unsigned long vstupy[], unsigned char vystupy[], unsigned char bit, long n) Pre všetky hodnoty v n-prvkovom poli vstupy vyvolá funkciu ntybitx(bit,vstupy[i]) a výsledok priradí do vystupy[i]. asm { mov esi,vstupy mov edi,vystupy mov ecx,n a1: push ecx // uschovanie registrov pred volanim push esi // pre istotu uchovame vsetku pouzivane registre push edi push [esi+ecx*4-4] // druhy parameter funkcie push bit // prvy parameter funkcie call ntybitx // volanie funkcie add esp,8 // odstranenie parametrov pop edi // obnovenie uschovanych registrov pop esi pop ecx mov [edi+ecx-1],al // zapisanie vysledku do pola vystupy loop a1

Volanie služby Windows Výpis na konzolu Potrebujeme volať dve služby: GetStdHandle WriteConsoleA Musíme pridať #include <windows.h> Volanie služieb Windows používa inú konvenciu volania stdcall: parametre sa dávajú do zásobníka rovnako, ako v konvencii cdecl ale o odstránenie parametrov sa stará volaná funkcia

Výpis na konzolu vo Windows Naprogramujte assemblerovú funkciu: void hello_windows(char sprava[], long n) Ktorá vypíše sprava o dĺžke n znakov na konzolu Windows (teda do "čiernej obrazovky") void hello_windows(char sprava[], long n) { asm { push -11 call GetStdHandle // h=getstdhandle(std_output_handle) push 0 push 0 Keďže je je to volanie stdcall, po volaní neodstraňujeme parametre, teda push n nemeníme ESP. push sprava push eax call WriteConsoleA // WriteConsoleA(h,sprava,n,NULL,NULL)

Konvencia volania _fastcall Na prenos prvých dvoch parametrov použije registre ECX a EDX Ostatné parametre sa prenesú ako pri cdecl int _fastcall pocitaj(int x) { return 2 * x + 10; int f() { return pocitaj(10) + pocitaj(20); int f() { 003F3CA0 push ebp 003F3CA1 mov ebp,esp 003F3CA3 push esi return pocitaj(10) + pocitaj(20); 003F3CA4 mov ecx,0ah 003F3CA9 call pocitaj (03F1235h) 003F3CAE mov esi,eax 003F3CB0 mov ecx,14h 003F3CB5 call pocitaj (03F1235h) 003F3CBA add eax,esi 003F3CBC pop esi 003F3CBD pop ebp 003F3CBE ret

Priama adresa MOV EAX,[12840] Nepriama adresa MOV EDX,[EBX] Indexovaná adresa Adresovanie pamäte Zhrnutie (1) MOV [1246+EAX*4],ECX Bázovaná adresa MOV EAX,[EBP+10] Indexovaná a bázovaná adresa (najzložitejší možný prípad) MOV EDX,[EBP+10+ECX*4] Jeden register (EAX, EBX, ECX,EDX, ESI, EDI, ESP alebo EBP) Konštanta (kladná alebo záporná) Druhý register Násobiaci faktor (len 1, 2, 4 alebo 8)

Adresovanie pamäte Zhrnutie (2) Najviac jeden operand smie byť v pamäti MOV [EAX+2],[EBX+4] Použitie segmentových registrov MOV EAX,ES:[EAX+4] Niekedy kompilátor nevie aký dlhý je operand: INC [EDX+8] INC BYTE PTR [EDX+8] INC WORD PTR [EDX+8] INC DWORD PTR [EDX+8] nie je jasná dĺžka operandu operand je jeden bajt operand je dvojbajt operand je štvorbajt