y86-64 konekieli¶
Osaamistavoitteet: y86-konekielen toteutus ja miten se peilautuu y86-assembly-kieleen.
Konekieli on laitteistoriippuvainen esitystapa tietokoneohjelmalle suorittimen suoraan ymmärtämällä kielellä, sen äidinkielellä. Konekieli määritellään käskykanta-arkkitehtuurin (engl. instruction set architecture, ISA) kautta, jonka toteutusta suorittimessa kutsutaan mikroarkkitehtuuriksi. Suorittimen arkkitehtuuri koostuu siis käskykanta-arkkitehtuurista ja mikroarkkitehtuurista. Arkkitehtuurissa erotetaan jo tutut kaksi eri osaa: tiedonkäsittelyosa (engl. datapath) ja ohjaus/kontrolliosa, joka toteuttavat suorittimen toiminnan tarvitseman sekvenssi- ja kombinaatiologiikan.
Edellisessä materiaalissa kävimme läpi y86-assemblykielen käskyt ja tässä kappaleessa esitämme niitä vastaavan konekielen käskykannan.
Käskykanta-arkkitehtuuri¶
Käskykanta-arkkitehtuuri (engl. Instruction set architecture, ISA) sisältää konekielen kuvauksen lisäksi paljon muutakin.
Käskykanta-arkkkitehtuuri koostuu seuraavista osa-alueista:
- Tietotyypit (kokonais/liukuluvut), mitä suoritin ymmärtää
- Rekisterit
- Muistin osoitusmuodot
- Suorittimen tila: tilabitit ja -rekisteri
- Käskykanta, jossa käskyt jaetaan seuraavasti
- Aritmeettiset operaatiot
- Loogiset operaatiot
- Siirto-operaatiot
- Ohjelman suoritusta ohjaavat käskyt
- Muistin arkkitehtuuri, virtuaalinen muistiavaruus
- Keskeytysten ja poikkeustilanteiden käsittelyn
- Ulkoiset liitynnät (I/O): rekisterit, osoiteavaruus
Huomataan, että voidaan toteuttaa sama käskykanta-arkkitehtuuri erilaisilla mikroarkkitehtuureilla. Esimerkkinä x86- (tai Intelin IA-32- ja IA-64-)käskykanta-arkkitehtuurit, joille on lähes identtiset toteutukset eri valmistajien suorittimissa: Intel, AMD, SPARC, jne. Tällä tietysti taataan yhteensopivuus eri valmistajien komponenttien ja laitteiden välillä.
y86-konekielen käskyt¶
Konekielen käskyt (ne binääriluvut) koostuvat kahdesta osasta:
- Operaatiokoodi (engl. opcode), joka kertoo suoritettavan käskyn tai käskyryhmän ja sen alifunktion. Yksi tai useampi tavu.
- Operandit : vakioarvo / muisti / rekisteri eri osoitusmuodoissa. Yksi tai useampi tavu.
Operandit¶
Nyt jokaisella rekisterillä on oma numerokoodinsa. y86:sessa koodi on nelibittinen, joten nyt saadaan kätevästi esitettyä kaikki 15 rekisteriä heksaluvuilla. Näin yhdellä tavulla saadaan esitettyä konekielen käskyjen molemmat operandit, eli lähderekisteri (engl. source) ja tulosrekisteri (kohderekisteri, engl. destination). Numero
0xF
tarkoittaa tyhjää operandia, eli rekisteri-operandia ei käskyssä tarvita, kun operandi on vakioarvo tai muistista haettu arvo.Rekisteri | Numerokoodi | Rekisteri | Numerokoodi |
%rax | 0 | %r8 | 8 |
%rcx | 1 | %r9 | 9 |
%rdx | 2 | %r10 | A |
%rbx | 3 | %r11 | B |
%rsp | 4 | %r12 | C |
%rbp | 5 | %r13 | D |
%rsi | 6 | %r14 | E |
%rdi | 7 | - | F |
Nyt rekisterioperandien lisäksi haluamme tehdä konekielellä myös muistiosoituksia, joten pelkkä rekisterien numerokoodaus ei riitä.
Käskyn rakenne¶
Näinollen jokaista y86-konekielen käskyä vastaa 1-10 tavua seuravasti.
Käskyn ensimmäinen tavu kertoo käskyn operaatiokoodin, jonka ensimmäinen osa käskytyyppi ja toinen osa käskyn toiminto (funktio). Huomataan samankaltaisten käskyjen hierarkinen ryhmittely.
Käskyn seuraavat tavut (2-10) kertovat käskyn operandit.
- Kahden rekisteri-operandin tapauksessa operandien kuvaamiseen riittää yksi tavu:
r1
jar2
. - Vakiota tai muistiosoitteita käytettäessä tarvitaan lisäksi 8 tavua muistipaikan, muistisiirtymän (engl. offset) tai arvon kuvaamiseen. Tässä tavujärjestys on little endian. Tällöin toinen rekisterioperandi, eli se mitä ei käskyssä tarvita, on merkitty koodilla
F
. - Siirtymä (engl. offset) tarkoittaa epäsuorassa muistiosoituksessa mahdollisesti olevaa numeroarvoa, jolla voidaan toteutta suhteellinen muistiosoitus. Tämä arvo siis lisätään/vähennetään rekisterin muistiosoitteesta.
Esimerkkejä y86-assemblykäskyistä konekielisenä esityksenä.
Assembly | Konekielen käsky | Selitys |
cmovg %rax,%rcx | 2601 | cmovg=26 rax=0 rcx=1 |
irmovq $0x1234,%rsi | 30f63412000000000000 | irmovq=30 F=ei-reg rsi=6 vakioarvo=1234 |
addq %rdi,%rax | 6070 | addq=60 rdi=7 rax=0 |
jne 0x3c | 743c00000000000000 | jne=74 osoite=3c |
ret | 90 | ret=90 |
pushq %rbx | a03f | pushq=a0 rbx=3 F= ei-reg |
Mikäli konekielen käskyn operaatiokoodi tai operandit ovat virheellisiä, suoritin aiheuttaa poikkeuksen
INS
. Jos muistiosoitteessa on virhe, aiheutuu siitä poikkeus ADR
. Mutta, erillistä poikkeuksien käsittelijämekanismia y86-prosessorissa ei ole, vaan kaikki poikkeukset pysäyttävät sen toiminnan. Lopuksi¶
Aikoinaan hyvin suositun Commodore 64-kotimikron suorittimen MOS 6510 käskykanta löytyy täältä sivut (8-9). Tässä oikeassa prosessorissa oli käytössä vain kolme rekisteriä A (akku), X ja Y! Huomataan, että aritmeettisissa operaatioissa rekisterien käyttöön oli jokaiselle rekisterille oma käsky. Myös muistista lukemiseen/kirjoittamiseen löytyy omat käskynsä. Käskykanta on siis vielä yksinkertaisempi (alkeellisempi) verrattuna y86-prosessoriin.
Käskykanta-arkkitehtuuri on yleisesti ohjelmoijan näkökulma suorittimen toteutukseen digitaalilogiikan komponentteina. Tässä lyhyessä materiaalissa ja aiemmassa assembly-kielen materiaalissa esitettiin y86-64-prosessorin käskykanta-arkkitehtuurista se mitä kurssilla tulee osata.
Anna palautetta
Kommentteja materiaalista?