Architektura komputerów

Podobne dokumenty
Ćwiczenie 3. Konwersja liczb binarnych

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

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

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

Informacje organizacyjne

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

PROGRAMOWANIE NISKOPOZIOMOWE

Adam Kotynia, Łukasz Kowalczyk

Architektura komputerów

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

Programowanie Niskopoziomowe

Programowanie niskopoziomowe

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

Architektura komputerów. Asembler procesorów rodziny x86

Architektura komputerów

Architektura komputerów

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

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.

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

Biblioteka standardowa - operacje wejścia/wyjścia

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Metody Realizacji Języków Programowania

Programowanie Niskopoziomowe

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

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Struktura i działanie jednostki centralnej

Zasady programowania Dokumentacja

Funkcje zawarte w bibliotece < io.h >

Lista instrukcji mikroprocesora Programowanie w assemblerze

Funkcje zawarte w bibliotece < io.h >

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Akademia Górniczo- Hutmicza w Krakowie Katedra Elektroniki WIET

Język ludzki kod maszynowy

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

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

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

2 Przygotował: mgr inż. Maciej Lasota

Assembler w C++ Syntaksa AT&T oraz Intela

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Ćwiczenie nr 6. Programowanie mieszane

Programowanie w asemblerze Uruchamianie programów

1: ////////// 2: // test.c. 3: ssize_t ret = read(fd, buf, nbytes);

Cel wykładu. Przedstawienie działania exploitów u podstaw na przykładzie stack overflow.

Programowanie w asemblerze Aspekty bezpieczeństwa

INFORMATYKA Studia Niestacjonarne Elektrotechnika

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

Lab 9 Podstawy Programowania

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

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

Programming in Assembler. Laboratory manual. Exercise 6

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Języki formalne i techniki translacji

Struktury, unie, formatowanie, wskaźniki

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Return-oriented exploiting

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Architektura komputerów

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

Generatory analizatorów

Sprzęt i architektura komputerów

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

Optymalizacja szelkodów w Linuksie

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Buffer Overflow (art. 2) by h07

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

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

002 Opcode Strony projektu:

Architektura Systemów Komputerowych

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Język C++ wykład VIII

Zuzanna Hartleb i Artur Angiel

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Podstawy programowania w C++

Iteracyjny serwer TCP i aplikacja UDP

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Języki i metody programowania I

Ćwiczenie nr 4. Zasady kodowania podprogramów

Programowanie Niskopoziomowe

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

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

Zajęcia P4. Analizator semantyczny i generator kodu (Pascal)

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

Narzędzia informatyczne w językoznawstwie

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24

Programowalne układy logiczne

Pliki. Informacje ogólne. Obsługa plików w języku C

PROCESORY ARM TRUDNO ZNALEŹĆ PROCESORY O TAK LICZNYCH, ORYGINALNYCH, NOWYCH, POMYSŁOWYCH ROZWIĄZANIACH!

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Przepełnienie bufora i łańcuchy formatujace

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

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

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Faktura Orange z 11 lipca 2014 roku zawierająca złośliwe oprogramowanie ANALIZA

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Transkrypt:

Architektura komputerów Wykład 10 Jan Kazimirski 1

Programowanie w assemblerze x86 c.d. 2

Funkcje systemowe System operacyjny UNIX udostępnia programom usługi za pomocą funkcji systemowych (syscall). Liczba funkcji systemowych jest bardzo duża (1000+), jednak zwykle używany jest niewielki podzbiór. Systemy POSIX-owe udostępniają zbliżoną funkcjonalność i interfejs API, chociaż szczegóły mogą się różnić. 3

Funkcje systemowe c.d. Sposób wywołania funkcji systemowej: Poprzez wywołanie funkcji z biblioteki C Pozwala zachować kompatybilność w przypadku zmiany numeru funkcji lub formatu wywołania. Bezpośrednie wywołanie poprzez przerwanie programowe 0x80 Efektywne omija kod C Numer funkcji przekazywany jest w rejestrze EAX 4

