A gépi kód a számítógép-programoknak az az egyetlen formája, amelyet az elektronikus digitális számítógépek[j 1] processzora beolvasni, értelmezni és végrehajtani képes. Minden számítógépes programot végül gépi kódú formára átalakítva kell a processzorral közölni. A program gépi kódúvá alakítását a programfejlesztő rendszerek fordítóprogramjai végzik el.

A gépi kód nem programozási nyelv, hanem maga a program, a processzor áramköreit irányító elektronikai jelsorozat. (vesd össze: Forráskód)

Az elektronikai szint szerkesztés

Jelenleg minden digitális eszköz elektronikus tárolója bináris memóriaelemekből áll. Ezek a memóriaelemek mindig a pontosan két lehetséges állapot valamelyikében vannak.[j 2] Ez az állítás minden digitális tároló minden elemére igaz, már közvetlenül az eszköz bekapcsolása után is. A processzor és a program számára az elemek kezdeti állapota érdektelen, mert a program szempontjából lényeges memóriacellák tartalmát minden program a megfelelő kezdőértékre állítja, mielőtt a végrehajtást folytatná. A többi memóriacella tartalmát pedig a processzor nem figyeli, amíg arra utasítást nem kap.

 
Processzor egy nyomtatott áramköri lapon

A programozók és felhasználók számára teljesen érdektelen dolog, hogy egy memóriaelem kétféle állapotát fizikailag milyen technikával valósítják meg. A programozók az egyik állapotot "magas"-nak, a másikat "alacsony"-nak hívják, és ezek írásban való jelölésére egyezményesen az 1 és 0 számjegyeket használják. A memória alapelemeit emiatt a bináris (értsd: két lehetőségből valamelyik állapotú) természetük miatt biteknek nevezik. A gépi kódú program az operatív memória (megszokott jelöléssel RAM) egy összefüggő területén levő bitek meghatározott tartalmú egymásutánja. Ennek a memóriaszakasznak a beállítását jelenti a program betöltése.

A program végrehajtása egészen közelről vizsgálva azt jelenti, hogy egy önálló elektronikus egység (a címvezérlő) a processzor bemenő vezetékeinek elektromos állapotát egy rögzített rend szerint az operatív memória soron következő elemeinek (bitjeinek) aktuális állapotára állítja be. (Leegyszerűsítve ezt úgy is mondhatjuk, hogy "megmutatja" a processzornak, hogy a végrehajtandó program a memóriában hol kezdődik.) Ennek következményeként a processzoron belüli, rendkívül összetett hálózat áramkörei, egymásra is hatva, az áramkörökben levő logikai kapuk és más félvezető elemek által meghatározott állapotúra kapcsolják a kimenő vezetékeket,[j 3] illetve változtatják meg a processzoron belüli tárolóelemek (regiszterek) állapotát. Ezzel a processzor végrehajtotta a program egy utasítását. Hogy a számítógépeink elméleti alapját adó Turing-gép modelljének egy fontos elemét ne hagyjuk ki: ezután a címvezérlő a programot tároló memória következő bitcsoportjára lép, és az eljárás onnan folytatódik, egészen a számítógép áramtalanításáig.[j 4]

Megjegyzés: Logikus kérdés, hogy ha a processzor mindent csak egy programban levű utasításra csinál, akkor mi utasítja őt arra, hogy a legelső betöltött programot végrehajtani kezdje. A számítógép integrált áramköri hálózata úgy van megtervezve, hogy ha a reset elnevezésű bemenő vonalának állapota átbillen – ezt okozhatjuk a reset-gombbal is, de az áram alá helyezés, a bekapcsolás is ezt teszi –, akkor a címvezérlő egy pontosan meghatározott kezdőértéket vegyen fel, és ezután a processzor megkezdheti a fent leírt ismétlődő eljárást. Minden ezután következő tennivalót már az a program írja elő, amelynek az utasításai azon a bizonyos címen kezdődő kódsorozatban vannak tárolva. Ahhoz, hogy a gép kikapcsolásakor ez ne törlődjön, és a bekapcsoláskor azonnal elérhető legyen, ezt a programot egy nem felejtő memóriában, szokásos elnevezéssel ROM-ban tárolják. A PC-k esetében ez a kezdőprogram a BIOS egyik részlete, amelyet úgy írnak meg, hogy azon a bizonyos kezdőcímen legyen az első utasítása.
 
Egy rendkívül egyszerű logikai hálózat vázlata egy IC belsejében

