Metody Realizacji Języków Programowania



Podobne dokumenty
Metody Realizacji Języków Programowania

Architektura komputerów. Asembler procesorów rodziny x86

Architektura Systemów Komputerowych

Programowanie Niskopoziomowe

Architektura komputerów

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Architektura komputerów

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Ćwiczenie 3. Konwersja liczb binarnych

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Programowanie Niskopoziomowe

PROGRAMOWANIE NISKOPOZIOMOWE. Adresowanie pośrednie rejestrowe. Stos PN.04. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Programowanie Niskopoziomowe

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

PROGRAMOWANIE NISKOPOZIOMOWE. Systemy liczbowe. Pamięć PN.01. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Struktura i działanie jednostki centralnej

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

2 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.02 Rok akad. 2011/ / 24

002 Opcode Strony projektu:

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Załącznik do ćwiczenia w środowisku MASM32 wersji 10 Sterowanie przebiegiem wykonania programu

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Architektura komputerów

Zuzanna Hartleb i Artur Angiel

Adam Kotynia, Łukasz Kowalczyk

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

PROGRAMOWANIE NISKOPOZIOMOWE

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

PROGRAMOWANIE NISKOPOZIOMOWE. Struktury w C. Przykład struktury PN.06. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Podstawy programowania w języku C i C++

Lista instrukcji procesora 8051 część 2 Skoki i wywołania podprogramów, operacje na stosie, operacje bitowe

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Optymalizacja wykonania programów sekwencyjnych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Metody Realizacji Języków Programowania

Floating Point Unit Koprocesor umożliwia działania na liczbach ułamkowych (zmiennoprzecinkowych) 8 rejestrów 80-bitowych: st0,,st7 Typy danych

Lista rozkazów mikrokontrolera 8051 część pierwsza: instrukcje przesyłania danych, arytmetyczne i logiczne

Programowanie komputera

Assembler w C++ Syntaksa AT&T oraz Intela

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

Programowanie Niskopoziomowe

Wstęp do Reverse engineeringu

Architektura Systemów Komputerowych

Ćwiczenie nr 6. Programowanie mieszane

Architektura systemów komputerowych Laboratorium 8 Symulator SMS32 Instrukcje skoku i pętle

Architektura systemów komputerowych. Poziom układów logicznych. Układy mnoŝące i dzielące

Przepełnienie bufora i łańcuchy formatujace

Architektura systemów komputerowych. Lista instrukcji procesora

Lista instrukcji mikroprocesora Programowanie w assemblerze

Plan wykładu. Architektura systemów komputerowych. MnoŜenie realizacja sprzętowa (wersja 1) Układy mnoŝące liczby całkowite.

Język programowania: Lista instrukcji (IL Instruction List)

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Programowanie mikrokontrolerów (CISC)

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Architektura komputerów

Zmienne, stałe i operatory

Technika mikroprocesorowa I Wykład 2

Jerzy Nawrocki, Wprowadzenie do informatyki

Architektura typu Single-Cycle

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Wstęp do Programowania, laboratorium 02

Sterowanie pracą programu

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Programowanie w asemblerze Środowiska 64-bitowe

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Lista rozkazów mikrokontrolera 8051

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

