Programowanie Niskopoziomowe



Podobne dokumenty
Programowanie Niskopoziomowe

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

Ćwiczenie nr 6. Programowanie mieszane

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

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

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

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

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

Ćwiczenie 3. Konwersja liczb binarnych

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

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Architektura komputerów. Asembler procesorów rodziny x86

Architektura komputerów

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

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Programowanie w asemblerze Środowiska 64-bitowe

Lab 9 Podstawy Programowania

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

Metody Realizacji Języków Programowania

Struktura i działanie jednostki centralnej

PROGRAMOWANIE NISKOPOZIOMOWE

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

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

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

Języki i techniki programowania Ćwiczenia 2

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

Programowanie niskopoziomowe

ZASADY PROGRAMOWANIA KOMPUTERÓW

Zuzanna Hartleb i Artur Angiel

Wykład 4: Klasy i Metody

Język ludzki kod maszynowy

Paradygmaty programowania

Ćwiczenie nr 4. Zasady kodowania podprogramów

Programowanie Niskopoziomowe

Struktury. Przykład W8_1

Assembler w C++ Syntaksa AT&T oraz Intela

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

PRYWATNA WYŻSZA SZKOŁA BUSINESSU, ADMINISTRACJI I TECHNIK KOMPUTEROWYCH S Y L A B U S

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Programowanie mikrokontrolera 8051

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

Programowanie Niskopoziomowe

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Programowanie na poziomie sprzętu. Programowanie w Windows API

PROGRAMOWANIE NISKOPOZIOMOWE

Przydział pamięci. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

2.1. W architekturze MIPS, na liście instrukcji widzimy dwie instrukcje dotyczące funkcji: .text main: la $a0, string1 # drukuj pierwszy łańcuch

Tablice, funkcje, wskaźniki - wprowadzenie

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Programowanie Niskopoziomowe

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Adam Kotynia, Łukasz Kowalczyk

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

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

002 Opcode Strony projektu:

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

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

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Programowanie komputerowe. Zajęcia 3

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

Architektura komputerów

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

Podstawy Informatyki Języki programowania c.d.

Metody Realizacji Języków Programowania

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Zarządzanie pamięcią w systemie operacyjnym

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Kompilator języka C na procesor 8051 RC51 implementacja

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

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]

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Technika mikroprocesorowa I Wykład 2

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Księgarnia PWN: Włodzimierz Stanisławski, Damian Raczyński - Programowanie systemowe mikroprocesorów rodziny x86

Podstawy programowania w języku C++

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Tablice, funkcje - wprowadzenie

Język C++ zajęcia nr 2

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Wstęp do programowania. Wykład 1

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Wskaźniki. Informatyka

Podstawy programowania w języku C++

PMiK Programowanie Mikrokontrolera 8051

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

STRUKTURA I ORGANIZACJA STOSU (FILO- First In Last Out) Rejestry stosu: SS i SP (Stack Segment i Stack Pointer)

Referencje do zmiennych i obiektów

Język C zajęcia nr 11. Funkcje

Podstawy programowania w języku C

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

Wskaźniki w C. Anna Gogolińska

kiedy znowu uzyska sterowanie, to podejmuje obliczenie od miejsca, w którym poprzednio przerwała, i z dotychczasowymi wartościami zmiennych,

Transkrypt:

Programowanie Niskopoziomowe Wykład 11: Procedury zaawansowane Dr inż. Marek Mika Państwowa Wyższa Szkoła Zawodowa im. Jana Amosa Komeńskiego W Lesznie

Plan Wstęp Ramki stosu Rekurencja INVOKE, ADDR, PROC, PROTO Programy wielomodułowe Kod pośredni Javy

Wstęp Tematyka związana z programowaniem niskopoziomowym z punktu widzenia HLL ramki stosu zakres i czas życia zmiennych parametry stosu przekazywanie parametrów przez wartość i przez referencję tworzenie i inicjowanie zmiennych lokalnych na stosie rekurencja pisanie programów wielomodułowych modele pamięci dyrektywy INVOKE, PROC i PROTO operatory USES i ADDR

