Metody Realizacji Języków Programowania

Podobne dokumenty
Metody Realizacji Języków Programowania

Architektura komputerów. Asembler procesorów rodziny x86

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

Architektura Systemów Komputerowych

Metody Realizacji Języków Programowania

Architektura komputerów

Programowanie Niskopoziomowe

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

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

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

Architektura komputerów

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

Metody Realizacji Języków Programowania

Ćwiczenie 3. Konwersja liczb binarnych

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

002 Opcode Strony projektu:

Struktura i działanie jednostki centralnej

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

Programowanie w asemblerze Środowiska 64-bitowe

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

Programowanie w asemblerze Środowiska 64-bitowe

Programowanie Niskopoziomowe

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

Architektura komputerów

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

Programowanie Niskopoziomowe

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

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

PROGRAMOWANIE NISKOPOZIOMOWE

Przepełnienie bufora i łańcuchy formatujace

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

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

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

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

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

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

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

Architektura systemów komputerowych. Lista instrukcji procesora

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

Programowanie komputera

Podstawy programowania w języku C i C++

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

Ćwiczenie nr 6. Programowanie mieszane

Architektura komputerów

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

Assembler w C++ Syntaksa AT&T oraz Intela

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

Programowanie Niskopoziomowe

Adam Kotynia, Łukasz Kowalczyk

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

Wstęp do Reverse engineeringu

Architektura Systemów Komputerowych

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

Programowanie niskopoziomowe

Architektura typu Single-Cycle

1. Operacje logiczne A B A OR B

Programowanie mikrokontrolerów (CISC)

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

Technika mikroprocesorowa I Wykład 2

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

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

Programowanie niskopoziomowe

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

Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler

Budowa wnętrza procesora x86

Lista instrukcji mikroprocesora Programowanie w assemblerze

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

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

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

Podstawy Informatyki

Jerzy Nawrocki, Wprowadzenie do informatyki

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

Inżynieria wsteczna oraz znajdowanie i wykorzystywanie luk w aplikacjach natywnych na architekturach x86 i x86-64

Programowanie w asemblerze Architektury równoległe

Lista rozkazów mikrokontrolera 8051

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

PROGRAMOWANIE NISKOPOZIOMOWE

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

Programowanie w asemblerze Architektura procesora

Sterowanie pracą programu

Programowalne układy logiczne

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

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

Zuzanna Hartleb i Artur Angiel

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

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

Analizator syntaktyczny (parser) jest funkcja

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

ARCHITEKTURA PROCESORA,

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

Techniki mikroprocesorowe i systemy wbudowane

Programowanie w asemblerze Aspekty bezpieczeństwa

Sprzęt i architektura komputerów

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Dodawanie liczb binarnych

Mikrokontroler ATmega32. Język symboliczny

Notatka Aplikacyjna NA 03006PL Maj 2016

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

Arytmetyka stałopozycyjna

Transkrypt:

1/25 Metody Realizacji Języków Programowania Bardzo krótki kurs asemblera x86 Marcin Benke MIM UW 23 października 2013

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

3/25 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. Architektura x86_64 16 64-bitowych rejestrow: RAX,...,RBP,R8,...,R15. Nadal można używać rejestrów 32-bitowych np. EAX, R8D oznaczaja połówki odpowiednio RAX, R8.

4/25 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/r64) stała (immediate operand, i8/i16/i32/i64), pamięć (m8/m16/m32/m64) Najwyżej jeden z operandów może odwoływać się do pamięci AT&T: rejestry prefiksowane %, stałe prefiksowane znakiem $

/25 Rozmiary operandów x86 może operować na wartościach 8, 16, 32 lub 64-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, dword lub qword, np (NASM) MOV [ESP], DWORD hello W składni AT&T przez sufiks b (8), w (16), l (32), lub q (64) instrukcji, np. movl $hello, (%esp) NB kod generowany przez gcc zawsze dodaje takie sufiksy. Tutaj pomijamy te sufiksy tam, gdzie nie sa niezbędne.

/25 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: [baza+mnożnik*indeks+przesunięcie] AT&T: przesunięcie(baza,indeks,mnożnik) Najczęściej używamy trybu baza + przesunięcie, np. mov 8(%ebp), %eax

/25 Przypisanie Intel: MOV dest, src na przykład: MOV EAX, [EBP-20h] AT&T: mov src, dest na przykład mov -0x20(%ebp), %eax Instrukcje przesyłania 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.

8/25 PUSH src np. Operacje na stosie PUSH [EBP+4] PUSH DWORD 0 push %ebp pushl 0 POP dest np. pop 4(%ebp) POP [EBP+4] 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.

9/25 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

