ITKA203 Käyttöjärjestelmät -kurssin Demo 4b keväällä 2021. Tehdään itse ultrapieni aliohjelma konekielellä.
Paavo Nieminen, paavo.j.nieminen@jyu.fi
Tämä tehtävä syntyi keväällä 2021 vastaukseksi aiemmissa kurssipalautteissa olleisiin toiveisiin: Lisää demoja, ja etenkin konekielestä joku kevyempi välitehtävä kuin syvempään päätyyn heittävä demo 6. No tässä on ensimmäinen yritys tarjota moinen.
Sisällys
Päätavoite:
- Tulee ultrakevyt ensiaskel ohjelmointiin symbolisella konekielellä eli assemblerilla.
- Eli pehmeä lasku edellisistä seuraavia demoja kohti.
Edelleen käytetään nykyaikaisia työkaluja, joita kurssilla on tähän asti käytetty. Tehdään AMD64 -prosessorin (ts. "x86-64") konekieltä GNU:n assemblersyntaksilla, jota on tähänkin asti nähty debuggerin tulosteissa. Ohjelma käännetään ja linkitetään komentoriviltä GNU:n työkaluilla Jyväskylän yliopiston suorakäyttökoneella (jalava tai halava), jossa sitä myös kokeillaan. Jotta työskentely olisi näppärää, screen-ohjelman, shellin ja tekstieditorin käyttö on hyvä olla hanskassa.
Valmistele hakemisto tätä demoa varten ja hae pieni koodipaketti seuraavin komennoin:
wget https://gitlab.jyu.fi/itka203-kurssimateriaali/itka203-kurssimateriaali-avoin/-/raw/master/2015/demot/mallikoodia/d04b/d04b_paketti.zip unzip d04b_paketti.zip
Tutki paketista avautunutta runkoa aiemmin opituilla keinoilla (mm. komennot ls, less, tekstieditori). Mukana on Makefile, joka automatisoi käytännössä kaiken. Seuraava komento kääntää, linkittää ja ajaa kokonaan C:llä tehdyn mallikoodin:
make esimerkki
Seuraava komento kääntää, linkittää ja ajaa version, jossa yksi aliohjelmista on toteutettu suoraan konekielellä. Se ei vielä tee toimenpidettä, joka sen pitäisi. Sen vuoksi tuloste on erilainen kuin edellisessä:
make oma
Kyseinen oma kohde on määritelty Makefilessä ensimmäisenä, joten se on oletus ja voit sen sijaan komentaa pelkästään:
make
Kokeile vaikka, niin se on tässä nyt sama asia kuin make oma.
Tehtäväsi on muokata konekielisen aliohjelman tynkä asmvaihtaja.s sellaiseksi, että ohjelma toimii sen kanssa täysin samoin kuin malliesimerkki. Tiedät olevasi perillä, kun komennot make esimerkki ja make oma antavat täsmälleen saman tulosteen.
Mitään muita tiedostoja ei ole tarpeen muuttaa palautustehtävän tekemiseksi.
Muista kääntää ja kokeilla aina pienten muutosten jälkeen, ennen kuin koodi menee hallitsemattomaan tilaan liian monen muutoksen kautta!
Esimerkkikoodi ja sen Makefile on tehty tukemaan ymmärrystä tähän asti käsitellyistä asioista.
Tällaista on tavoiteltu:
Nämä ovat oletuksia. On mielenkiintoista kuulla palautetta demon kevään 2021 opiskelijoilta, jotka ensimmäisenä pääsevät tätä uutta demoa kokeilemaan!
Tehtävä on yksinkertainen, mutta vasta sitten, kun palaset yhdistyvät kohdalleen.
Mallivastauksen näkeminen pilaisi sen aika totaalisesti, samoin kuin liian tarkat ohjeet.
Näin ollen on syytä antaa enemmän tai vähemmän lennokkaita vinkkejä:
Tämä asia pitää opetella alustavasti, vaikka se onkin vasta seuraavan demon pääteema:
Miten parametrit välittyvät, kun C-kielinen ohjelma kutsuu konekieliohjelmaasi?
Tämän määrää ABI-dokumentaatio. Pilaisi oppimisen kertoa vastaus suoraan tässä tehtäväohjeessa.
Virallinen ABI löytyy esim. http://refspecs.linuxbase.org/elf/x86_64-SysV-psABI.pdf ja sitäkin kannattaa silmäillä yhtenä esimerkkinä reaalimaailman dokumentaatiosta.
Luentomonisteessa on kiteytetty tähän tarpeeseen olennaisimmat kohdat poislukien seuraava:
- ABI lupaa, että rekisterit RBX, R12, R13, R14 ja R15 ovat aliohjelmakutsun jälkeen samat kuin ennen sitä. Kutsuja voi pitää niissä jotakin tarvitsemaansa sisältöä. Sinunkin oman aliohjelmasi pitää toteuttaa tätä ABI-lupausta / sopimusta! Ota tämä huomioon. Muille rekistereille ABIssa ei ole samanlaista sääntöä.
Parametrien ja paluuarvon välityksestä sekä pinokehyksestä tulee lisää seuraavassa demossa. Tässä demossa ei tosiaan tarvita vielä muuta tietoa kuin tuo, missä parametrit tulevat sisään.
Tästä demosta palautetaan tasan yksi tiedosto nimeltään asmvaihtaja.s jossa on tekemäsi assembler-aliohjelma. Sen pitää toimia yllä olevan ohjeen mukaisesti. Eli tehtäväpaketin Makefile kääntää kokonaisuuden, ja simulaattori tulostaa täysin samoin komennolla make oma kuin komennolla make esimerkki.