Mašininis kodas: apibrėžimas, instrukcijų rinkinys ir pavyzdžiai
Sužinokite, kas yra mašininis kodas, instrukcijų rinkinys ir praktiniai pavyzdžiai — aiškus paaiškinimas apie opkodus, operandus, dvejetainį kodą ir kompiliavimo procesą.
Mašininis kodas - tai kompiuterio programa, parašyta mašinine kalba. Joje naudojamas tam tikros kompiuterio architektūros instrukcijų rinkinys. Paprastai jis rašomas dvejetainiu kodu arba pateikiamas heksadekimaliniu formatu, kad būtų patogiau skaityti žmonėms. Mašininis kodas yra žemiausio lygio programinė įranga, kurią tiesiogiai vykdo procesorius. Kitos programavimo kalbos dažniausiai išverčiamos į mašininį kodą, kad kompiuteris galėtų jas vykdyti.
Instrukcijos struktūra
Instrukcija nurodo procesoriui, kokią operaciją atlikti. Kiekvieną instrukciją sudaro opkodas (operacijos kodas) ir vienas arba keli operandai. Operandai paprastai būna atminties adresai, registrai arba tiesioginiai (immediate) duomenys. Instrukcijų rinkinys - tai kompiuteriui prieinamų opkodų sąrašas ir taisyklės, kaip interpretuoti operandus.
Adresavimo būdai ir operandai
- Immediate (tiesioginis) — operandas pateikiamas pačioje instrukcijoje (pvz., konstanta).
- Register — operandas yra procesoriaus registras.
- Memory — operandas yra atminties vieta nurodyta adresu.
- Register indirect / offset — adresas apskaičiuojamas naudojant registrą ir poslinkį.
Adresavimo metodai lemia, kiek baitų užims instrukcija ir kaip greitai ji bus vykdoma. Skirtingos architektūros (pvz., x86, ARM, RISC-V) turi skirtingus adresavimo tipus ir galimybes.
Vykdymo ciklas
Procesorius vykdo instrukcijas pagal paprastą ciklą: fetch → decode → execute (paimti, iššifruoti, vykdyti). Mašininiame kode instrukcijos patalpinamos atmintyje, procesorius jas paima, nustato opkodą ir operandus, tada atlieka nurodytą operaciją (aritmetinę, loginę, duomenų perkėlimo ar srautų valdymo operaciją).
Kaip susidaro mašininis kodas
Programų kūrėjai dažnai rašo programinį kodą aukštesnio lygio kalbomis arba asemblerio kodu. Toks kodas yra kompiliuojamas arba verčiamas į mašininį kodą. Asembleris paverčia žmogiškai skaitomą mnemoniką į atitinkamus opkodus ir operandus, o kompiliatorius ir nuorodų (linker) įrankiai sukuria vykdomąjį failą, kurį operacinė sistema gali užkrauti ir paleisti. Kai kurios sistemos naudoja interpretuojamas kalbas, kurių kodas vykdomas per tarpinį sluoksnį (pvz., virtualiąją mašiną), bet galutinis žingsnis visada yra instrukcijų pateikimas CPU suprantamu formatu.
Pavyzdžiai ir pabrėžtinės sąvokos
Mašininis kodas kartais vadinamas gimtuoju kodu. Jis vartojamas, kai kalbama apie dalykus, kurie veikia tik kai kuriuose kompiuteriuose ar architektūrose (t. y. nėra nešiojami tarp skirtingų architektūrų be perkompiliavimo arba emuliacijos). Mašininis kodas saugomas vykdomuosiuose failuose, įkeliamas į atmintį ir vykdomas procesoriaus.
Paprastas iliustracinis pavyzdys (konceptualus): instrukcija gali būti suskirstyta į laukus — pirmas laukas yra 4 baitų ilgio opkodas, kitas laukas nurodo registrą, o trečias laukas suteikia poslinkį arba tiesioginę reikšmę. Tiksli struktūra priklauso nuo konkrečios architektūros.
Priemonės ir darbai su mašininiu kodu
- Asembleris – verčia asemblerio kodą į mašininį kodą.
- Kompiliatorius – verčia aukšto lygio programavimo kalbą į mašininį kodą arba tarpinį kodą, vėliau į mašininį.
- Disassembler/Debugger – atvirkštinė priemonė, rodanti mašininį kodą kaip mnemonikas arba heksadekaminę išraišką, kas padeda derinti programas.
Savybės ir apribojimai
Mašininis kodas yra labai efektyvus ir greitas, nes vykdomas tiesiogiai procesoriaus. Tačiau jis priklauso nuo procesoriaus architektūros: skirtingos architektūros turi skirtingus instrukcijų rinkinius, todėl mašininis kodas, parašytas vienai architektūrai, negalės būti vykdomas kitoje be perkompiliavimo arba emuliacijos. Dėl mažesnio skaitomumo žmogui, programuotojai dažniausiai rašo aukštesnio lygio kodu ir naudoja įrankius, kurie verčia ar generuoja mašininį kodą.
Apibendrinant: mašininis kodas yra tiesioginis procesoriaus vykdomas kodas, sudarytas iš opkodų ir operandų pagal tam tikros architektūros instrukcijų rinkinį. Jį sukuria assembleriai ir kompiliatoriai, o specialistai gali analizuoti arba redaguoti mašininį kodą naudodami disassemblerius, hex redaktorius ar debugerius.
Mašininio kodo rašymas
Mašininis kodas gali būti užrašomas įvairiomis formomis:
- Naudojant kelis jungiklius. Taip sukuriama 1 ir 0 seka. Tai buvo naudojama ankstyvaisiais kompiuterijos laikais. Nuo 1970-ųjų jis nebenaudojamas.
- Naudojant šešiaženklįredaktorių. Tai leidžia vietoj komandos numerio naudoti opkodus.
- Asemblerio naudojimas. Asemblerio kalbos yra paprastesnės nei opcodes. Jų sintaksę suprasti lengviau nei mašinų kalbos, bet sunkiau nei aukšto lygio kalbų. Asembleris pats išverčia pradinį kodą į mašininį kodą.
- Naudojant aukšto lygio programavimo kalbą, programose galima naudoti kodą, kurį lengviau skaityti ir rašyti. Šios programos išverčiamos į mašininį kodą. Vertimas gali vykti keliais etapais. Pirmiausia "Java" programos optimizuojamos į baitkodą. Tada, kai jos naudojamos, jos išverčiamos į mašininę kalbą.