Terminologia Różnice terminologiczne podprogram funkcja (C, C++) metoda (Java) procedura (MASM, Pascal) wartości przekazywane do podprogramu argumenty wartości otrzymane przez podprogram parametry

Ramki stosu Ramka stosu (rekord aktywacyjny) jest obszarem pamięci stosu służącym do: przekazania argumentów, zapamiętania adresu powrotu z podprogramu przechowywania zmiennych lokalnych zapamiętywania zawartości rejestrów

Sekwencja tworzenia ramki stosu Odłożenie na stosie argumentów przekazywanych do podprogramu Wywołanie procedury odłożenie adresu powrotu na stosie Początek wykonywania procedury odłożenie na stosie EBP Ustawienie EBP = ESP (od tego momentu EBP pełni rolę adresu bazowego dla wszystkich parametrów podprogramu) Jeśli podprogram zawiera zmienne lokalne, zawartość ESP jest zmniejszana tak, by zarezerwować na stosie miejsce na te zmienne) Jeśli trzeba zapamiętać zawartość pewnych rejestrów, to należy je odłożyć na stos

Parametry na stosie Dwa typy argumentów: argumenty przekazywane przez wartość (zmienne i stałe) argumenty przekazywane przez referencję (adresy zmiennych)

Przekazywanie parametrów przez wartość Kopia wartości jest odkładana na stosie Przykład: w języku C++ int sum = AddTwo(val1, val2); w języku asemblerowym (uwaga odwrotna kolejność) push val2 push val1 call AddTwo stos przed wywołaniem AddTwo(5,6) val2 val1 6 5 ESP

Przekazywanie parametrów przez referencję Na stos odkładany jest adres (offset) zmiennej Przykład: w języku C++ Swap(&val1, &val2); w języku asemblerowym (uwaga odwrotna kolejność) push OFFSET val2 push OFFSET val1 call SWAP stos przed wywołaniem AddTwo(5,6) val2 val1 offset (val1) offset (val2) ESP

Przekazywanie tablicy jako argumentu procedury W językach wysokiego poziomu zawsze przez referencję Przekazywanie przez wartość nieuzasadnione: wymaga odłożenia na stos każdej komórki tablicy z osobna czasochłonne pamięciożerne Przykład (wywołanie podprogramu o nazwie ArrayFill):.data array DWORD 50 DUP(?).code push OFFSET array call ArrayFill

Dostęp do parametrów na stosie Języki wysokiego poziomu stosują różne sposoby inicjacji i dostępu do parametrów podczas wywoływania podprogramu W językach C i C++ wygląda to następująco: prolog zapisanie zawartości EBP i ustawienie nowej wartości EBP wskazującej wierzchołek stosu + ew. odłożenie niektórych rejestrów na stos epilog na zakończenie podprogramu odtworzenie ze stosu zawartości rejestru EBP + instrukcja powrotu RET

Przykład Podprogram w C int AddTwo (int x, int y) { } return x + y; Prolog podprogramu w j. asemblerowym AddTwo PROC push EBP mov EBP, ESP Zawartość stosu po wywołaniu AddTwo(5,6) 6 5 adres powrotu EBP [EBP + 12] [EBP + 8] [EBP + 4] EBP, ESP

Adresowanie tryb bazowy z przesunięciem EBP jest rejestrem bazowym Przesunięcie w postaci stałej 32 bitowe wyniki zwracane na ogół w rejestrze EAX Przykład (procedura AddTwo): AddTwo PROC push ebp mov ebp, esp ; adres bazowy ramki stosu mov eax, [ebp+12] ; drugi parametr add eax, [ebp+8] ; pierwszy parametr pop ebp ret AddTwo ENDP

Adresy symboliczne parametrów Położenie parametrów procedury względem początku ramki jest stałe Adres parametru możemy zastąpić stałą Przykład: y_param EQU [ebp + 12] x_param EQU [ebp + 8] AddTwo PROC push ebp mov ebp,esp mov eax,y_param add eax,x_param pop ebp ret AddTwo ENDP

Błędy przy przekazywaniu parametrów przez stos Wykonanie w pętli kodu: push 6 push 5 call AddTwo może spowodować przepełnienie stosu Przy wywołaniu poniższego programu powstaje błąd (niewłaściwy adres powrotu): main PROC call Example1 exit main ENDP Example1 PROC push 6 push 5 call AddTwo ret Example1 ENDP ; niewłaściwa zawartość stosu!

