Prowadzący: Szymon Gut, Łukasz Odzioba
Zajawka
Pewnie często piszemy w językach wysokiego poziomu. Możliwe jednak że nie zawsze wiemy jakie to ma przełożenie na faktyczne instrukcje dla procesora. Na warsztatach będziemy dociekać co dzieje się w trakcie wykonywania programu napisanego w C++ie. Następnie wykorzystamy wiedzę do użycia języka niekoniecznie zgodnie z założeniami twórców. I przede wszystkim będziemy się dobrze bawić.
Program zajęć
Najpierw krótki wstęp teoretyczny z architektury komputerów: ramki, strony pamięci, MMU, procesor x86, rejestry, tryb chroniony procesora.
Następnie niskopoziomowe C++: segmenty pamięci, układ danych w pamięci, zabawa wskaźnikami, wywoływanie funkcji, zwracanie wartości, buffer overflow, wykorzystanie, zabezpieczenia, korzystanie z debugera, deasemblacja, czytanie asemblera.
Być może na koniec jak starczy czasu wstawki asemblerowe, albo nawet pisanie w czystym asmie.
Technicznie
Całość będzie podparta przykładami praktycznymi, coś sobie pokodzimy. W związku z tym każdy potrzebowałby laptopa, ew. jeden na parę. Wynik "doświadczeń" jest mocno zależny od sprzętu i systemu operacyjnego, więc trzebaby ustalić że jest to procesor x86 (lub zgodny z nim programowo) i system Linux.
Przyda się znajomość podstaw C++a, ze szczególnym uwzględnieniem wskaźników.
Zadania kwalifikacyjne
Z1
Ile megabajtów pamięci może zaadresować (nie mylić z zaalokować) proces na Twoim komputerze? Krótko i zwięźle uzasadnij.
Z2
Zaimplementuj funkcje
char* strcat(char* d, const char* s); // doklejającą napis s do d i zwracającą d
int nwd(int a, int b); // liczącą największy wspólny dzielnik dodatnich liczb a i b
za pomocą jak najmniejszej liczby znaków (liczymy znaki pomiędzy klamerkami). Nie można korzystać z zewnętrznych zmiennych ani funkcji. Zadanie zostanie zaliczone, jeśli żaden uczestnik przed Tobą nie zaimplementuje tych funkcji krócej. Obecne rekordy:
strcat - 52
nwd - 22
Z3
Napisz Sizeof() zwracający rozmiar w bajtach podanej w parametrze zmiennej. Oczywiście oryginalnego sizeofa nie należy używać ;)
Z4
Zaimplementuj dynamiczną tablicę intów z metodami: size(), push_back(int), pop_back() oraz operatorem indeksowania [] pozwalającym na odczyt i zapis do tablicy. Zwróć uwagę na zajętość pamięci i efektywność.
Na warsztaty zostaną zakwalifikowane osoby, które rozwiążą co najmniej trzy zadania.
Materialy do warsztatow:
[http://selene.olsztyn.pl/~fromage/www6/]
[http://mprolab.teipir.gr/vivlio80X86/pentium.txt]
[http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html]