**Mikro-ohjelma** tai mikrokoodi on osassa suorittimia käytetty suorittimen sisäinen ohjelma, jonka avulla varsinaiset konekielen käskyt on toteutettu.

Historia
--------

Varhainen mikro-ohjelman käyttökohde oli IBM S/360, jossa sen avulla toteutettiin taaksepäin yhteensopivuus aiempien mallien kuten suositun IBM 1401:n kanssa. Mikrokoodista tuli suosittua prosessoreissa 1970-luvun jälkipuoliskolta lähtien.

Varhaiset mikroprosessorit kuten MOS 6502 ja Z-80 eivät käytä mikrokoodia, mutta Intel 8086 ja Motorola 68000 käyttävät jo. 8086 toteuttaa mikrokoodilla esimerkiksi kerto- ja jakolaskut.

Intel on käyttänyt x86-sarjan P6-suorittimista lähtien mikrokoodia, joka voidaan päivittää ohjelmallisesti suorittimen virheiden korjaamiseksi. Muun muassa Linux-, Solaris- ja Windows-käyttöjärjestelmät sisältävät ajuritukea mikrokoodin päivittämiseen ilman BIOSin päivitystä.

Modernit Intelin, AMD:n ja ARMin suorittimet purkavat käskyt mikro-operaatioiksi.

Mikro-ohjelman piirteitä
------------------------

Mikro-ohjelmalle on tyypillistä pitkät käskysanat, joiden bitit ohjaavat suoraan suorittimen sisäisiä toimintoja. Mikro-ohjelmalle näkyvät suorittimen eri toimiyksiköt, kuten rekisterit tai akut, väylät, liukuhihnat, aritmeettis-looginen yksikkö ja niin edelleen. Tästä seuraa se, että ohjelman abstraktiotaso on erittäin matala, mutta hyvä ohjelmoija pystyy käyttämään suorittimen sisäistä rinnakkaisuutta hyväkseen.

Mikro-ohjelmat olivat aiemmin*lähde?* erittäin yleisiä niin sanotuissa CISC-tyyppisissä koneissa, joissa
käskyt ja osoitusmuodot olivat monimutkaisia. Näiden taas tuli olla monimutkaisia, jotta pieneen keskusmuistiin
mahtuisi koko tarvittava ohjelma. RISC-arkkitehtuuri toi mukanaan ajatuksen, että
käskyjen tulee olla yksinkertaisia. 

Tyypillisesti pienet suorittimet eivät ole mikro-ohjelmoituja tai vain hankalimmat
käskyt on toteutettu mikro-ohjelmalla. Mitä monimutkaisempi suoritin, sitä todennäköisemmin
sen toteutuksessa on hyödynnetty myös mikro-ohjelmaa.

Samankaltaisia lähestymistapoja
-------------------------------

Erityistarkoituksiin on suunniteltu
koneita, joissa ei ole varsinaisia konekäskyjä, vaan niitä ohjelmoidaan samaan tapaan
kuin mikro-ohjelmaa. Tällainen laite oli esimerkiksi FPS-164. 
Myöhemmin on kehitetty leveän käskysanan (VLIW) arkkitehtuuri, jossa käskysanan eri osat sisältävät eri toimilohkojen konekäskyjä. Leveällä käskysanalla
päästään suorittimen sisäisen rinnakkaisuuden hyödyntämiseen, mutta ohjaus ei ole niin yksityiskohtaista kuin varsinaisessa mikro-ohjelmassa.

Mikro-ohjelman muokattavuudesta
-------------------------------

Mikro-ohjelma on tavallisesti ollut kiinteä, eli sitä ei ole voinut vaihtaa. Alun perin sanalla firmware tarkoitettiinkin lähinnä mikro-ohjelmaa.*lähde?*
Toisaalta osa koneista (Burroughs B1700 ja sen sukulaiset) mahdollisti jopa sen, että prosessinvaihdon yhteydessä vaihdettiin myös mikro-ohjelma. Näin voitiin tehdä eri ohjelmointikielille niille sopivin käskykanta. Myös mikro-ohjelmakääntäjiä on olemassa.

Lähteet
-------

1. ↑  James W. Cortada: Building the System/360 Mainframe Nearly Destroyed IBM *spectrum.ieee.org*.  5.4.2019. Viitattu 25.9.2020. (englanniksi)
2. ↑  Dally, William J. Harting, R. Curtis & Aamodt, Tor M.: *Digital Design Using VHDL: a systems approach*, s. 427. Cambridge University Press, 2015. ISBN 978-1-107-09886-2. (englanniksi)
3. ↑
4. ↑  Microprocessor Types and Specifications *informit.com*.  8.6.2001. Viitattu 26.9.2020. (englanniksi)
5. ↑  Security Analysis of x86 Processor Microcode *dcddcc.com*.  11.12.2014. Viitattu 26.9.2020. (englanniksi)
6. ↑  Cortex-A57 Software Optimization Guide Software Optimization Guide (sivu 6) *developer.arm.com*. Viitattu 30.7.2022. (englanniksi)
7. ↑  I See Dead µops: Leaking Secrets via Intel/AMD Micro-Op Caches (PDF) *cs.virginia.edu*.  Arkistoitu. Viitattu 30.7.2022. (englanniksi)
8. ↑  Borin, E. Breternitz, M. Wu, Y. & Araujo, G.: Clustering-Based Microcode Compression.  *International Conference on Computer Design*, 2006, s. 189-196.  IEEE. Artikkelin verkkoversio.
9. ↑
10. ↑   (Arkistoitu – Internet Archive)
11. ↑
12. ↑   (Arkistoitu – Internet Archive)

Kirjallisuutta
--------------

* Agrawala, Ashok K. & Rauscher, Tomlinson G.: *Foundations of Microprogramming*. Academic Press, 1976. ISBN 978-0120451500.

Aiheesta muualla
----------------

* Reverse Engineering x86 Processor Microcode (PDF) (englanniksi)