From 9e3f90ea65d19d238cb361c505b3193facd6d416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karol=20Farbi=C5=9B?= Date: Tue, 20 Sep 2022 12:22:08 +0200 Subject: [PATCH] zadania domowe z kompilacji --- compile/a.o | Bin 0 -> 1104 bytes compile/compile.md | 72 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 compile/a.o create mode 100644 compile/compile.md diff --git a/compile/a.o b/compile/a.o new file mode 100644 index 0000000000000000000000000000000000000000..23de88cf68f4d0a5989f1909e8719e0a35717545 GIT binary patch literal 1104 zcmbtRPfJ2U5TB=3_6OAH5E%42RgjAcLUf1+W=2GZs7n`HUt3B(1>YX5Lv`uirO#0x zA?OqJ32a7pw{4LQH84B#`@Q+i?7V%b9qlJP543r(3*Shy0M8Z~jOYO7VGa&5ufvJ{ zG|arbe?Yxj-SIc}M6=DieyPmLtXL>*sto%qsS)1Y33!97mtUAk(=6gw)VEa?e+zWI z6nqXR)g&iuG=+tW7H?*77DD5^67lPH*a7fW!vschV=TUnByR$XWq%x7I+J1`fn9RR zfi>e8SlEjq(M7J?lY-Tc&kC{R;SI39=x`=ljjKM7glYYsB#&bH7t>CYKw-0|!da(o z4KeAH4&QLFhE!|YI)XI%U-et4rJhA}+w^?*{(8QS6%^^**5BK}%H7&SrT_8P$UQ2J zdoSA6wi<#IdSH{7`)bg#;z>tur1hGoGIusf-snKP7@YvK80jCodd;gc6S8W4#xUc= U-9Lx4`*u{htqM=aGIP56FSn6JsQ>@~ literal 0 HcmV?d00001 diff --git a/compile/compile.md b/compile/compile.md new file mode 100644 index 0000000..59b8f33 --- /dev/null +++ b/compile/compile.md @@ -0,0 +1,72 @@ +Zadania domowe z kompilowania programów +=== + +Rozwiązania proszę umieścić w Waszym repozytorium w katalogu `compile/zadX/`, gdzie `X` to numer +zadania. + +Zadanie 1. +--- +Zademonstruj, że potrafisz kompilować programy napisane w wielu plikach: + +* napisz program, który wczyta dwa słowa złożone z małych literek alfabetu angielskiego + i wypisze ich [odległość Levenshtein'a](https://en.wikipedia.org/wiki/Levenshtein_distance); +* zrób to w dwóch plikach - w jednym niech będzie wczytywanie i wypisywanie, a w drugim cała logika + związana z wyliczaniem odległości; +* napisz skrypt, który kompiluje program - powinien najpierw skompilować oba pliki do *object files* + a potem je skonsolidować. Skrypt powinien się nazywać `build.sh`, a wynikowy plik wykonywalny: + `ldist.e`. + +Jeśli musisz, możesz przyjąć jakieś ograniczenie na długość słów wejściowych. Jeśli to robisz, +to zaimplementuj sprawdzanie długości i w przypadku przekroczenia - wypisz sensowny komunikat +o błędzie. Koniecznie zaimplementuj to w kolejnym (trzecim już) pliku źródłowym. + +Zadanie 2. +--- +To zadanie składa się wielu punktów i polega na wywoływaniu błędów kompilacji/linkowania: + +1. spróbuj napisać program, w którym dwa różne pliki definiują tą samą zmienną. Skompiluj go na dwa + sposoby (tzn. tworząc oraz pomijając *object files*). Komunikaty o błędzie wraz z zaznaczeniem + etapu kompilacji (parsowanie/kompilacja/asemblacja/linkowanie) zapisz do pliku `1.txt`. +1. to samo, co w punkcie 1, tylko dwie funkcje. W pliku `2.txt` zawrzyj komunikaty o błędzie. +1. spróbuj zlinkować ze sobą niekompatybilne *object files*, np. jeden z nich skompiluj z flagą + `-m32`. Komunikat o błędzie trafia do pliku `3.txt`. +1. napisz program, który próbuje wywołać funkcję, której nie ma, ale tak udolnie, że błąd + pojawia się dopiero na etapie konsolidacji. Program ma być w pliku `4.cc` a błąd w `4.txt`. + +Programy z punktów 1 - 3 także powinny się znaleźć w rozwiązaniu tego zadania, ale z dowolnymi +nazwami. + +*Wskazówka do punktu 4: https://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration* + + +Zadanie 3. +--- +Plik binarny `a.o` zawiera funkcję `magic`, która ma następujący prototyp: `bool magic(long)`. +Stwórz plik `a.cc`, który będzie implementował funkcję `bool notmagic(long)`, która będzie zwracała +dokładnie to samo, co funkcja `magic`. Twoja implementacja nie może wywoływać funkcji `magic`, ani +zawierać wstawek assemblerowych. + + +Zadanie 4. +--- +Pewna drużyna na sesji próbnej pewnego konkursu w programowaniu zespołowym się nudziła. Nudziła +się tak bardzo, że postanowiła jedno z zadań rozwiązać w assemblerze. Zadanie brzmiało tak: *Niech +`d(x)` oznacza liczbę dzielników liczby `x`. Wczytaj `n` i wypisz sumę `d(1) + d(2) + ... + d(n)`. +Liczba `n` spełnia warunki: `1 ≤ n ≤ 10^12`.* Pójdź w ślady tej drużyny i napisz program +w assemblerze, który rozwiąże to zadanie. Do oceny możesz przedstawić: + +* plik `sol.asm`, który można zasemblować używając polecenia `nasm -felf64 sol.asm`, a później +zlinkować poleceniem `ld sol.o`, lub +* plik `sol.s`, który można zasemblować i zlinkować używając polecenia `gcc -no-pie sol.s`, lub +* plik `sol.cc`, który można skompilować używając polecenia `g++ sol.cc`. + +Jeśli wybierzesz opcję trzecią, oczekuję że program będzie jedną wielką wstawką assemblerową. Jeśli +zrobisz opcję pierwszą, zyskasz mój szacunek. + +*Wskazówka: https://www.felixcloutier.com/x86/, a tak konkretniej instrukcje `MOV`, `ADD`, `SUB`, +`MUL`, `DIV`, `CMP`, `Jcc`, `CALL` i pewnie kilka innych.* + +*PS: Ta drużyna rozwiązała to zadanie wysyłając zgłoszenie w ostatniej minucie sesji próbnej. +Co ciekawe, program uruchomiony na komputerze, na którym drużyna pisała program, kończył się błędem +`Segmentation fault`, a mimo to sprawdzarka uznała zgłoszenie za poprawne. Czy potrafisz zgadnąć, +dlaczego?*