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.