Kodigo ng makina

Ang isang **kodigo ng makina** ay isang sistema ng hindi mahahating mga instruksiyong isinagawa ng direkta ng CPU ng isang kompyuter. Ang bawat instruksiyon ay gumaganap ng isang napaka-spesipikong trabaho na karaniwan ay isang operasyon sa isang unit ng datos(sa rehister o sa memorya gaya ng *add* o *move*) o isang operasyong *jump*(pagtalon) na nagpapasya kung anong susunod na instruksiyon ang isasagawa na kadalasan ay kondisyonal sa mga resulta ng isang nakaraang instruksiyon. Ang bawat maisasagawang programa ay binubuo ng sunod sunod ng mga atomikong instruksiyong ito. Ang kodigo ng makina ay maaaring ituring na isang nakasalalay hardwer na wikang pamprograma o bilang isang pinakamababang lebel ng representasyon ng isang kinompilyang programa ng kompyuter. Bagaman posibleng sumulat ng programa ng kompyuter sa kodigo ng makina, dahil ito ay isang nakapapagod na kahirapan sa pangangasiwa ng mga pinagkukunang CPU, ito ay bihirang ginagawa sa kasalukuyan maliban sa mga sitwasyong nangangailangan ng sukdulang optimisasyon. Ang halos lahat ng mga mapapatakbong mga programa ay isinulat sa mga mas mataas na lebel ng wika at isinalin sa mapapatakbong kodigo ng makina ng isang kompayler at linker. Ito ay minsang tinatawag na katutubong kodigo kapag tumutukoy sa nakasalalay sa platapormang mga bahagi ng mga katangian ng wika o mga aklatan.  

Ang mga programa sa mga pinakahalugang wika ay hindi kinakatawan ng kodigo ng makina. Gayunpaman, ang mga intepreter nito ay kadalasang kinakatawan nito.

## Mga instruksiyon
Ang bawat prosesor o pamilya ng prosesor ay may sarili nitong kodigong makina na hanay ng instruksiyon. Ang mga instruksiyon ay mga paterno ng bit na sa disenyong pisikal ay tumutugon sa iba't ibang mga utos sa makina. Kaya ang hanay ng instruksiyon ay spesipiko sa isang klase ng mga prosesor gamit ang parehong arkitektura. Ang mga sumunod o mga deribatibong prosesor ay kadalasang kinabibilangan ng lahat ng mga instruksiyon ng predesesor at maaaring magdagdag ng mga karagadagang instruksiyon. Minsan, ang isang sumunod na prosesor ay hindi magpapatuloy o magbabago ng kahulugan ng isang kodigong instruksiyon(na karaniwan ay kailangan para sa mga bagong tungkulin) na umaapekto sa kompatibilidad sa isang bahagi. Kahit ang halos kompatibleng mga prosesor ay maaaring magpakita ng medyo ibang pag-asal para sa ilang mga instruksiyon ngunit ito ay bihirang problema. Ang mga sistema ay maaari ring mag-iba sa ibang mga detalye gaya ng pagkakayos ng memorya, mga sistemang nagpapatakbo, o mga kasangkapang periperal. Dahil ang isang programa ay normal na umaasa sa gayong mga paktor, ang iba't ibang mga sistema ay karaniwang hindi tumatakbo sa parehong kodigo ng makina kahit ang parehong uri ng prosesor ay ginamit. Ang hanay ng instruksiyong kodigo ng makina ay maaaring mayroong lahat ng mga instruksiyon ng parehong haba o ito ay maaaring mayroong instruksiyon na nagbabago ang haba. Kung paanong ang mga paterno ay pinangangasiwaan ay iba iba sa partikular na arkitektura at kadalasan ay sa uri rin ng instruksiyon. Ang karamihan ng mga instruksiyon ay may isa o higit pang mga field na opcode na tumutukoy sa uri ng basikong intruksiyon(gaya ng aritmetika, lohikal, pagtalon etc) at ang mga aktuwal na operasyon(gaya ng *add*(dagdag) o *compare*(ikumpara)) at iba pang mga field na maaaring magbigay ng uri ng operando, ang modo ng pag-aadress, ang pag-aadress ng offset o indeks o ang mismong aktuwal na halaga gaya ng mga konstanteng operandong nilalaman sa instruksiyong tinatawag na mga *immediate*.
.

## Halimbawa
Ang arkitekturang MIPS ay nagbibigay ng isang spesipikong halimbawa para sa isang kodigo ng makina na ang mga instruksiyon ay 32 bit. Ang pangkalahatang uri ng instruksiyon ay ibinigay ng *op*(operasyon) field, ang pinakamataas na 6 na bit. Ang mga instruksiyong J-type (jump/pagtalon) at I-type (immediate) ay buong tinutukoy ng *op*. Ang mga instruksiyong R-type(register) ay kinabibilangan ng karagdagang field na *funct* upang matukoy ang eksaktong operasyon. Ang mga field na ginagamit sa mga uring ito ay:  

    6      5     5     5     5      6 bits
 [  op  |  rs |  rt |  rd |shamt| funct]  R-type
 [  op  |  rs |  rt | address/immediate]  I-type
 [  op  |        target address        ]  J-type

ang *rs*, *rt*, and *rd* ay tumutukoy sa mga operandong rehister. Ang *shamt* ay nagbibigay ng shift amount(halagang paglipat) at ang *address* o *immediate* ay naglalaman ng operando ng direkta. 

Halimbawa, ang pagdadagdag ng mga rehister na 1 at 2 at paglalagay ng resulta sa rehister na 6 ay kinokodigong: 

 [  op  |  rs |  rt |  rd |shamt| funct]
     0     1     2     6     0     32     decimal
  000000 00001 00010 00110 00000 100000   binary

Magkarga ng isang halaga sa rehister na 8 na kinuha mula sa selulang memoryang 68 pagkatapos ng lokasyong itinala sa rehister 3:

 [  op  |  rs |  rt | address/immediate]
    35     3     8           68           decimal
  100011 00011 01000 00000 00001 000100   binary

Tatalon sa adress na  1024:

 [  op  |        target address        ]
     2                 1024               decimal
  000010 00000 00000 00000 10000 000000   binary

## Mga sanggunian
Kategorya:Kompyuter