Gépi kód

Gépi kód ( platform-orientált kód ), gépi nyelv  - egy adott számítógép parancsainak rendszere (műveleti kódok halmaza) , amelyet közvetlenül a számítógép processzora vagy firmware -e értelmez . [egy]

A gépi nyelven írt számítógépes program gépi utasításokból áll , amelyek mindegyike gépi kódban ún. opcode  - a gép parancsrendszeréből származó egyetlen művelet bináris kódja . A programozás kényelme érdekében a numerikus műveleti kódok helyett, amelyeket csak a processzor ért, általában a feltételes alfabetikus emlékeztetőjüket használják . Az ilyen mnemonikák egy halmazát néhány további szolgáltatással (például néhány makróval, direktívával ) együtt assembly nyelvnek nevezzük .

Minden processzormodellnek saját utasításkészlete van, bár sok modellben ezek az utasításkészletek nagymértékben átfedik egymást. Az A processzor kompatibilis a B processzorral, ha az A processzor teljesen „érti” a B processzor gépi kódját . Ha az A és B processzornak van valamilyen részhalmaza az utasításoknak, amelyekkel kölcsönösen kompatibilisek, akkor azt mondjuk, hogy azonos „architektúrájúak” (ugyanaz az utasításkészlet-architektúra ).

Gépi utasítás

Minden gépi utasítás egy adott műveletet hajt végre, például műveletet az adatokon (például gépi szó hozzáadása vagy másolása egy regiszterben vagy a memóriában ), vagy ugrás egy másik kódrészletre (a végrehajtási sorrend megváltoztatása; ebben az esetben a Az ugrás lehet feltétel nélküli vagy feltételes , az előző utasítások eredményétől függően). Minden végrehajtható program ilyen atomgépi műveletek sorozatából áll.

Az egyetlen gépi utasításként írt műveletek "egyszerű" ( elemi műveletek ) és "összetett" műveletekre oszthatók . Ezenkívül a legtöbb modern processzor különálló „működtető elemekből” áll – olyan számítási egységekből, amelyek csak korlátozott számú egyszerű műveletet tudnak végrehajtani. A következő utasítás végrehajtásakor a processzor egy speciális blokkja - a dekódoló - lefordítja (dekódolja) elemi műveletek sorozatává, amelyeket meghatározott végrehajtó eszközök értenek.

A processzor utasításkészletének architektúrája határozza meg, hogy milyen műveleteket tud végrehajtani, és mely gépi utasítások milyen numerikus műveleti kódoknak (opcodes) felelnek meg. Az opkódok állandó hosszúságúak ( RISC- , MISC - architektúrák esetén) és tartományuk ( CISC -architektúrák esetén; például: x86 architektúra esetén a parancs 8-120 bites hosszúságú).

A modern szuperskaláris processzorok képesek több gépi utasítás végrehajtására egyetlen órajel alatt .

A gépi kód mint programozási nyelv

A gépi kódot tekinthetjük primitív programozási nyelvnek, vagy a lefordított vagy összeállított számítógépes programok legalacsonyabb szintű reprezentációjának. Bár lehet programokat közvetlenül gépi kódban írni, erre ma már ritkán kerül sor a kód nehézkessége és a processzorerőforrások kézi kezelésének fáradságossága miatt, kivéve az olyan helyzeteket, amikor extrém optimalizálás szükséges . Ezért a programok túlnyomó többségét magasabb szintű nyelveken írják, és a fordítók gépi kódra fordítják . A gépi kódot néha natív kódnak (más néven natív kódnak ) nevezik, amikor egy nyelv vagy  könyvtárak platform-specifikus részeiről beszélünk . [2] 

Az értelmezett nyelvű programokat (például a Basic vagy a Python ) nem fordítják le gépi kódra; ehelyett vagy közvetlenül a nyelvi értelmező hajtja végre őket, vagy pszeudokódba ( bytecode ) fordítják le . Azonban ezeknek a nyelveknek a tolmácsai (amelyek maguk is processzornak tekinthetők) általában gépi kódban vannak ábrázolva.

Mikrokód

Egyes számítógép-architektúrákban a gépi kód támogatását a programok még alacsonyabb szintű rétege, az úgynevezett firmware biztosítja . Ez lehetővé teszi egy gépi nyelvű interfész biztosítását a teljes számítógépsor vagy -család számára, amelyek között jelentős szerkezeti különbségek lehetnek, és megkönnyíti a gépi kódú programok átvitelét a különböző számítógépmodellek között. Példa erre a megközelítésre az IBM System/360 számítógépcsalád és utódaik: a 8–64 bites és magasabb buszok ellenére a gépi nyelv szintjén közös architektúrát használnak.

