Mašīnkods (mašīnvaloda): definīcija, struktūra un piemēri
Mašīnkods (mašīnvaloda): skaidra definīcija, instrukciju struktūra, opkodi un praktiski piemēri — kā kompilēt un izprast zemo programmatūras līmeni.
Mašīnkods ir mašīnvalodā rakstīta datorprogramma. Tā izmanto konkrētas datora arhitektūras instrukciju kopumu. To parasti raksta binārajā rakstībā. Mašīnkods ir zemākais programmatūras līmenis. Citas programmēšanas valodas tiek tulkotas mašīnkodā, lai dators varētu tās izpildīt.
Instrukcija norāda procesam, kāda darbība jāveic. Katru instrukciju veido opkods (operācijas kods) un operands(-i). Operandi parasti ir atmiņas adreses vai dati. Instrukciju kopums ir datoram pieejamo opkodu saraksts. Mašīnkods ir tas, uz ko kompilē asembleru kodu un citas programmēšanas valodas vai kā to interpretē.
Programmu veidotāji pārvērš kodu citā valodā vai mašīnkodā. Mašīnkods dažkārt tiek saukts par vietējo kodu. To lieto, runājot par lietām, kas darbojas tikai dažos datoros.
Struktūra un kodēšana
Mašīnkodā katra instrukcija parasti sastāv no divām pamatelementu grupām:
- Opkods — norāda, kāda operācija jāveic (piem., saskaitīt, pārvietot datus, veikt šūnu salīdzināšanu).
- Operandi — nosaka, uz kuriem datiem vai reģistriem opkods darbojas (piem., reģistru nosaukumi, atmiņas adreses vai tieši norādīti skaitļi — immediate).
Adrese, reģistri un adresēšanas režīmi
Operandi var norādīt:
- reģistrus (ātra piekļuve procesora iekšējam atmiņas veidam),
- atmiņas adreses (tieši vai netieši ar norādītājiem),
- immediate vērtības (skaitļi, kas iekodēti tieši instrukcijā).
Piemēri (vienkāršots)
Lai skaidrāk parādītu, kā mašīnkods izskatās, zemāk ir vienkāršots un izdomāts 8 bitu procesora piemērs:
- Opkods 0x01 = LOAD (ielādēt no atmiņas), seko viens baits ar atmiņas adresi. Mašīnkods: 01 10 (hex) — komanda: LOAD adresē 0x10.
- Opkods 0x02 = ADD (saskaitīt ar reģistru A), seko viens baits ar immediate vērtību. Mašīnkods: 02 05 — komanda: ADD A, #5.
- Sastapt binārā izskatā: 01 00010000 (pirmais baits 00000001 = 0x01, otrais 00010000 = 0x10).
Šis ir mācību piemērs; reālās arhitektūras (x86, ARM, RISC‑V u.c.) izmanto sarežģītākus un precīzi definētus kodēšanas noteikumus, adresēšanas veidus un paplašinājumus.
Praktiski aspekti un lietojums
Dažas būtiskas lietas, ko svarīgi zināt par mašīnkodu:
- Portabilitāte. Mašīnkods ir cieši saistīts ar konkrētu datora arhitektūru (ISA). Programma, kas salikta par mašīnkodu vienai arhitektūrai, parasti nedarbosies citā bez pārsalidošanas vai emulācijas.
- Assembleri un kompilatori. Cilvēkiem saprotamu, augsta līmeņa valodu vai asembleru kodu pārvērš mašīnkodā. Asemblera gadījumā viens mnemonisks ieraksts bieži atbilst vienai instrukcijai/mašīnkoda baitam.
- Interpretācija. Dažas sistēmas izmanto interpretētājus (piem., virtuālās mašīnas) — tad nav tiešas mašīnkoda izpildes uz aparatūras, bet interpretators pats izpilda komandas.
- Debug un reverse engineering. Rīki kā disassembleri (piem., objdump) pārvērš mašīnkodu atpakaļ uz mnemoniskiem vaicājumiem, ļaujot izsekot un labot programmas darbību.
- Drošība. Malware un ekspluatācijas bieži izmanto tiešu mašīnkoda manipulāciju. Tāpat zemo līmeni var izmantot optimizācijām vai aparatūras tuvām operācijām (firmware, draiveri).
Rīki un terminoloģija
Lai strādātu ar mašīnkodu, parasti izmanto:
- asemblerus (samapina mnemonikas uz mašīnkodu),
- kompilatorus (augsta līmeņa kodu pārvērš mašīnkodā),
- disassemblerus un dekompilatorus (pārveido mašīnkodu uz cilvēkam lasāmu formu),
- debuggerus un hexdump rīkus (analizē un rediģē mašīnkoda baitus),
- ISA specifikācijas un instrukciju tabulas — oficiālie dokumenti, kas apraksta opkodu nozīmi un kodēšanu konkrētai arhitektūrai.
Kopsavilkums
Mašīnkods ir tiešā, binārā instrukciju forma, ko izpilda procesors un kas ir vistuvāk aparatūrai. Tas sastāv no opkodiem un operandiem, kuru konkrēta izskata apraksts atkarīgs no datora arhitektūras. Lai strādātu ar mašīnkodu, izmanto specializētus rīkus, un bieži augsta līmeņa izstrāde prasa kompilēšanu vai asemblera izmantošanu, lai pārvērstu cilvēkam saprotamu kodu par mašīnai izpildāmu formu.
Mašīnkoda rakstīšana
Mašīnkodus var rakstīt dažādos veidos:
- Izmantojot vairākus slēdžus. Tas ģenerē secību no 1 un 0. To izmantoja skaitļošanas sākumposmā. Kopš 20. gadsimta 70. gadiem to vairs neizmanto.
- Izmantojot Hexredaktoru. Tas ļauj komandas numura vietā izmantot opkodus.
- Asemblera izmantošana. Asamblēšanas valodas ir vienkāršākas nekā opkodi. To sintakse ir vieglāk saprotama nekā mašīnvalodas, bet grūtāk saprotama nekā augsta līmeņa valodas. Asemblera programma pati pārtulkos pirmkodu mašīnkodā.
- Izmantojot augsta līmeņa programmēšanas valodu, programmās var izmantot kodu, ko ir vieglāk lasīt un rakstīt. Šīs programmas tiek tulkotas mašīnkodā. Tulkošana var notikt vairākos posmos. Java programmas vispirms tiek optimizētas baitkodā. Pēc tam tās tiek tulkotas mašīnvalodā, kad tās tiek izmantotas.

