Mikroprogram

Et mikroprogram, også kaldet mikrokode, er det program, der i nogle cpu'er, kanalcontrollere, diskcontrollere, gpu'er og netværksudstyr implementerer de enkelte maskininstruktioner, som maskinen stiller til rådighed for programmørerne. Et mikroprogram repræsenterer et lavere abstraktionsniveau, hvor der opereres direkte på de enkelte kredsløb i elektronikken i trin svarende til klokkeimpulserne.

Overblik
Mikroprogrammets instruktioner findes ikke i f.eks. computerens normale lager, men i et særligt mikroprogramlager, kaldet kontrollageret, der kan være i ROM eller PLA, men er ofte i et skrivbart lager, så man kan ændre mikroprogrammet. GIERs mikroprogram var lagret som ledninger trukket gennem et antal bløde ferritkerner. Et signal gennem en ledning, dannede et induceret signal i de tråde, der var viklet om kernerne. Efter forstærkning styrede det de enkelte kredsløb og ved næste klokcyklus sendtes et signal igennem en anden ledning, evt. afhængigt af værdien i bestemte flag. Mikroprogrammet afvikles trin for trin med klokimpulserne og styres af en mikroprogramtæller. 

På nogle større og ældre computere indlæses mikroprogrammet fra f.eks. en diskette under initialiseringen. Tilsvarende har mange mikroprocessorer i dag en mulighed for at indlæse et nyt mikroprogram, hvis der skal rettes en fejl i mikroprogrammet, uden at man behøver kassere de pågældende mikroprocessorer.

Mikroprogrammet består af et antal mikroinstruktioner. Disse instruktioner kontrollerer de enkelte kredsløb i cpu'en, f.eks. koble et register til databussen, koble et andet register til adressebussen, sætte bestemte signaler på kontrolbussen, lede data gennem en aritmetisk enhed sat til at udføre noget bestemt, teste på flag osv. Der sker som regel adskillige sådanne aktioner i én mikroinstruktion. Mikroprogrammet kan udvikles ved hjælp af en mikroassembler. 

Hvor flere forskellige cpu'er inden for samme familie kan afvikle de samme programmer (evt. med forbehold for bestemte instruktioner), kan et mikroprogram kun afvikles på én bestemt konstruktion af hardware.

Begrundelsen for at benytte mikroprogrammering
Brugen af mikroprogrammer gør det enklere at foretage ændringer på  en cpu, f.eks. at tilføje nye instruktioner eller rette fejl, end hvis man skulle til at redesigne opbygningen af chippen og flytte rundt på de elektroniske komponenter. Teknikken gør det også muligt, at en simpel computer kan emulere end anden eller større computer, f.eks. en maskine med andre eller større registre. Små, mindre kostbare maskiner kan således køre de samme programmer som større og kostbarere maskiner, hvilket er en stor fordel for udviklerne af applikationsprogrammer m.v.

Mikroprogrammering gør det relativt enkelt at lave meget komplekse og kraftfulde maskininstruktioner uden samtidig at skulle arbejde med en tilsvarende kompleks elektronik. De kraftfulde instruktioner, f.eks. med adskillige adresseringsmåder, var især nyttige i begyndelsen af edb-alderen, hvor mange programmer helt eller delvist var skrevet i assembler.

Implementering
For hver klokimpuls forøges indholdet af mikroprogramtælleren, den aktuelle mikroinstruktion udpeges og de forskellige kredsløb i cpu'en aktiveres som angivet i mikroinstruktionen. Hvis det er angivet i mikroinstruktionen, kan der testes på forskellige registre i proc4essoren og evt. hoppes til en anden mikroinstruktion. Det er sjældent al hardware, der er aktiv under en mikroinstruktion. Det kan derfor være muligt at afvikle flere instruktioner delvist samtidigt og derved udnytte ledige kredsløb. Moderne processorer udnytter dette i udstrakt grad og har hardwaren specielt konstrueret til dette, således at en de af processoren på et givet tidspunkt kan være i færd med at hente den næste instruktion i rækkefølgen, en anden kan hente den instruktion, der bliver den næste, såfremt et betinget hop udføres, en del dekoder instruktionen, en del henter data, og en del beregner adresser. Dette kaldes en instruktionspipeline. 

Mikroprogrammer defineres som enten vertikale eller horisontale.

Horisontale mikroprogrammer
Horisontale mikroinstruktioner er forholdsvis brede, dvs. består af mange bit. Der er typisk afsat mindst én bit for hvert kredsløb, flere bit for at vælge de aktuelle registre.

Vertikale mikroprogrammer
Vertikale mikroprogrammer er ikke så brede. Her kan et antal bit fortolkes af specielle kredsløb, der så igen danner de signaler, der aktiverer de ønskede øvrige kredsløb og registre. 
En emulator, der efterligner instruktionssættet for en anden processor kan opfattes som et vertikalt mikroprogram. Der måske igen afvikles af et andet mikroprogram på et lavere abstraktionsniveau. 

I dag, hvor hardware er ganske billigt, er horisontale mikroprogrammer de dominerende.

Mikroprogrammering versus RISC
Computere med mikroprogrammer tenderer til at have meget komplekse instruktioner, der kan en hel masse på én gang. De kaldes derfor for CISC-maskiner, Complex Instruction Set Computer. Erfaringen har dog vist, at de komplekse instruktioner udgør en meget lille del af de instruktioner, der afvikles i løbet af en programkørsel. Desuden programmeres der i dag meget sjældent i assembler, så programmørerne har ringe fornøjelse af de kraftfulde maskininstruktioner. Ved i stedet at lade de komplekse instruktioner erstatte af et antal simple instruktioner (disse sættes ind af oversætteren og generer således ikke programmøren), kan hele cpu'en gøres enklere og kan bringes til at køre hurtigere. Sådan en cpu kaldes en RISC, Reduced Instruction Set Computer. RISC-maskiner er til gengæld sværere at ændre. CISC-maskiner er stadig i dag den dominerende type. 

Systemprogrammer
Computerarkitektur
Software