Funkcje systemowe c.d. Przekazywanie argumentów do funkcji systemowej: Poprzez stos metoda Uniksowa Argumenty umieszczane są na stosie Poprzez rejestry stosowana w Linuksie Szybkie nie korzysta ze stosu Argumenty przekazywane są w rejestrach EBX, ECX, EDX, ESI, EDI, EBP Większa liczba argumentów przekazywana jest w postaci struktury (adres jako argument) 5

Funkcja systemowa sys_exit Zakończenie wykonywanego aktualnie procesu Numer funkcji: 1 Argumenty: EBX: kod powrotu z programu Wartość zwracana: brak 6

Dokumentacja funkcji systemowych Lista nazw funkcji systemowych man 2 syscalls Numery funkcji: /usr/include/asm-x86/unistd.h Dokumentacja poszczególnych funkcji: Większość funkcji systemowych ma odpowiadające im funkcje w bibliotece standardowej libc Dokumentacja funkcji bibliotecznych libc dostępna jest jako strony manuala systemowego (man) 7

Dokumentacja funkcji systemowych c.d. Przykład: funkcja sys_exit Dokumentacja: man 2 exit Wywołanie: void _exit(int status) Funkcja ma jeden argument (EBX) Funkcja nie zwraca wartości 8

[1] Program pole kwadratu ;; PROGRAM EX01 ;; Calculate the area of a square segment.data side db 8 ; side length segment.text global _start Kompilacja i wykonanie: nasm -f elf64 -g ex01.asm ld ex01.o./a.out echo $? 64 <- wynik _start: mov al,[side] mul al mov bx,ax mov eax,1 int 0x80 ; load side length to al ; calculate square ; result to bx ; syscall code: sys_exit ; do syscall 9

Podstawowe wejście i wyjście Aby utworzyć jakikolwiek kompletny nietrywialny program trzeba mieć możliwość wprowadzania danych z klawiatury i wyprowadzania wyników na ekran. Można w tym celu zastosować funkcje systemowe działające na strumieniach, oraz standardowe strumienie stdin (wejście) i stdout (wyjście). 10

Funkcja systemowa: sys_write Zapis do pliku o podanym deskryptorze Numer: 4 Składnia: ssize_t write(int fd, const void *buf, size_t count); Uwagi: Deskryptor o numerze 1 to standardowy strumień wyjściowy. 11

Funkcja systemowa: sys_read Odczyt z pliku o podanym deskryptorze Numer: 3 Składnia: ssize_t read(int fd, void *buf, size_t count); Uwagi: Deskryptor o numerze 0 to standardowy strumień wejściowy. 12

[2] Program echo ;; PROGRAM EX02 ;; copy stdin to stdout segment.bss buff resb 120 ; line buffer segment.text global _start _start: mov ecx,buff ; set buffer address loop: mov eax,3 ; sys_read mov ebx,0 ; stdin mov edx,120 ; set buffer size int 0x80 ; syscall - read line mov edx,eax ; set actual line size mov eax,4 ; sys_write mov ebx,1 ; stdout int 0x80 ; syscall - write line jmp loop ; start again 13

[2] Program echo c.d. ;; PROGRAM EX02 ;; copy stdin to stdout segment.bss buff resb 120 ; line buffer segment.text global _start _start: mov ecx,buff ; set buffer address loop: mov eax,3 ; sys_read mov ebx,0 ; stdin mov edx,120 ; set buffer size int 0x80 ; syscall - read line mov edx,eax ; set actual line size mov eax,4 ; sys_write mov ebx,1 ; stdout int 0x80 ; syscall - write line jmp loop ; start again Funkcja systemowa sys_read czyta z pliku o podanym deskryptorze (tu: stdin) linię (odczyt buforowany) i umieszcza ją w buforze. Funkcja zwraca liczbę wczytanych znaków. 14

[2] Program echo c.d. ;; PROGRAM EX02 ;; copy stdin to stdout segment.bss buff resb 120 ; line buffer segment.text global _start _start: mov ecx,buff ; set buffer address loop: mov eax,3 ; sys_read mov ebx,0 ; stdin mov edx,120 ; set buffer size int 0x80 ; syscall - read line mov edx,eax ; set actual line size mov eax,4 ; sys_write mov ebx,1 ; stdout int 0x80 ; syscall - write line jmp loop ; start again Funkcja systemowa sys_write zapisuje do pliku o podanym deskryptorze (tu: stdout) określoną liczbę znaków z bufora. 15

