A számítógépek a NEUMANN elveknek megfelelően a végrehajtandó program-utasításokat a memóriában tárolják. A memória ma már alapvetően byte szervezésű, egyetlen nagy méretű byte-sorozatnak tekinthető. Minden byte egy egész számot jelölhet, 0..255 értéktartományból. Ebből az következik, hogy a mikroprocesszor alapvetően az utasításokat is számoknak tekinti.
A gépi kódú programozási nyelvben az utasításokat számkódok jelölik. Amennyiben az utasításnak vannak paraméterei, úgy azokat is számként kell megadni. A gépi kódban létező fogalom a regiszter, amely a mikroprocesszoron belüli tárlórekeszt jelöl. Egy ilyen rekesz tartalma egy egész szám lehet. A regisztereknek kötött nevük van, pl. AX, BX, CX, DX. A 32 bites processzorokon a regiszterek nevei felvették az ’E’ előtagot (Extended AX regiszter – EAX). Aránylag kevés regiszter áll rendelkezésre (kevesebb mint 20 darab), és többnek speciális feladat volt, ezért nem lehetett akármilyen célra felhasználni. Két szám összeadását az alábbi módon kell végrehajtani:
1. Olvassuk be az első számot az EAX regiszterbe a memóriából.
2. Az EAX regiszterhez adjuk hozzá a második számot.
3. Az eredményt (az EAX regiszter új értékét) tároljuk a memória egy másik pontján.
ábra
Az utasításokat számkódok jelölik. Ezek a számok 0..255 közötti egész számok. A számkódokat leggyakrabban hexadecimális formában adják meg. A bal oldali oszlopban a memóriacímeket adjuk meg (0044F02B,…) ahol az adott gépi kódú utasítást tároljuk. A gépi kódú utasítások a második oszlopban vannak (a 8B45F4 számsorozat egyetlen gépi kódú utasítást (8B), valamint a paramétereit jelöli: honnan kell beolvasni az értéket az EAX regiszterbe (45,F4)).
A fentieken is látszik, hogy a gépi kódú programozási nyelv nehézkes, nehezen tanulható. A kész program nehezen megérthető, nem áttekinthető.
Sok más hátránya mellett külön kiemelendő, hogy a gépi kódú programokat alkotó utasítások csak az adott mikroprocesszor számára érthetőek. Vagyis más processzor esetén az utasításkódok is mások. Nemcsak számkódjukban különböznek, hanem esetleg kevesebb vagy több utasítás van, illetve más-más a paraméterezése a hasonló feladatú utasításoknak. Ha egy gépi kódban programozó számára egy másik processzorra kellett programot írni, először még el kellett sajátítania a különbségeket. Nyilván az alapelvek maradtak, de az utasítások különbözősége sok nehézséget okozott.
A programozó szemszögéből a gépi kódban történő programozás nagyon lassú folyamat. Aprólékosan lehet csak a programot felépíteni. Az utasítások nagyon alacsony szintűek voltak, egy egyszerű összeadás művelet is - mint láttuk a fenti példán – három utasításból állt. Egy nagyobb rendszer elkészítése olyan időigényes feladat lenne, hogy inkább csak rövidebb, egyszerű programokat készítettek benne a programozók.
Előnyei persze akadnak ennek a nyelvnek is: a gépi kódú utasítások segítségével maximalizálhatjuk a programunk futási sebességét, vagy memória-kihasználtságát (vagy mindkettőt egyszerre), hiszen megkötések nélkül felhasználhatjuk a mikroprocesszor minden lehetőségét, és szabadon használhatjuk a memóriát is.