A műveletsorban részt vevő áramkörök a műveleteket pikoszekundumos nagyságrendű eltérésekkel kezdik meg és fejezik be. Az ebből kialakulni képes, a rendszert megbízhatatlanná tevő hazárdjelenségekek kizárására az áramkörök leírt mozzanata az utasítás végrehajtására összehangoltan zajlik le, az összehangolásról egy erre szolgáló elektronikai elem által adott órajel gondoskodik. Ha egy processzor órajel-frekvenciája 1 GHz (gigahertz), akkor egy másodperc alatt 1 milliárdszor kapják meg a bemenő vonalak az új állapotukat és állítják be aszerint a megfelelő kimenő áramköröket.

A régebbi processzorok esetében ez az összehangolt áramköri tevékenység viszonylag kevés típusú gyakorlati műveletet eredményezhetett: a memória egy byte-jának átmásolása a processzor valamelyik regiszterébe, valamelyik regiszter pillanatnyi tartalmának átmásolása a memória valamelyik byte-jába, egy regiszter átmásolása egy másikba, két regiszter között végzett logikai művelet, léptetés vagy aritmetikai összeadás eredményének tárolása egy regiszterben; és nem utolsósorban a címvezérlő értékének beállítása valamely megadott memóriaelem címére. Bármilyen hihetetlen, összesen ekkora eszközkészlettel ma is meg lehetne írni bármilyen számítógépes programot, ugyanis minden program visszavezethető ilyen elemi áramköri lépések sorozatára. De azért, mert egy ilyen utasításokból felépített egyszerű műveletsort gyorsabban képes a processzor végrehajtani, ha az a saját áramkörein belül van megvalósítva, mint ha az operatív memória byte-jaiból olvassa be a műveletsor kódjának lépéseit, a processzorokba egyre összetettebb alapműveletek elvégzésének képességét építik be. Ez azt jelenti, hogy ha két nagy egész számot akarunk összeszorozni, akkor ma már nem kell ehhez leírnunk, hogy hogyan kell a processzornak ezt megoldania egyszerű utasítások sorozatával, hanem elég a két számot elhelyeznünk valahol a memóriában, és utasítani a processzort, hogy ezeket szorozza össze, egyetlen áramköri mozzanatban. A számítógépek sebességének gyors növekedését ilyen összevonások is tették lehetővé, ehhez természetesen a processzorok áramköreinek méretét csökkenteni, a sebességét pedig növelni kellett, ami hosszú és roppant költséges fejlesztések eredménye.

Egy számítógép működését tehát mindig valamilyen program irányítja, és a programok a processzor tervezői és a szoftverek megírói közötti együttműködés eredményeként a fent leírt részletességgel előrják a processzor áramköreinek minden egyes lépését. Az előfordulhat, hogy a program valamilyen helyzetre tévesen írja elő a teendőket, arra is volt példa[1][2][3], hogy a processzor áramköri hálózata tervezési hiba miatt nem hajszálpontosan az elképzelés szerint hajtott végre egy utasítástípust, de olyan nem létezik, hogy a processzor valamiféle önálló lépést kezdeményezzen, bármiről önállóan "döntsön", vagy a program utasításait felülbírálja.

  1. Ilyen értelemben számítógépnek tekinthetünk minden digitális, programozható elektronikus áramköri hálózatot, működtessen az akár egy személyi számítógépet, GPS-navigátort, elektronikus karórát, mosógépet vagy egy autó ablakfűtését. A programozhatóság akkor is igaz, ha a programon a felhasználó nem tud változtatni.
  2. Tipikus tévedés, amikor a két állapotról úgy beszélnek, hogy a tárolóelem azok valamelyikébe egy harmadik, "semleges" állapotból váltana át. Nincs harmadik állapot.
  3. A be- és kimenő vezetékeket a felhasználó nem látja, mert azokon az alaplapon és a processzoron belül levő milliméternyi nyomtatott áramköri pályákat kell érteni.
  4. Igen, az áramtalanításig, mivel a számítógép akkor is egy programot hajt végre, amikor a felhasználó szemszögéből nézve nem csinál semmit, hanem csak vár. Akkor is, ha a képernyő teljesen fekete, és legfeljebb egy kurzor villog rajta. Ezalatt ugyanis rendszeresen ellenőrzi, hogy történt-e billentyűleütés vagy egérmozdulat, figyeli a perifériák esetleges jelzéseit és így tovább.

Kompatibilitás szerkesztés

A gépi kód éppúgy, mint a programnyelvek, utasításokból áll. Az utasításokat kódoló bitkombinációk (a kódszótár) olyan műveleteket tesznek lehetővé, amelyeket a processzor tervezői a később ehhez készíthető programok várható köréhez legjobban megfelelőnek találtak. Ezért a különböző cégek processzoraihoz jellegükben is eltérő utasításkészletek tartozhatnak. Az is egyedi, hogy a processzor áramköreinek be- és kimenő vonalai milyen elrendezésben helyezkednek el. Változatos lehetőségeket kínál az is, hogy az utasításokhoz tartozó kiegészítő adat, például a műveletben érintett memóriaelemek címe milyen rendszerben legyen megadva, milyen sebességnövelő megoldásokkal kiegészítve lehet benne egyszerre több dolgot is megadni. Végeredményben az derül ki tehát, hogy a processzorok a tervezők egyéni céljait és elképzeléseit tükrözik, ezért ha ugyanazt a gépi kódú utasításkódot továbbítjuk a különféle gyártmányú processzorok bemenő vonalaira, teljesen eltérő reakciókat fogunk kapni.

