ITKA203 Käyttöjärjestelmät -kurssin Demo 4b keväällä 2021 ja 2022. 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, kuoren ja tekstieditorin käyttö on hyvä olla hanskassa.
Aiemmin opittua soveltaen 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 paitsi koodin kirjoittamisen vastauksena palautettavaan tiedostoon. 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ä. Voit todeta, että se ei vielä tee toimenpidettä, joka sen pitäisi. Sen näkee siitä, että tuloste on erilainen kuin mitä make esimerkki tulostaa:
make oma
Kyseinen kohde oma 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.
Täsmennyksiä:
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 kevään 2022 opiskelijoilta, kun demo on vasta toista vuotta käytössä!
Tehtävä on yksinkertainen, mutta vasta sitten, kun palaset yhdistyvät kohdalleen oppimisen ja kertaamisen kautta.
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 ja tarkoituksellakin yleistasoisia 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 esimerkiksi osoitteesta http://refspecs.linuxbase.org/elf/x86_64-SysV-psABI.pdf ja sitäkin kannattaa silmäillä yhtenä esimerkkinä reaalimaailman dokumentaatiosta.
Aliohjelman (eli C-terminologialla funktion) kutsuminen löytyy dokumentista aliotsikon "Function calling sequence" alta.
Luentomonisteessa on kiteytetty suomen kielellä 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öä. Tämä tieto on esimerkiksi ABI-dokumentin rekisteritaulukossa sarakkeessa "Callee-saved" yes/no.
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.
Miksi?
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.