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.

Autors: Leandro Alegsa

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).
Opkodi un operandi tiek kodēti bitu secībā (bieži attēloti heksadecimālā vai binārā formā). Instrukcijas formāts var būt fiksēta garuma (piem., 32 biti) vai mainīga (dažas arhitektūras, piemēram, dažas x86 instrukcijas, var ietvert dažādas garuma kombinācijas). Papildus lauki var iekļaut adresēšanas veidus, reģistra indeksus, karodziņu bitus un citus papildu informācijas laukus.

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ā).
Atkarībā no instrukciju kopuma ir pieejami dažādi adresēšanas režīmi — tie nosaka, kā operandus interpretēt (tieša adresēšana, netieša, ar bāzes + offsets, indeksēta u.c.).

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īšanaiZoom
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-tips

rs, 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 binary

Ielā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 skaitlis

Saistī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
AlegsaOnline.com - 2020 / 2025 - License CC3