Mašininis kodas (programavimas)

Mašininis kodas – instrukcijų ir duomenų rinkinys kurį tiesiogiai vykdo mašina. Tai pati seniausia programavimo kalba, ir dažnai žemiausio lygio, nors dabartiniai procesoriai dar turi ir mikrokodo lygmenį. Tik vėliau sukurtos kitos programavimo kalbos, kurių tekstą galima automatiškai išversti į mašininį kodą (sukompiliuoti).

1950 m. kompiuterio UNIVAC I valdymo pultas. Kompiuteris prireikus valdomas jungikliais ir lemputėmis. Jų pagalba įvedus ir paleidus tinkamą programą, jau galima naudotis ir klaviatūra (apačioje centre)
1970 m. kompiuterio Intel Intellec 4 techninis pultas. Adresai, duomenys ir komandos įvedami mygtukais dvejetaine sistema

Skirtumai nuo asemblerioKeisti

Kiek aukštesnio lygio programavimo kalba yra asemblerio kalba. Asembleryje operacijos užrašomos žmogui supratamesnėmis ir labiau įsimintinomis raidėmis, ne dvejetainiu kodu.

Pavyzdžiui, Intel Intellec 4 procesorius turi aštuonis vidinius registrus (kaipo ir „kintamuosius“). Komanda kopijuoti vieno registro turiniui į kitą užrašoma kaip mov r1,r2 (čia r1, r2 – registrų vardai). Asemblerio kalboje atskirą reikšmę turintys komandos fragmentai (šiuo atveju registrų vardai) vis dar užrašomi atskirai. Mašininiame kode ši komanda yra vientisas dvejetainis skaičius: 01DDDSSS, kur SSS yra dvejetainis šaltinio numeris (trys bitai), o DDD – paskirties registro numeris (pavyzdžiui, 01001100) Tokią komandą galima surinkti valdymo pulto jungikliais.[1][2] Asemblerio kalboje visgi galima skaičius užrašyti norima skaičiavimo sistema (dešimtaine, dvejetaine, šešioliktaine), vietoje mašininių adresų (kurie yra skaičiai) naudoti raidinius vardus, tiesiogiai (ne ASCII) įvesti programai reikalingus teksto fragmentus. Mašininėje kalboje viso to nėra. Asemblerio programą įprastai galima parengti vykdymui bet kurioje kompiuterio atminties vietoje. Mašininio kodo dažniausiai taip „nepastumdysi“: visos komandos turi savo adresus kurie yra skaičiai, ir būtent tokie adresai turi būti nurodyti visur kur būtina perduoti valdymą (sąlyga, ciklas). [3]

Taikymo sritisKeisti

Mašininis kodas reikalingas su kompiuteriu dirbant labiau elektroniniame nei programavimo lygyje (pavyzdžiui, įvedant pirmąją programą jungikliais ir mygtukais). Pirmieji pramoniniai ir vėliau mėgėjiški kompiuteriai dažnai turėdavo „techninį pultą“, skirtą stebėti ir nustatyti vykdomos komandos ar duomenų adresą, kodą, turinį – viską dvejetainėje sistemoje ir mašininio kodo pavidalu. Būdavo mygtukas procesoriaus komandoms pažingsniui vykdyti, kitas – surinktai reikšmei nurodytu adresu užrašyti. To pulto dažnai reikėdavo kompiuteriui pirmąkart paleisti, kol dar jame nebūdavo jokios galimos vykdyti programos. Tačiau pirmoji programa gali būti perskaityta ir iš ilgalaikės, išjungiant neprarandamos atminties. Šaltinyje [4] galima matyti tokį pultą mėgėjiškam Микро-80 kompiuteriui.

Į mašininį kodą vis dar tenka kiek tai gilintis kuriant naujus procesorius, jų komandų sistemas, nes tai vienintelė programavimo kalba kurią naujos architektūros kompiuteris supranta savaime ir vos pagamintas.

MikrokodasKeisti

 
Intel 80486 DX procesoriaus nuotrauka. Skaičiumi 4 pažymėta mikrokodo instrukcijas sauganti ilgalaikė atmintis