Czyszczenie stosu Czyszczenie stosu przywrócenie stosu do stanu sprzed wywołania procedury Dwa podejścia: konwencja wywoływania podprogramów języka C konwencja STDCALL

Konwencja wywoływania w C Przykład: Example1 PROC push 6 push 5 call AddTwo add esp,8 ; usuwa arg. ze stosu ret Example1 ENDP Jedna z najprostszych metod polegająca na dodaniu do zawartości rejestru ESP sumy rozmiarów wszystkich parametrów ESP wskazuje wtedy miejsce na stosie, w którym przechowywany jest adres powrotu z podprogramu

Konwencja STDCALL Wykonanie instrukcji RET z parametrem liczbowym równym sumie bajtów zajmowanych na stosie przez parametry procedury, wartość ta dodawana jest do rejestru EBP Przykład: AddTwo PROC push ebp mov ebp,esp ; adres bazowy ramki stosu mov eax,[ebp + 12] ; drugi parametr add eax,[ebp + 8] ; pierwszy parametr pop ebp ret 8 ; czyszczenie stosu AddTwo ENDP

Porównanie konwencji W obydwu przypadkach parametry przekazywane w odwrotnym porządku W STDCALL stos zawsze czyszczony automatycznie, w C użytkownik musi pamiętać o zdjęciu odpowiedniej liczby bajtów ze stosu W C możliwość stosowania zmiennej liczby parametrów podprogramu, w STDCALL brak takiej możliwości

Przekazywanie przez stos argumentów 8- i 16-bitowych W trybie chronionym obszar stosu podlega tym samym ograniczeniom co pozostałe obszary pamięci dostęp do podwójnych słów i zasada wyrównywania do adresów o wielokrotności 4 Zaleca się rozszerzanie wartości 8 i 16 bitowych do 32 bitów Podczas odkładania na stosie stałej instrukcją PUSH nastąpi automatyczne rozszerzenie do 32 bitów Odkładanie na stosie zmiennych o rozmiarze bajta lub słowa spowoduje błąd, wymaga więc od użytkownika rozszerzenia wartości do 32 bitów instrukcją MOVZX (lub MOVSX dla liczby ze znakiem)

Przekazywanie przez stos argumentów dłuższych niż 32 bity 12345678 00ABCDEF adres powrotu EBP Rozmiar argumentu powinien być wielokrotnością podwójnego słowa Istotny jest porządek przekazywania części tego argumentu (najpierw starsza, potem młodsza część) Przykład:.data [EBP+12] [EBP+8] [EBP+4] EBP, ESP longval DQ 1234567800ABCDEFh.code push DWORD PTR longval + 4 ; część starsza push DWORD PTR longval ; część młodsza call WriteHex64

Zapamiętywanie i odtwarzanie rejestrów Zawartość rejestrów używanych wewnątrz procedury powinna być zapamiętana tuż po zapamiętaniu zawartości ESP w EBP i jeszcze przed zarezerwowaniem miejsca dla zmiennych lokalnych Inne podejście może spowodować zmianę offsetu dla istniejących elementów stosu (adresu powrotu i argumentów podprogramu)

Wpływ operatora USES na zawartość stosu Operator USES powoduje odłożenie na stos zawartości rejestrów wymienionym po tym operatorze Asembler podczas kompilacji dodaje na początku procedury odpowiednie instrukcje PUSH, a na końcu procedury odpowiadające im instrukcje POP W takim przypadku stosowanie instrukcji z adresowaniem komórek stosu za pośrednictwem offsetu w postaci stałej spowoduje błędny dostęp do pamięci (stała nie uwzględnia instrukcji PUSH wywołanych operatorem USES) Instrukcje PUSH dodane przez USES wykonywane są przed przypisaniem EBP=ESP, co powoduje kolejny błąd przy dostępie do adresu powrotu i argumentów procedury Błędów tych można uniknąć definiując odpowiednio parametry stosu w dyrektywie PROC

DZIĘKUJĘ ZA UWAGĘ