Jani Kurhinen 26.5.2008
Tentissä saa käyttää kaikkia saatavilla olevia staattisia informaatiolähteitä. Kaikenlainen kommunikointi tai muu interaktiivinen toiminta on kielletty.
Tentistä tulee palauttaa kolme tiedostoa, jotka on nimetty seuraavasti:
tiea325PT2_käyttäjätunnut_C.c tiea325PT2_käyttäjätunnut_ASM.asm tiea325PT2_käyttäjätunnut_KOMENNOT.txt
Tehtävät tehdään THK:n linux-koneessa jalava.cc.jyu.fi. Kommentoi ohjelmakoodien kaikki rivit!
Tee C-kielinen ohjelma, joka kutsuu ulkoista funktiota Fibo(). Funktion esittely ja ohjeet sen käytöstä on tiedostossa tenttifunktiot2.h. Ohjelma ottaa syötteenä yhden kokonaisluvun komentoriviltä käynnistettäessä. Syötteenä saatua lukua käytetään Fibo()-funktion syötteenä. Huomaa, että komentorivin parametri välitetään merkkijonona. Käytä esimerkiksi atoi()-funktiota parametrin muuntamiseen kokonaisluvuksi.
Ulkoisen funktion kutsumisen jälkeen tulee olla seuraavat koodirivit:
//a on int tyypin muuttuja, joka sisältää syötteenä saadun parametrin
//b on int tyypin muuttuja, joka sisältää Fibo()-funktion paluuarvon
printf("%d. fibonaccin luku on %d\n",a,b);
Toteuta edellisen tehtävän Fibo-funktio x86-assemblyllä. Ohjelmakoodin tulee selvitä kaikista arvoista välillä [1,10] ja palauttaa muuten arvo -1. Parametrejä 1 ja 2 vastaavat arvot ovat koodattuina funktioon, muut lasketaan näiden avulla rekursiivisesti.
;
;TEHTÄVÄ 2
;
;Alla on hyvin pelkistetty koodirunko
;
;
;Keosta varattavat muistilohkot. Kukin label on osoite.
SECTION .data
;Varsinainen koodi tulee tähän.
SECTION .text
RETURN: ;Hyppyviite eli label
mov esp,ebp ;Palautetaan pino-osoitin,
pop ebx ;EBX sekä
pop ebp ;kantaosoitin alkuperäisiin arvoihin
ret ;palataan kutsuvaan rutiiniin
global Fibo ;komponentin entrypointti.
Fibo: ;Hyppyviite eli label
push ebp ;Vanha basepointteri talteen pinoon
push ebx ;EBX:n arvo talteen
mov ebp,esp ;kantaosoittimelle uusi arvo nykyisen pinon päältä
;Tähän väliin oma koodi
jmp RETURN ;ehdoton hyppy poistumisrutiiniin
Käännä edelliset tehtävät objektitiedostoiksi ja edelleen suoritettavaksi ohjelmaksi (Viimeisessä vaiheessa liität siis kaksi .o-tiedostoa toisiinsa!). Millaisilla komennoilla nämä teet? Komennot eivät saa aiheuttaa varoituksia tai virheilmoituksia.