Egy mikrokódréteg használata egy emulátor megvalósításához lehetővé teszi, hogy a számítógép egy teljesen más számítógép architektúráját képviselje. A System/360 sorban ezt használták a korábbi IBM gépek programjainak az új családba való portolására – például az IBM 1401/1440/1460 emulátorra az IBM S/360 40-es modellen.

Abszolút és pozíciófüggetlen kód

Abszolút kód ( angol  abszolút kód ) - a processzor általi közvetlen végrehajtásra alkalmas programkód [1] , vagyis olyan kód, amely nem igényel további feldolgozást (például a kód különböző részei közötti kapcsolatok feloldása vagy a memóriában lévő címekhez kötés, általában a programbetöltő hajtja végre ). Az abszolút kód példái a .COM formátumú végrehajtható fájlok és az MBR -ben található operációs rendszer betöltő . Az abszolút kódot gyakran szűkebb értelemben pozíciófüggő kódként (vagyis meghatározott memóriacímekhez kötött kódként) értjük.

A pozíciófüggetlen kód egy olyan program  , amely tetszőleges memóriaterületen elhelyezhető, mivel a benne lévő memóriacellákra való minden hivatkozás relatív (például a programszámlálóhoz képest ) . Egy ilyen program bármikor áthelyezhető egy másik memóriaterületre, ellentétben az áthelyezhető programmal , amely bár bármely memóriaterületre betölthető, a betöltés után ugyanazon a helyen kell maradnia. [egy]

A pozíciófüggetlen kód létrehozásának képessége a célplatform architektúrájától és utasításkészletétől függ. Például, ha egy utasításkészletben minden ugrási utasításnak abszolút címet kell megadnia, akkor az ugrásokat igénylő kódot szinte lehetetlen pozíciófüggetlenné tenni. Az x86 architektúrában az adatutasításokban a közvetlen címzést csak abszolút címek reprezentálják, de mivel az adatcímeket a szegmensregiszterhez viszonyítva tekintjük , amely bármikor megváltoztatható, így pozíciófüggetlen kódot hozhat létre saját memóriával. adatok helyei. Ezenkívül néhány utasításkészlet-korlátozás feloldható önmódosító kóddal vagy nem triviális utasítássorozatokkal.

Program "Helló, világ!"

Helló világ! » x86 processzor esetén ( MS DOS , a kimenet az int 10h BIOS megszakítással) a következő ( hexadecimális jelöléssel ):

BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21

Ez a program 100 16 eltolásnál működik . Az egyes utasítások színnel vannak kiemelve:

Ugyanez a kód az assembler parancsokban :

XXXX:0100 mov bx, 0111h  ; tedd be bx-be a HW karakterlánc eltolását XXXX:0103 mov cx, 000Dh  ; írja be a HW karakterlánc hosszának cx-ét XXXX:0106 mov ah, 0Eh  ; tedd be ah a 10h megszakítási függvényt XXXX:0108 mov al, [bx]  ; írja be al annak a memóriahelynek az értékét, amelynek címe bx-ben van XXXX:010A bx  ; ugrás a karakterlánc következő bájtjára (növekmény eltolása 1-gyel) XXXX:010B int 10h  ; hívás megszakítása 10 óra XXXX:010D hurok 0108  ; csökkentse a cx-et 1-gyel, és ha az eredmény≠0, akkor ugorjon a 0108-as címre XXXX:010F int 20h  ; megszakítás 20h: program befejezése XXXX:0111 HW db 'Hello, World!'  ; a nyomtatandó karakterlánc

Lásd még

Jegyzetek

  1. 1 2 3 Explanatory Dictionary of Computing Systems = Dictionary of Computing / Szerk. V. Illingworth és mások: Per. angolról. A. K. Belotsky és mások; Szerk. E. K. Maszlovszkij. - M . : Mashinostroenie, 1990. - 560 p. - 70 000 (további) példány.  - ISBN 5-217-00617-X (Szovjetunió), ISBN 0-19-853913-4 (Egyesült Királyság).
  2. Kate Gregory. Felügyelt, nem menedzselt, natív: milyen kód ez? (2003. április 28.). Letöltve: 2012. március 27. Az eredetiből archiválva : 2012. május 30.