Część zadań przygotował Tomasz Idziaszek.
Uwaga: jeśli nie zaznaczono inaczej, w ponizszych zadaniach kolejne argumenty funkcji przekazywane są w rejestrach EDI, ESI, EDX, ECX, zaś wynik zwracany w EAX. Funkcja musi zachowywać wartość rejestrów EBP i EBX.
Poniższe zadania nadają się również na laboratorium.
a. Napisz funkcję, która daje zawsze wynik 42 (uwaga na składnię!)
b. Napisz funkcję, która daje w wyniku swój argument.
Programista Tobiasz Niedbalski napisał powyższe funkcje następująco:
a.
.globl f f: mov 42, %eax ret
b.
f: mov %esi, %eax ret
Jakie mogły być tego efekty?
c. (lab) Napisz funkcję printInt(int n), która wypisuje swój argument
Zapisz w asemblerze x86 funkcję obliczającą silnię, w dwóch wersjach - rekurencyjnej oraz iteracyjnej (zanim zabierzemy się za silnię, można najpierw policzyć sumę [1..n]).
Zapisz w asemblerze kod dla prostego przypisania, np. x := (y + 17*x) / z.
Zakładamy, że adresy zmiennych są dostępne w tablicy symboli. Uwaga na dzielenie i różnice między l-wartościami i r-wartościami.
Przykładowe warianty adresów zmiennych:
Napisz w asemblerze szablony do generowania kodu dla wyrażeń warunkowych (if, if else) i pętli (for, while).
Napisz w asemblerze szablony do generowania kodu dla wyrażeń logicznych (dwoma metodami: przez sprowadzenie do wyrażeń arytmetycznych i przez skoki do etykiet).
Na laboratorium można dodatkowo napisać prosty program w C z nietrywialnym wyrażeniem logicznym i podglądnąć jak będzie wyglądał po skompilowaniu.
Zapisz w C prostą biblioteczką z predefiniowanymi funkcjami Latte i funkcją do konkatenacji napisów.
Napisz w asemblerze program demonstrujący użycie funkcji z powyższej biblioteczki.
Napisz funkcję obliczającą największy wspólny dzielnik dwóch liczb.
Napisz funkcję max(int[] a,int n) wyszukującą największy element w n-elementowej tablicy a.