Ćwiczenia: asembler x86

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.

Zadanie 0

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

Zadanie 1

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]).

Zadanie 2

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:

  • x: [RBP-4], y: [RBP+16], z: [RBP+20]
  • x: [[RBP+16]] (czyli adres x pod adresem [RBP+16]), y: [RBP+20], z: [[RBP+8]-4]

    Zadanie 3

    Napisz w asemblerze szablony do generowania kodu dla wyrażeń warunkowych (if, if else) i pętli (for, while).

    Zadanie 4

    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.

    Zadanie 5

    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.

    Zadanie 6

    Napisz funkcję obliczającą największy wspólny dzielnik dwóch liczb.

    Zadanie 7

    Napisz funkcję max(int[] a,int n) wyszukującą największy element w n-elementowej tablicy a.