Ankstyvojo minikompiuterio priekinis skydelis su jungikliais mašininiam kodui įvesti
Tipinės mašininio kodo instrukcijos
Instrukcijų rinkinyje paprastai randama daugybė instrukcijų rūšių:
- Aritmetinės operacijos: Sudėtis, atimtis, daugyba, dalybos.
- Loginės operacijos: Konjunkcija, disjunkcija, neigimas.
- Operacijos, atliekamos su atskirais bitais: Bitų perkėlimas į kairę arba į dešinę.
- Operacijos su atmintimi: vertės kopijavimas iš vieno registro į kitą.
- Operacijos, kuriomis lyginamos dvi reikšmės: didesnė už, mažesnė už, lygi.
- Operacijos, kurios sujungia kitas operacijas: sudėtis, palyginimas ir kopijavimas, jei lygi tam tikrai vertei (kaip viena operacija), šuolis į tam tikrą programos tašką, jei registras lygus nuliui.
- Operacijos, veikiančios programos srautą: peršokimas į tam tikrą adresą.
- 32 bitų sveikąjį skaičių konvertuoti į 64 bitų sveikąjį skaičių, slankiojo kablelio reikšmę konvertuoti į sveikąjį skaičių (sutrumpinant).
Daugelyje šiuolaikinių procesorių kai kurioms komandoms naudojamas mikrokodas. Sudėtingesnėms komandoms jis paprastai naudojamas. Tai dažnai daroma su CISC architektūromis.
Instrukcijos
Kiekvienas procesorius ar procesorių šeima turi savo instrukcijų rinkinį. Instrukcijos - tai bitų modeliai, atitinkantys įvairias komandas, kurias galima pateikti mašinai. Taigi instrukcijų rinkinys yra būdingas tam tikrai procesorių, naudojančių (dažniausiai) tą pačią architektūrą, klasei.
Naujesniuose procesorių dizainuose dažnai būna visos pirmtako instrukcijos ir gali būti pridėta papildomų instrukcijų. Kartais naujesniame dizaine nebelieka instrukcijos kodo arba jo reikšmė pakeičiama (paprastai dėl to, kad jis reikalingas naujiems tikslams), o tai turi įtakos kodo suderinamumui; net beveik visiškai suderinamuose procesoriuose kai kurių instrukcijų elgesys gali šiek tiek skirtis, tačiau tai retai kelia problemų.
Sistemos gali skirtis ir kitomis detalėmis, pavyzdžiui, atminties išdėstymu, operacinėmis sistemomis ar periferiniais įrenginiais. Kadangi programa paprastai priklauso nuo tokių veiksnių, skirtingose sistemose paprastai neveikia tas pats mašininis kodas, net jei naudojamas to paties tipo procesorius.
Dauguma instrukcijų turi vieną ar daugiau opkodo laukų. Jie nurodo pagrindinį instrukcijos tipą. Kituose laukuose gali būti nurodytas operandų tipas, adresavimo režimas ir pan. Taip pat gali būti specialių instrukcijų, kurios yra pačiame opkode. Šios instrukcijos vadinamos tiesioginėmis instrukcijomis.
Procesorių projektai gali skirtis ir kitais atžvilgiais. Skirtingos instrukcijos gali būti skirtingo ilgio. Taip pat jos gali būti vienodo ilgio. Jei visos instrukcijos yra vienodo ilgio, dizainą galima supaprastinti.
Pavyzdys
MIPS architektūroje instrukcijos yra 32 bitų ilgio. Šiame skyriuje pateikiami kodo pavyzdžiai. Bendras instrukcijos tipas yra op (operacijos) lauke. Tai didžiausi 6 bitai. J tipo (šuolis) ir I tipo (tiesioginis) instrukcijos yra visiškai nurodytos op. R tipo (registro) instrukcijos apima lauką funct. Jis nustato tikslią kodo operaciją. Šiuose tipuose naudojami šie laukai:
6 5 5 5 5 5 5 6 bitų [ op | rs | rt | rd | rshamt| funct] R-tipas [ op | rs | rt | rt | address/immediate] I-tipas [ op | target address ] J-tipasrs, rt ir rd nurodo registro operandus. shamt nurodo poslinkio dydį. Adreso arba tiesioginio adreso laukuose tiesiogiai nurodomas operandas.
Pavyzdys: sudėkite 1 ir 2 registrus. Rezultatą įrašykite į 6 registrą. Jis užkoduojamas:
[ op | rs | rt | rd | rshamt| funct] 0 1 2 2 6 0 32 dešimtainė 000000 00001 00010 00110 00000 100000 dvejetainėĮkelkite vertę į 8 registrą. Paimkite ją iš atminties ląstelės, esančios 68 ląstelėse po 3 registre nurodytos vietos:
[ op | rs | rt | address/immediate] 35 3 8 68 dešimtainė 100011 00011 01000 00000 00001 000100 dvejetainėPereikite prie adreso 1024:
[ op | tikslinis adresas ] 2 1024 dešimtainė 000010 00000 00000 00000 00000 10000 000000 dvejetainėSusiję puslapiai
- Dvejetainė skaičių sistema
- Kvantiniai kompiuteriai
- Instrukcijų rinkinys
- Kompiuteris su sumažintu instrukcijų rinkiniu
Klausimai ir atsakymai
Klausimas: Kas yra mašininis kodas?
A: Mašininis kodas - tai kompiuterio programa, parašyta mašinine kalba, naudojant tam tikros kompiuterio architektūros instrukcijų rinkinį ir paprastai užrašoma dvejetainiu kodu.
K: Koks yra žemiausias programinės įrangos lygis?
A: Mašininis kodas yra žemiausio lygio programinė įranga.
K: Kaip kompiuteriai vykdo kitas programavimo kalbas?
A: Kitos programavimo kalbos išverčiamos į mašininį kodą, kurį kompiuteris gali vykdyti.
K: Iš ko susideda mašininio kodo instrukcija?
A: Mašininio kodo instrukciją sudaro opkodas (operacijos kodas) ir operandas (-ai). Operandai paprastai yra atminties adresai arba duomenys.
K: Kas yra instrukcijų rinkinys?
A: Instrukcijų rinkinys - tai kompiuteriui prieinamų opkodų sąrašas.
K: Ką programų kūrėjai daro su kodais?
A: Programų kūrėjai kodą paverčia kita kalba arba mašininiu kodu.
K: Kaip kitaip vadinamas mašininis kodas?
A: Mašininis kodas kartais vadinamas vietiniu kodu, kuris vartojamas kalbant apie dalykus, veikiančius tik kai kuriuose kompiuteriuose.
Ieškoti