0/25 Operacje arytmetyczne - przykłady dodaj zawartość rejestru ESI do komórki pod adresem EBP+6: Intel: ADD [EBP+6], ESI AT&T: add %esi, 6(%ebp) Odejmij 7 od EAX Intel: SUB EAX, 7 AT&T: sub $7, %eax

11/25 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.

2/25 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. IDIV zajmuje 43 cykle procesora [ADD r32, r32 2 cykle; IMUL 9 38, dokładniej max( log m, 3) + 6 dla mnożnika m].

13/25 Przykład (AT&T): Dzielenie 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 IDIV DWORD [ESP+24] Z użyciem CDQ: movl cdq idivl 28(%esp), %eax 24(%esp)

14/25 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

15/25 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

6/25 int cmp(int a, int b) { if(a>b) return 7; } może zostać skompilowane do Porównania przykład cmp: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax cmpl 12(%ebp), %eax # cmp a, b jng L4 # skok gdy warunek NIE zachodzi movl $7, %eax movl %eax, %edx movl %edx, %eax L4: popl %ebp ret

17/25 Funkcje CALL adres kładzie na stosie adres następnej instrukcji i skacze pod adres RET skok pod adres na szczycie stosu (zdejmuje go) To jest ten sam stos na którym operuja PUSH/POP/ESP. Funkcje zewnętrzne (tylko Intel) i globalne trzeba deklarować, np Intel: extern puts global main AT&T:.extern puts.globl main

Protokół wywołania funkcji x86 Istnieje wiele wariantów, tu zajmiemy sie protokołem uzywanym przez GCC+libc (aka cdecl ). przy wywołaniu na stosie argumenty od końca, ślad powrotu wołajacy zdejmuje argumenty przy powrocie wynik typu int/wskaźnik w EAX rejestry EBP,ESI,EDI,EBX musza być zachowane Standardowy prolog: pushl %ebp movl %esp, %ebp subl $x, %esp /* zmienne lokalne */ Standardowy epilog: movl %ebp, %esp /* pomijane jesli nop */ popl %ebp ret 18/25 Więcej o protokołach wywołania funkcji na kolejnych wykładach.

9/25 Przykład stałe napisowe hello:.string "Hello\n".globl main main: pushl %ebp movl %esp, %ebp pushl $hello call puts movl $0, %eax # add $4, %esp # patrz nast. instrukcja movl %ebp, %esp popl %ebp ret

20/25 Protokół wywołania x86_64 Liczby całkowite przekazywane w EDI,ESI,EDX,ECX,R8D,R9D wskaźniki przekazywane w RDI,RSI,RDX,RCX,R8,R9 jesli więcej argumentów, lub większe niż 128-bitowe, to na stosie przy powrocie wynik typu int w EAX; wskaźnik w RAX rejestry RBP, RBX i R12 do R15 musza być zachowane RSP 0 mod 16 (przed CALL, czyli 8 po CALL) Standardowy prolog: pushl %rbp movl %rsp, %rbp subl $x, %rsp /* zmienne lokalne */ Standardowy epilog: movl %rbp, %rsp /* pomijane jesli nop */ popl %rbp ret

1/25 Protokół wywołania funkcji x86_64 przykład Liczby całkowite przekazywane w EDI,ESI,EDX,ECX,R8D,R9D wskaźniki przekazywane w RDI,RSI,RDX,RCX,R8,R9 hello:.asciz "Hello\n".globl main main: pushq %rbp mov %rsp, %rbp movq $hello, %rdi call puts mov $0, %eax popq %rbp ret

22/25 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 EAX jest dodatnie/ujemne/zero Intel: TEST EAX,EAX AT&T: test %eax, %eax

3/25 Sztuczki LEA ładuje do rejestru wyliczony adres (baza+n*idx+d). Podstawowe użycie: pobranie adresu l-wartości LEA EAX, [EBP+8] Inne użycia: operacje arytmetyczne 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 w rejestrze/pamięci może być użyte do realizacji metod wirtualnych JMP r/m32 skok jak wyżej, może być użyty do implementacji instrukcji switch.

24/25 Mac OS X gcc -o hello hello64.s clang -cc1as: fatal error: error in backend: 32-bit absolute addressing is not supported in 64-bit mode Rozwiazanie: hello:.asciz "Hello\n".globl _main _main: pushq %rbp mov %rsp, %rbp lea hello(%rip), %rdi call _puts mov $0, %rax leave ret

25/25 sumto w asemblerze 80x86 (gas) sumto:.l5:.l4:.globl sumto movl 4(%esp), %ecx ; ecx = n xorl %eax, %eax ; eax = 0 testl %ecx, %ecx ; ecx <=0? jle.l4 ; skok do L4 xorl %edx, %edx ; edx = 0 addl $1,%edx ; edx += 1 addl %edx, %eax ; eax += edx cmpl %edx, %ecx ; edx!= n? jne.l5 ; skok do L5 ret ; powrót