1. Pobrać plik masm.zip (Macro Assembler 6.15 & Segmented Executable Linker 5.60) (

Odczyt danych z klawiatury Operatory w Javie

1. Operacje logiczne A B A OR B

Programowanie niskopoziomowe

Parę słów o przepełnieniu bufora.

Dodawanie liczb binarnych

Wprowadzenie do architektury komputerów. Model programowy procesora i jego struktura Procesory CISC i RISC

PROGRAMOWANIE NISKOPOZIOMOWE

. III atyka, sem, Inform Symulator puterów Escape rchitektura kom A

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

Architektura systemów komputerowych Laboratorium 7 Symulator SMS32 Stos, Tablice, Procedury

Programowanie niskopoziomowe

Języki i paradygmaty programowania

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Notatka Aplikacyjna NA 03006PL Maj 2016

Kod hex Instrukcja Opis 37 AAA Koryguj AL po dodawaniu BCD

Podstawy Informatyki

Programowanie w asemblerze Aspekty bezpieczeństwa

2 Przygotował: mgr inż. Maciej Lasota

Budowa wnętrza procesora x86

CPU. Architektura FLAGS Bit: dr Paweł Kowalczyk; DPTNS, KFCS UŁ. SI 16 bit. 16 bit. 16 bit.

Programowanie w asemblerze Architektura procesora

Mikrooperacje. Mikrooperacje arytmetyczne

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

Architektura systemów komputerowych. Arytmetyka maszyn cyfrowych

Sprzęt i architektura komputerów

Mikrokontroler ATmega32. Język symboliczny

Podstawy techniki cyfrowej Mikroprocesory. Mgr inż. Bogdan Pietrzak ZSR CKP Świdwin

Programowanie hybrydowe łączenie C/C++ z asemblerem

Transkrypt:

Metody Realizacji Języków Programowania Bardzo krótki kurs asemblera x86 Marcin Benke MIM UW 10 stycznia 2011 Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 1 / 22

Uwagi wstępne Ten, z konieczności bardzo krótki kurs, nie jest w żadnym wypadku systematycznym wykładem. Wiele aspektów jest pominiętych lub bardzo uproszczonych. Notacja Dla asemblera x86 istnieja dwa istotnie różne standardy notacyjne: Intel oraz AT&T. Pierwszy z nich uzywany jest w oficjalnej dokumentacji Intela oraz przez asemblery takie jak MASM i NASM. Drugi zaś używany jest przez narzędzia GNU: as oraz gcc. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 2 / 22

Rejestry 8 32-bitowych rejestrów: EAX,EDX, EBX,ECX, ESI, EDI, ESP (wskaźnik stosu), EBP (wskaźnik ramki) Flagi Rejestr EFLAGS składa się z pól bitowych zwanych flagami, ustawianych przez niektóre instrukcje i używanych głównie przy skokach warunkowych ZF zero SF znak (sign) CF przeniesienie (carry) OF nadmiar/niedomiar (overflow) Do flag wrócimy przy omówieniu testów i skoków warunkowych. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 3 / 22

Operandy (czyli argumenty instrukcji) Instrukcja składa się z tzw. mnemonika (kodu operacji) oraz 0 2 operandów (argumentów), którymi moga być: rejestr (r32) stała (i8/i16/i32) pamięć (m8/m16/m32) Najwyżej jeden z operandów może odwoływać się do pamięci AT&T: rejestry prefiksowane %, literały całkowite prefiksowane znakiem $ Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 4 / 22

Rozmiary operandów Ze względów (głównie historycznych), i386 może operować na wartościach 8, 16 lub 32-bitowych. Przeważnie z kontekstu wynika jaki rozmiar mamy na myśli, czasem jednak trzeba to explicite wskazać. W składni Intela wskazujemy to poprzedzajac operand prefiksem byte word albo dword, np (NASM) MOV [ESP], DWORD hello W składni AT&T przez sufiks b w lub l instrukcji, np. movl $C0, (%esp) NB kod generowany przez gcc dodaje takie sufiksy do wszystkich instrukcji. Tutaj pomijamy te sufiksy tam, gdzie nie sa niezbędne. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 5 / 22

Tryby adresowania pamięci W ogólności adres może być postaci baza+mnożnik*indeks+przesunięcie, gdzie baza i indeks sa rejestrami na przykład EAX+4*EDI+7 Dodatkowe ograniczenia: ESP nie może być indeksem (pozostałe 7 rejestrów może) dopuszczalne mnożniki: 1,2,4,8 Składnia adresów Intel: [base+index*scale+disp] AT&T: disp(base,index,scale) Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 6 / 22

Instrukcje przesyłania Przypisanie Intel: MOV dest, src na przykład: MOV EAX, [EBP-20h] AT&T: mov src, dest na przykład mov -0x20(%ebp), %eax Instrukcja MOV nie może przesłać między dwoma komórkami pamięci. Zamiana XCHG x, y zamienia zawartość swoich argumentów Instrukcje przesyłania nie zmieniaja flag. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 7 / 22

Operacje na stosie PUSH src np. PUSH [EBP+4] PUSH DWORD 0 push %ebp pushl 0 POP dest np. pop 4(%ebp) POP EBP PUSHA/POPA połóż/odtwórz wszystkie 8 rejestrów. Uwaga: operacje na stosie używaja i automatycznie modyfikuja ESP, stos rośnie w dół PUSH zmniejsza ESP, ESP wskazuje na ostatni zajęty element stosu. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 8 / 22

Operacje arytmetyczne ADD x, y SUB x, y INC x DEC x NEG x Podobnie jak dla MOV, w składni Intela wynik w pierwszym argumencie, w AT&T w drugim Flagi ustawiane w zależności od wyniku. W przypadku przepełnienia ustawiana jest flaga OF Przykład dodaj zawartość rejestru ESI do komórki pod adresem EBP+6: Intel: ADD [EBP+6], ESI AT&T: add %esi, 6(%ebp) Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 9 / 22

Mnożenie mnożenie przez 2 n można wykonac przy pomocy przesunięcia o n bitów w lewo (instrukcja SAL), np mnożenie przez 16 Intel: SAL EAX, 4 AT&T: sal $4, %eax mnożenie ze znakiem: IMUL;mnożna (i iloczyn) musi być w rejestrze, mnożnik w rejestrze lub pamięci Przykład pomnóż ECX przez zawartość komórki pod adresem ESP Intel: IMUL ECX, [ESP] AT&T: imul (%esp), %ecx Specjalna forma z jednym argumentem (mnożnikiem): IMUL r/m32 mnożna w EAX, wynik w EDX:EAX SAL ustawia flagi, IMUL tylko OF, CF. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 10 / 22

Dzielenie dzielenie przez 2 n można wykonac przy pomocy przesunięcia o n bitów w prawo z zachowaniem znaku (instrukcja SAR), np dzielenie przez 256 Intel: SAR EAX, 8 AT&T: sar $8, %eax IDIV y: dzielna w EDX:EAX, dzielnik w rejestrze lub pamięci, iloraz w EAX, reszta w EDX NB: przy dzieleniu dwóch liczb 32-bitowych przed IDIV należy dzielna załadować do EAX, a jej znak do EDX, czyli jeśli dzielna dodatnia to EDX ma zawierać 0, jeśli ujemna to -1. Mozna ten efekt uzyskać przez przesunięcie o 31 bitów w prawo (albo używajac instrukcji CDQ). SAR ustawia flagi, IDIV nie. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 11 / 22

Dzielenie Przykład (AT&T): mov mov sar idivl 28(%esp), %eax $eax, %edx $31, %edx 24(%esp) Przykład: (Intel) MOV EAX, [ESP+28] MOV EDX, EAX SAR EDX, 31 IDIVL [ESP+24] Z użyciem CDQ: movl cdq idivl 28(%esp), %eax 24(%esp) Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 12 / 22

Instrukcje porównania CMP x, y ustawia flagi w zależności od różnicy argumentów ZF jeśli różnica jest 0 SF jeśli różnica jest ujemna OF jeśli różnica przekracza zakres CF jeśli odejmowanie wymagało pożyczki Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 13 / 22

Skoki Skok bezwarunkowy: JMP etykieta Skoki warunkowe w zależności od stanu flag; kody jak wynik CMP Porównania liczb bez znaku: Porównania liczb ze znakiem: Mnemoniki CMP skok gdy... JE/JZ = ZF = 1 JNE/JNZ ZF = 0 JAE/JNB > CF = 0 JB/JNAE < CF = 1 JA/JNBE > (CF or ZF) = 0 JBE/JNA (CF or ZF) = 1 Mnemoniki CMP skok gdy... JG/JNLE > ((SF xor OF) or ZF) = 0 JGE/JNL (SF xor OF) = 0 JL/JNGE < (SF xor OF) = 1 JLE/JNG ((SF xor OF) or ZF) = 1 Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 14 / 22

Porównania przykład int cmp(int a, int b) { if(a>b) return 7; } może zostać skompilowane do cmp: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax cmpl 12(%ebp), %eax jng L4 movl $7, %eax movl %eax, %edx movl %edx, %eax L4: popl %ebp ret # cmp a, b # skocz jeśli warunek NIE zachodzi Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 15 / 22

Protokół wywołania funkcji CALL adres skok, śladem powrotu na stosie RET skok pod adres na szczycie stosu (zdejmuje go) Protokół używany przez gcc oraz libc przy wywołaniu na stosie argumenty od końca, ślad powrotu przy powrocie wynik typu int w EAX, typu double w ST Standardowy prolog: pushl %ebp movl %esp, %ebp subl %esp, $x # zmienne lokalne Standardowy epilog: movl popl ret %ebp, %esp %ebp Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 16 / 22

Przykład stałe napisowe.lc0:.string "Hello\n".globl main main: pushl %ebp movl %esp, %ebp pushl $.LC0 call puts movl $0, %eax leave ret Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 17 / 22

Operacje zmiennoprzecinkowe Dość skomplikowane, przyjmiemy bardzo uproszczony (wręcz nieprawdziwy) model: jeden rejestr ST typu double i operacje: FLD m64 załaduj spod adresu do ST FST m64 zapisz z ST do pamięci FSTP m64 zapisz z ST do pamięci i zwolnij rejestr ST FADD x ST += x (analogicznie FSUB, FMUL, FDIV) FSUBR x ST = x - ST (analogicznie FDIVR) Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 18 / 22

Operacje zmiennoprzecinkowe przykład double dsub(double a, double b) { return a-b; } może zostać skompilowane do dsub: pushl %ebp movl %esp, %ebp fldl 16(%ebp) # b fsubrl 8(%ebp) # a popl %ebp ret Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 19 / 22

Stałe zmiennoprzecinkowe przykład double dcon(double a, double b) { return a / 1.6180339887 ; } może zostać skompilowane do dcon: pushl movl fldl fdivrl popl ret %ebp %esp, %ebp.lc0 8(%ebp) %ebp.lc0:.align 8.float 1.6180339887 Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 20 / 22

Sztuczki Alternatywny epilog: leave ret instrukcja LEAVE przywraca ESP i EBP (istnieje też ENTER, ale jest za wolna) TEST x, y - wykonuje bitowy AND argumentów, ustawia SF i ZF zależnie od wyniku, zeruje OF i CF Najczęstsze użycie: ustalenie czy zawartość rejestru EAX jest dodatnie/ujemne/zero Intel: TEST EAX,EAX AT&T: test %eax, %eax Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 21 / 22

Sztuczki LEA ładuje do rejestru wyliczony adres (który może być postaci może być postaci baza+mnożnik*indeks+przesunięcie). Może być wykorzystane do wykonania jedna instrukcja ciekawych operacji arytmetycznych Przykład EAX := EBX+2*ECX+1 Intel: LEA EAX, [EBX+2*ECX+1] AT&T: lea 1(%ebx,%ecx,2), %eax Skoki pośrednie CALL r/m32 wywołanie funkcji o adresie zawartym w rejestrze/komórce pamięci może być użyte do realizacji metod wirtualnych JMP r/m32 skok jak wyżej, moze być użyty do implementacji instrukcji switch. Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 22 / 22