TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 11.08.2010 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3
1. TEHTÄVÄ Tehtävä oli tehdä MIPS assembly kielellä aliohjelma, joka järjestää annetun merkkijonon aakkosjärjestykseen. Tehtävässä on käytetty quick sort -algoritmia [1]. Ohjelmaa kutsutaan seuraavan C-kielisen syntaksin mukaisesti. void qsort(char *left, char *right) Parametrit left ja right ovat osoittimia merkkijonon ensimmäiseen ja viimeiseen merkkiin. Ohjelma järjestää osoittimien left ja right välissä olevat merkit ASCII -koodien mukaiseen järjestykseen. Kutsujan on huolehdittava siitä, että merkkijonon viimeisenä olevaa nollaa ei sisällytetä järjestettävään merkkijonoon. 2. ALGORITMI Kuvassa 1. on Pascal -kielinen toteutus quick sort -algoritmista. Aakkostettava merkkijono on taulukossa a. Jotta algoritmi toimisi oikein kaikissa tilanteissa, taulukon ensimmäinen alkio on aina nolla. Itse merkkijono alkaa indeksistä 1. procedure quicksort; var t, i, l, r: integer; begin if r > l then end end; begin v := a[r]; i := l - 1; j := r; repeat repeat i := i + 1 until a[i] >= v; repeat j := j - 1 until a[j] <= v; t := a[i]; a[i] := a[j]; a[j] := t; until j <= i; a[j] := a[i]; a[i] := a[r]; a[r] := t; quicksort(l, i-1); quicksort(i+1, r); Kuva 1.Quick sort -algoritmi.
Quick sort -algoritmi on rekursiivinen eli se kutsuu itse itseään. Periaatteena on valita jokin alkio ns. partitioalkioksi, jolle etsitään oikea paikka. Kaikki partitioalkiota pienemmät alkiot siirretään tämän vasemmalle puolelle ja vastaavasti suuremmat oikealle puolelle. Algoritmia toistetaan vasemmalle ja oikealle puolelle erikseen kunnes taulukon koko on nolla. Kuvan 1 algoritmissa partitioalkioksi valitaan kaikkein suurin indeksisin alkio, joka sijoitetaan muuttujaan v. Sisimmäisissä repeat silmukoissa etsitään alusta alkaen partitioalkiota suurempi alkio ja lopusta alkaen pienempi alkio, jotka vaihdetaan keskenään. Tätä toistetaan kunnes indeksit (ija j) kohtaavat. Tällöin on löydetty partitioalkiolle oikea paikka, sekä pienimmät alkiot ovat partitioalkion vasemmalla puolella ja suuremmat vastaavasti oikealla. Algoritmia kutsutaan erikseen vasemmalle ja oikealle puoliskolle. Nykyistä partitioalkiota ei tarvitse sisällyttää kutsuihin, koska se jo on oikealla paikallaan. Rekursio päättyy, kun järjestettävä taulukko on tyhjä. 3. TOTEUTUS 3.1. Rekisterin käyttö Ohjelma on MIPS assemblykielellä koodattu toteutus kuvan 1 quick sort -algoritmista. Kuvan 1 algoritmia on muutettu siten, että indeksien sijasta käytetään osoitteita (lue oppikirjan kappale 3.11). Taulukko 1. Rekisterien käyttö Rekisteri $a0 $a1 $t0 $t1 $t2 $t3 $t4 Käyttö TÄHÄN REKISTERIEN KÄYTTÖKUVAUS Parametrit välitetään rekistereissä $a0 ja $a1. Qsort-aliohjelma ei palauta mitään arvoa kutsuvalle ohjelmalle. Rekisterissä $t0
säilytetään partitioalkiota (v). Rekisterissä $t1 on indeksiä i vastaavan alkion osoite ja rekisterissä $t2 on indeksiä j vastaava osoite. Rekistereitä $t3 ja $t4 käytetään apurekistereinä alkioiden vaihdoissa. 3.2. Toiminnan kuvaus Tarkempi kuvaus ohjelman toiminnasta. Kuinka ohjelma on käytännössä toteutettu, teittekö esim. jotain erilailla kuin algoritmissa. Ei mielellään viittauksia suoraan koodiriveille. Esimerkiksi numeroitu lista ohjelman suorituksesta, kuvaus, mitä tehdään missäkin ohjelmalohkossa. Eli mitä esimerkiksi tehdään, kun hypätään symboliin.loop yms. 4. TESTAUS Jotta ohjelman toimivuus voidaan varmistaa, kannattaa miettiä miten ohjelma testataan jo ennen koodausta. Tällöin ohjelmasta voidaan tehdä helposti testattava esimerkiksi lisäämällä erilaisia testitoimintoja. Kohdat 5, 30, 40 ja 60 on lisätty pääohjelmaan helpottamaan testausta ja ne voidaan poistaa, kun ohjelman toimivuus on varmistettu. Testitapausten avulla pyritään varmistetaan, että ohjelma toimii kaikissa mahdollisissa tilanteissa. Esimerkiksi ohjelman saadessa virheelliset parametrit ohjelma ei saa seota, vaan se palauttaa kutsuvalle ohjelmalle virhekoodin. Jotta suurissa ohjelmissa testitapausten määrä ei räjähdä käsiin, kannattaa miettiä edeltä käsin mitkä testitapaukset ovat mahdollisimman kattavia. Ohjelmaa kannattaa testata ns. normaaleilla syötteillä, toiminta poikkeuksellisissa tilanteissa, virheellisillä parametreilla ym.
4.1. Testitapaukset 4.1.1. Testitapaus 1 4.1.2. Testitapaus 2 4.1.3. Testitapaus 3 4.1.4. Testitapaus 4 4.1.5. Testitapaus 5 Tässä kappaleessa on listattu testitapaukset, joilla qsort aliohjelma on testattu. Testitapaukset on pyritty laatimaan siten, että testit ovat mahdollisimman kattavat tapausten määrän kuitenkin pysyessä siedettävänä. Kustakin testitapauksesta on script komennolla otettu loki liitteessä 2. Tämä on ns. normaali tapaus, jossa merkit ovat 'satunnaisessa' järjestyksessä. Tuloksena on aakkosjärjestyksessä (ASCII koodien mukaisessa) oleva merkkijono. Merkkijono on jo valmiiksi aakkosjärjestyksessä. Tarkoituksena varmistaa, että sisäkkäisten repeat-silmukoiden vertailut toimivat. Algoritmi ei saa muuttaa merkkijonon järjestystä. Merkkijono on käänteisessä aakkosjärjestyksessä. Tarkoituksena on varmistaa, että sisäkkäisten repeat-silmukoiden vertailut toimivat. Huomaa, että tässä tapauksessa algoritmi sekoaa, jos taulukon alussa ei ole nollaa (.stopper) Qsort aliohjelman jälkeen merkkijono on aakkosjärjestyksessä. Kaikki merkkijonon merkit ovat samoja. Ohjelma ei muuta merkkijonoa. Merkkijonon pituus on yksi. Ohjelma ei muuta merkkijonoa.
4.1.6. Testitapaus 6 Merkkijonossa ei ole yhtään merkkiä, eli ohjelmaa kutsutaan parametreilla, jossa $a0 ja $ a1 ovat samoja. Ohjelma palaa välittömästi tekemättä mitään. 4.1.7. Testitapaus 7 Alku- ja loppuosoite ovat vaihtaneet keskenään paikkoja. Ohjelma palaa välittömästi tekemättä mitään. 5. VIITTEET [1] Sedgewick, R. Algorithms. 2. painos. 1988. Addison-Wesley Publishing Company, Inc. 657 s.