Wczytanie liczby całkowitej Nietrywialny program wymaga zwykle wprowadzania danych w postaci liczbowej. Założenia upraszczające prosty format wejściowy: dwucyfrowa liczba w zakresie 00.. 99. brak kontroli błędów 16

Wczytanie liczby całkowitej c.d. Warunki początkowe: W buforze wskazywanym przez ecx znajdują się dwie cyfry kodowane jako znaki ASCII Algorytm 1. Załaduj 1-szą cyfrę z [ecx] do al 2. Odejmij 48 od al (konwersja ASCII na int) 3. Pomnóż ax przez 10 (przesunięcie dziesiętne w lewo) 4. Załaduj 2-gą cyfrę z [ecx+1] do bl 5. Odejmij 48 od bl (konwersja ASCII na int) 6. Dodaj bx do ax. Warunki końcowe: W eax znajduje się zdekodowana liczba całkowita 17

Wczytanie liczby całkowitej c.d. Kod: sub eax,eax mov al,[ecx] sub al,48 imul ax,10 sub ebx,ebx mov bl,[ecx+1] sub bl,48 add ax,bx ; set eax=0 ; read 1st digit ; convert from ASCII to int ; shift left (decimal) ; set ebx=0 ; read 2nd digit ; convert from ASCII to int ; combine values of digits 18

Wczytanie liczby całkowitej c.d. W przypadku większych programów często poszczególne zadania implementuje się jako osobne funkcje (podprogramy) W assemblerze jest to szczególnie istotne ze względu na złożoność kodu. Do wyodrębnienia fragmentu kodu jako podprogramu można użyć instrukcji CALL i RET. 19

Procedura read_number c.d. read_number: mov eax,3 ; sys_read mov ebx,0 ; stdin mov edx,3 ; set buffer size int 0x80 ; syscall - read line sub eax,eax ; set eax=0 mov al,[ecx] ; read 1st digit sub al,48 ; convert from ASCII to int imul ax,10 ; shift left (decimal) sub ebx,ebx ; set bx=0 mov bl,[ecx+1] ; read 2nd digit sub bl,48 ; convert from ASCII to int add ax,bx ; combine values of digits ret ; return to the caller 20

read_number program główny segment.bss buff resb 10 ; line buffer segment.text global _start _start: mov ecx,buff ; set buffer address call read_number ; read number ; Return decoded number mov ebx,eax ; store number in ebx mov eax,1 ; syscall code: sys_exit int 0x80 ; do syscall 21

Zmienne lokalne Procedura read_number zależy od zewnętrznego bufora w pamięci dostarczonego przez wołający kod. Problemy: Programista korzystający z funkcji może zapomnieć o przydzieleniu miejsca na bufor. Bufor na dane alokowany jest w sposób statyczny (globalnie) a używany tylko w czasie używania funkcji 22

Zmienne lokalne c.d. Procedura read_number powinna korzystać z bufora allokowanego lokalnie tylko na czas działania procedury Rozwiązania: Przydział stron pamięci przez system operacyjny sys_mmap - kosztowne i kłopotliwe! Wykorzystanie stosu 23

read_number wersja 2 read_number: push ebp ; save original ebp mov ebp,esp ; save stack pointer sub esp,16 ; move stack pointer - make "gap" lea ecx,[ebp-16] ; set buffer to stack "gap" mov eax,3 ; sys_read mov ebx,0 ; stdin mov edx,10 ; set buffer size int 0x80 ; syscall - read line sub eax,eax ; set eax=0 mov al,[ecx] ; read 1st digit sub al,48 ; convert from ASCII to int imul ax,10 ; shift left (decimal) sub ebx,ebx ; set bx=0 mov bl,[ecx+1] ; read 2nd digit sub bl,48 ; convert from ASCII to int add ax,bx ; combine values of digits mov esp,ebp ; get original stack pointer pop ebp ; restore original ebp ret ; return to the caller 24