Tegyük fel, hogy a processzorunk bemenő vonalainak a száma 4. Tegyük fel azt is, hogy ezeken a vonalakon ahhoz, hogy az A regiszter tartalmát átmásolja a memória legelső cellájába, ezt a jelkombinációt kell beállítanunk:

1 0 1 1

A négy vonalon az 1 és 0 értékeknek összesen 16 féle variációja hozható létre, és egy másik processzor gyártójának semmi különösebb oka nincs arra, hogy ezt a műveletet az ő processzora ne erre a beállításra végezze el: 0 1 1 0. Sőt, az sem szükséges, hogy az ő processzora képes legye ennek a műveletnek a közvetlen elvégzésére.

Ha a processzor összesen 13 különböző utasításkód végrehajtására van kidolgozva, akkor a négy vonalon az összes variáció közül van 3 olyan, amelyhez a gyártó nem tervezte meg a processzor működését, kimenetét. Ha a bemeneten egy ilyen definiáltatlan (gyakran inkább dokumentáatlan) variációt állítunk be egy utasításkóddal, az eredmény általunk ismeretlen tényezőktől függ, előrejelezhetetlen, látszólag véletlenszerű lehet.


Ez így nem jó

Numerikus szint szerkesztés

A gépi kód a számítástechnikában használt műveletek és adatok (általában bináris – kettes számrendszeren alapuló – vagy hexadecimális – tizenhatos számrendszeren alapuló – számokkal ábrázolt) olyan sora, amely a számítógép processzora számára közvetlen utasításként értelmezhető.

A gépi kód az egyetlen "nyelv", amit a számítógép központi parancsvégrehajtó egysége, a processzor megért, ezért minden programozási nyelvet gépi kóddá kell alakítani ahhoz, hogy a program végrehajtható legyen. Ezt az átalakítást végzik a fordítóprogramok. Ezek az utasítások általában csak egy processzortípusra vonatkoznak, és azon belül is generációnként változhatnak (az újabb processzorokban az előzőnél több utasítás szokott lenni). Az egyes processzortípusok utasításkészletei egymással egyáltalán nem kompatibilisek. Ez azt jelenti, hogy egy másik processzorra készített programot (ez alól az operációs rendszerek se kivételek) nem tudnak végrehajtani (például Alpha-s Windows-ot nem lehet PC-kre feltenni és fordítva, vagy PC-s Linux-ot nem lehet SPARC-ra feltenni és fordítva stb.).

A gépi kódhoz legközelebb álló programozási nyelv az assembly. (A közel állás itt azt jelenti, hogy az assembly utasításokból álló program és a gépi kódú lefordított program között a legnagyobb a kölcsönösen egyértelmű megfelelés, vagyis az assembly utasítások, programsorok nagy részéhez egy gépi kód csoport tartozik, és ez igaz fordított irányban is.)




Példa gépi kódú programra szerkesztés

Az alábbi program egy gépi kódú programpélda. Az adatokat tizenhatos számrendszerben, byte-onként csoportosítva ábrázolja. (Ez egy "tetszőlegesen választott" ábrázolási forma, mivel jelölhetnénk például bináris számrendszerben vagy tízes számrendszerben is: a program ugyanaz lenne.)

B8 D4 07 00 00 90 48 75 FC C3

A példa assembly eredetije szerkesztés

A fenti gépi kód az alábbi GNU/as assembly forrásprogramból készült (de készülhetett volna természetesen tetszőleges más programnyelven írt programból is; az assembly programozási nyelv mindössze a gépi kódhoz eső „legközelebbi” nyelv, így a legjobban láthatóak a programnyelv utasításai és a gépi kódú végeredmény közötti kapcsolatok):

.globl main
       .type main,@function
main:
       movl    $2004,%eax
loop1:
       nop
       decl    %eax
       jnz     loop1
       ret

Források szerkesztés

  1. Továbbra is hiba rejtőzik a Pentium 4-ben (svg.hu)
  2. Tucatnyi javítható és javíthatatlan hiba az Intel 90 nanométeres technológiával gyártott Pentium 4 processzoraiban (hwsw.hu)
  3. Az x86-os processzorok története – A Pentium-hiba (egalizer.hu)


w:en:Template:Quote box