Sudėtingi (šiuolaikiniai) procesoriai dažnai turi ir dar vieną, už mašininį kodą žemesnį programavimo lygmenį. Juo pačiame procesoriuje programuojamos komandos, kurių išpildymas tiesiog elektronikos grandinėmis būtų pernelyg sudėtingas. Tačiau nors mikrokodas prireikus gali būti keičiamas ir jau pagamintam procesoriui, juo visgi programuojamas paties procesoriaus darbas, jo komandų sistema.[5] Mikrokodas gali būti keičiamas jei aptinkama procesoriaus programavimo klaidų – nereikia keisti paties procesoriaus ir greičiausiai viso kompiuterio. Pavyzdžiui, taip buvo užtaisytos Spectre, Meltdown saugumo spragos.[6][7] Mikrokodas įgalina mažiau galimybių turintį procesorių imituoti galingesnio procesoriaus darbą (didesnis žodžio ilgis, daugiau branduolių ir pan.), taip pasiekiant daugiau suderinamumo. Įprastiniam programavimui mikrokodas sunkiai panaudojamas nes būdamas glaudžiai susijęs su konkrečia elektronika dažniausiai be perrašymo netinka jokiam kitam procesoriui. Mikrokodo instrukcijos atrodo maždaug taip:

  • Sujunk registrą 1 su aritmetinio įrenginio puse A
  • Sujunk registrą 7 su aritmetinio įrenginio puse B
  • Nustatyk aritmetinį įrenginį atlikti sudėties operaciją
  • Užrašyk aritmetinio įrenginio rezultatą į registrą 1

ir panašiai. Mikrokodui būdingos labai „plačios“ instrukcijos, 50 - 128 bitai ir daugiau, nes reikia apimti visus procesoriaus vidinius registrus ir kitas susijusias elektros grandines. Daugelis Intel procesorių, pradedant nuo Pentium Pro, turi mikrokodo lygmenį kurį galima programiškai keisti.[8] Tą taip pat galima padaryti AMD Opteron procesoriams. Intel mikrokodo pakeitimai yra užšifruoti. AMD jie nėra užšifruoti, tačiau dokumentuoti taip pat nėra.[9]

ŠaltiniaiKeisti

  1. Intellec 8/Mod 80 Microcomputer Development System Reference Manual, Intel, 1975, <http://bitsavers.informatik.uni-stuttgart.de/pdf/intel/MCS80/Intellec_8_Mod_80/Intel_Intellec_8_Mod_80_Reference_Manual_Feb75.pdf>. Nuoroda tikrinta 25 birželio 2015  Archyvuota kopija 2015-06-26 iš Wayback Machine projekto.
  2. P.S. Galima dargi įvesti komandą kur paskirties ir šaltinio numeriai sutampa. Nieko nebus, nebent toks kodas specialiai atpažįstamas ir naudojamas kam kitam. Tačiau tokios komandos užtrunka tam tikrą laiką ir naudojamos trumpoms pauzėms, kur jos reikalingos.
  3. Machine-Language Programming. introcs.cs.princeton.edu
  4. Сергей Попов (2011). История создания компьютеров "Микро-80", "Радио-86РК" и "Микроша" zxbyte.ru
  5. Fog, Agner (2017-05-02). „The microarchitecture of Intel, AMD and VIA CPUs“ (PDF). Technical University of Denmark. 
  6. Intel Patches All Recent CPUs, Promises Hardware Fixes For Upcoming 8th Gen Chips by Paul Alcorn on March 15, 2018
  7. „Download Linux* Processor Microcode Data File“. 
  8. Stiller, Andreas; Paul, Matthias R. (1996-05-12). „Prozessorgeflüster“. c't – magazin für computertechnik. Trends & News (vokiečių) (Heise Verlag). Suarchyvuotas originalas 2017-08-28. Nuoroda tikrinta 2017-08-28. 
  9. Opteron Exposed: Reverse Engineering AMD K8 Microcode Updates’ SecuriTeam.com