Agrīna minidatora priekšējais panelis ar slēdžiem mašīnkoda ievadīšanai
Tipiskas mašīnkoda instrukcijas
Instrukciju komplektā parasti ir atrodami dažādi instrukciju veidi:
- Aritmētiskās darbības: Saskaitīšana, atņemšana, reizināšana, dalīšana.
- Loģiskās operācijas: Konjunkcija, disjunkcija, noliegums.
- Darbības ar atsevišķiem bitiem: bitu pārvietošana pa labi vai pa kreisi.
- Darbības ar atmiņu: vērtības kopēšana no viena reģistra uz citu.
- Operācijas, kas salīdzina divas vērtības: lielāks par, mazāks par, vienāds.
- Operācijas, kas apvieno citas operācijas: saskaitīšana, salīdzināšana un kopēšana, ja vienāda ar kādu vērtību (kā viena operācija), lēciens uz kādu programmas punktu, ja reģistrā ir nulle.
- Operācijas, kas iedarbojas uz programmas plūsmu: lēciens uz kādu adresi.
- datu tipu konvertēšanas operācijas: piemēram, 32 bitu veselā skaitļa konvertēšana uz 64 bitu veselu skaitli, peldošā komata vērtības konvertēšana uz veselu skaitli (saīsinot).
Daudzi mūsdienu procesori dažām komandām izmanto mikrokodu. Sarežģītākās komandās to parasti izmanto. Tas bieži tiek darīts ar CISC arhitektūrām.
Instrukcijas
Katram procesoram vai procesoru saimei ir savs instrukciju komplekts. Instrukcijas ir bitu paraugi, kas atbilst dažādām komandām, kuras var uzdot mašīnai. Tādējādi instrukciju kopums ir specifisks procesoru klasei, kas izmanto (lielākoties) vienu un to pašu arhitektūru.
Jaunākos procesoru dizainos bieži vien ir iekļautas visas priekšgājēja instrukcijas un var tikt pievienotas papildu instrukcijas. Dažreiz jaunākā dizainā tiek pārtraukta vai mainīta instrukcijas koda nozīme (parasti tāpēc, ka tā ir nepieciešama jauniem mērķiem), ietekmējot koda savietojamību; pat gandrīz pilnībā savietojami procesori var uzrādīt nedaudz atšķirīgu dažu instrukciju uzvedību, taču tas reti rada problēmas.
Sistēmas var atšķirties arī citās detaļās, piemēram, atmiņas izvietojumā, operētājsistēmās vai perifērijas ierīcēs. Tā kā programma parasti ir atkarīga no šādiem faktoriem, dažādās sistēmās parasti netiek palaists viens un tas pats mašīnkods, pat ja tiek izmantots viena tipa procesors.
Lielākajai daļai instrukciju ir viens vai vairāki opkoda lauki. Tie norāda instrukcijas pamattipu. Citi lauki var norādīt operandu tipu, adresācijas režīmu utt. Var būt arī īpašas instrukcijas, kas ietvertas pašā opkodā. Šīs instrukcijas sauc par tūlītējām instrukcijām.
Procesoru dizaini var atšķirties arī citos aspektos. Dažādām instrukcijām var būt atšķirīgs garums. Tām var būt arī vienāds garums. Ja visām instrukcijām ir vienāds garums, var vienkāršot konstrukciju.
Piemērs
MIPS arhitektūrā ir 32 bitu garas instrukcijas. Šajā sadaļā ir kodu piemēri. Vispārīgais instrukcijas tips ir op (operācijas) laukā. Tie ir 6 augstākie biti. J tipa (lēciena) un I tipa (tūlītēja) instrukcijas pilnībā norāda op. R tipa (reģistra) instrukcijas ietver lauku funct. Tas nosaka precīzu koda darbību. Šajos tipos izmantotie lauki ir šādi:
6 5 5 5 5 5 5 5 6 biti [ op | rs | rt | rd | rd | šamts| funct] R-tips [ op | rs | rt | rt | adrese/ātrākais] I-tips [ op | mērķa adrese ] J-tipsrs, rt un rd norāda reģistra operandus. shamt norāda nobīdes summu. Adreses vai tūlītējās adreses laukā ir tieši operands.
Piemērs: saskaitiet reģistrus 1 un 2. Iegūto rezultātu ievietojiet 6. reģistrā. Tas ir kodēts:
[ op | rs | rt | rd | rt | rd | shamt| funct] 0 1 2 2 6 0 32 decimal 000000 00001 00010 00110 00000 100000 binaryIelādējiet vērtību 8. reģistrā. Ņemiet to no atmiņas šūnas 68 šūnās pēc 3. reģistrā norādītās vietas:
[ op | rs | rt | rt | address/immediate] 35 3 8 68 decimālā 100011 00011 01000 00000 00000 00001 000100 binālā binālāPāriet uz adresi 1024:
[ op | mērķa adrese ] 2 1024 decimālskaitlis 000010 00000 00000 00000 00000 10000 000000 binārais skaitlisSaistītās lapas
- Bināro skaitļu sistēma
- Kvantu datori
- Instrukciju komplekts
- Dators ar samazinātu instrukciju kopu
Jautājumi un atbildes
J: Kas ir mašīnkods?
A: Mašīnkods ir mašīnvalodā rakstīta datorprogramma, kurā izmanto konkrētas datora arhitektūras instrukciju kopumu un kuru parasti raksta binārā formā.
J: Kas ir zemākais programmatūras līmenis?
A: Mašīnkods ir zemākais programmatūras līmenis.
J: Kā datori izpilda citas programmēšanas valodas?
A: Citas programmēšanas valodas tiek tulkotas mašīnkodā, ko dators var izpildīt.
J: No kā sastāv mašīnkoda instrukcija?
A: Instrukcija mašīnkodā sastāv no opkoda (operācijas koda) un operanda(-iem). Operandi parasti ir atmiņas adreses vai dati.
J: Kas ir instrukciju kopums?
A: Instrukciju kopums ir datoram pieejamo opkodu saraksts.
J: Ko programmu veidotāji dara ar kodu?
A: Programmu veidotāji pārveido kodu citā valodā vai mašīnkodā.
J: Kāds ir cits mašīnkoda nosaukums?
A: Mašīnkods dažkārt tiek saukts par vietējo kodu, ko lieto, runājot par lietām, kas darbojas tikai dažos datoros.
Meklēt