Wyświetlenie liczby całkowitej Podprogram wyświetlający liczbę całkowitą na ekran Założenia Podprogram korzysta z lokalnego bufora alokowanego na stosie Uproszczenia Zakres wyświetlanych liczb: 00..99 Brak kontroli błędów 25

Wyświetlenie liczby całkowitej c.d. Warunki początkowe: Rejestr ax zawiera liczbę z przedziału 0.. 99 do wyświetlenia Działanie: Na ekranie pojawia się liczba z rejestru ax Algorytm 1. Wykonaj dzielenie ax przez 10. Wynik to liczba dziesiątek a reszta to liczba jedności 2. Dodaj do wyniku i reszty 48 (konwersja na ASCII) 3. Umieść skonwertowany wynik na pierwszej pozycji bufora 4. Umieść skonwertowaną resztą na drugiej pozycji bufora 5. Umieść znak nowej linii na trzeciej pozycji bufora 6. Wywołaj funkcję systemową sys_write Warunki końcowe: Brak 26

Wyświetlenie liczby całkowitej c.d. write_number: push ebp ; save original ebp mov ebp,esp ; save stack pointer sub esp,16 ; move stack pointer - make "gap" lea ecx,[ebp-16] ; set buffer to stack "gap" mov bl,10 div bl ; divide by 10 (results in al,ah) add ah,48 ; convert remainder to ASCII add al,48 ; convert result to ASCII mov [ecx],al ; put 10's digit to buffer mov [ecx+1],ah ; put 1's digit to buffer mov [ecx+2],byte 10 ; put end of line to buffer mov eax,4 ; sys_write mov ebx,1 ; stdout mov edx,3 ; set buffer size int 0x80 ; syscall - write line mov esp,ebp ; get original stack pointer pop ebp ; restore original ebp ret ; return to the caller 27

Wyświetlenie komunikatu Podprogram wyświetla na ekran zadany komunikat Komunikat przechowywany jest w pamięci jako tekst formatu C (null-terminated) Problem: Przed wywołaniem odpowiedniej funkcji systemowej trzeba określić długość tekstu 28

print_msg ; Input: ebx - address of the message to print print_msg: mov edi,ebx ; address to edi for scasb mov ecx,80 ; max length of the string mov al,0 ; look for a null (0) char cld ; clear direction flag (down) repne scasb ; search for al in [edi] mov eax,80 sub eax,ecx ; calculate string length dec eax ; remove last char (null) mov ecx,ebx mov edx,eax mov eax,4 mov ebx,1 int 0x80 ret ; set buffer address for syscall ; set message length for syscall ; sys_write ; stdout ; syscall - write line ; return to caller 29

print_msg program główny segment.data msg db 'Komunikat specjalny.',10,0 segment.text global _start _start: mov ebx,msg ; put message address to ebx call print_msg ; call subroutine mov eax,1 int 0x80 ; syscall code: sys_exit ; do syscall 30

Program pole kwadratu Działanie: Program pyta użytkownika o długość boku kwadratu i wyświetla pole kwadratu o podanym boku. UWAGA! Program obsługuje liczby w zakresie 0...99. Algorytm 1. Wyświetl komunikat podanie boku 2. Wczytaj wartość boku kwadratu 3. Wylicz pole kwadratu 4. Wyświetl komunikat o wyniku 5. wyświetl wynik 31

Program pole kwadratu - program główny segment.data msg1 db 'Prosze podac bok kwadratu: ',0 msg2 db 'Pole kwadratu wynosi: ',0 msg3 db 'Dziekuje za skorzystanie z programu.',10,10,0 segment.text global _start _start: mov ebx,msg1 call print_msg ; print msg1 call read_number ; read input number imul ax,ax ; compute result push eax ; save eax (result) mov ebx,msg2 call print_msg ; print msg2 pop eax ; restore result in eax call write_number ; write result (ax) mov ebx,msg3 call print_msg ; print msg3 mov eax,1 ; syscall code: sys_exit int 0x80 ; do syscall 32

Podsumowanie Wykorzystanie funkcji systemowej Podstawowe funkcje wejścia i wyjścia Wykorzystanie podprogramów Zmienne lokalne Program Pole kwadratu w assemblerze 33