Mi az az assembly

Első lépésként lehet érdemes lenne tisztázni, valójában mi is a programozás.

A Wikipédia szócikk szokás szerint nem ad túl sok támpontot nekünk, mivel:

Számítógép-programozás (vagy egyszerűen programozás) egy vagy több absztrakt algoritmus megvalósítását jelenti egy bizonyos programozási nyelven. A programozásban megtaláljuk a művészet, a tudomány, a matematika és a mérnöki tudomány elemeit.

Hát köszi a semmit internet! 

Az én, egyszerű, konyhanyelven megfogalmazott változatom:

A programozás a számítógépnek adott utasítások sorozata.

Ez is kicsit "nesze semmi, fogd meg jól", de emberközelibbnek érzem. Ugye mindenki látott már programkódot? Forráskódot, ha úgy tetszik, pl ilyen kódrészletet:

002-java-code.jpg

Ez nagyon jól néz ki, mert színes, tele van krikszkraksz karakterekkel, és még a kép is meg van döntve, úgyhogy nagy valószínűséggel valami totális mágia van mögötte.

Valójában ezek csak szépen egymás után leírt parancsok, amiket a számítógépünk értelmez, és végrehajt egymás után. 

Itt jön be egy kis csavar a képbe, mert azt már sokan hallottuk, hogy a számítógép nem tud mást, mint 1-eseket, meg 0-kat, meg rengeteg számot feldolgozni. De akkor most mi köze is van a fenti kódban látható "function", "return", "string", "false", meg egyéb angol nyelvű varázsigéknek az 1-esekhez, és a 0-khoz?

Egy kis történelem

Az 1950es években a "számoló" gépek (értsd: computer) még nem voltak olyan általános célúak, mint manapság. Egyszerűen megfogalmazva: egy gép = egy feladat. Ha bármilyen más számítási feladatra akarták használni, mint amire építve lett, gyakorlatilag át kellett huzalozni az egész masinát. 

Természetesen hamar rájöttek, hogy ez így nem túl hatékony. Jobb lenne, ha ezt az áthuzalozást, átkötözgetést egyszerűbben is meg lehetne valahogy oldani, hogy ne kelljen mindig mindent szétszerelni hozzá.

Az alábbi képen a Szegedi Számítástechnikai Múzeum egyik orosz csodája látható: (sajnos a tábláját nem fotóztam le, így a nevét nem tudom)

002-orosz-csoda.jpg

A belsejébe be is lehet nézni, és ott szemünk elé tárul ez az iszonyú látvány:

002-orosz-csoda-belul.jpg

Mivel ez még a mikroprocesszorok megjelenése előtt volt, szépen látszik, hogy itt bizony nem volt mese. Minden kábelekkel van megoldva, amit manapság már simán belezsúfolunk egy tűhegynyi chipbe.

Ám de itt már látszik, hogy a sok felesleges átdrótozást meg akarták könnyíteni, így a gép elejére került egy "kapcsolótábla", sok kis lyukkal, ahol ezeket az (át)kapcsolásokat rövid kábelekkel, "kényelmesen" meg lehetett oldani:

002-orosz-csoda-tabla.jpg

Megtörténtek hát az első lépések a számítógépek programozhatósága felé, de még hátravolt egy fontos dolog. Iszonyatosan lassú a munka a géppel, ha egy embernek ott kell állnia, és drótozni egész nap.

002-programming.jpg

Csináljunk hát sok általános célú kapcsolást belülre, például két szám összeadása, kivonása, szorzása, stb. Ezeket számozzuk meg, és a megfelelő szám megadásával lehessen őket aktiválni. (pl 63=összeadás, 41=szorzás, stb) Bár kényelmesebb volt az utasításokat egy számlapon bepötyögni, vagy épp mindenféle kapcsolókkal, de erre is hamar rájöttek, hogy bizony nem túl emberközeli.

002-control.jpg

Ha ezeket az számokat (utasításokat) tároljuk valamilyen memóriában, és a gép magától képes beolvasni következőt, és végrehajtani, akkor máris sokat könnyíthetünk az életünkön. Ezeket az utasításokat így elég egyetlen egyszer megírnia egy embernek, és onnantól a gép képes önállóan működni bármikor. Ha épp olyan kedvünk van, írhatunk másféle utasításokat is, és akkor a gép más funkciókat láthat el.

Megszülettek hát az első programok, és mindenki boldog volt. Vagyis majdnem mindenki.

Ugyanis ezek a programok (utasítássorozatok) nem voltak mások, mint hosszú számsorozatok. Hiszen a gép semmi mást nem ért meg, mint a számokat. Minden számnak megvan a maga jelentése, hogy mit is kell csinálnia a gépnek.

Ez manapság is így van, a legfejlettebb, leggyorsabb processzorok sem képesek másra, mint egy adott számmal jelzett utasítás végrehajtására.

Ezeknek a számoknak a sorozata a gépi kód, az egyetlen dolog mind a mai napig, amit egy mikroprocesszor megért. Nevezik még bináris kódnak, bináris futtathatónak, vagyis "binary executable". Gyakorlatilag ez az EXE, amire a windowsban rákattintasz, és a program elindul.

Mivel az emberi agy nehezen dolgozik számokkal, ám de sokkal könnyebben szavakkal, így magától adódott, hogy életük megkönnyítése érdekében az akkori mérnökök kitaláljanak maguknak egy emberbarátibb jelrendszert. Minden ilyen számkód (utasítás), kapott hát egy pár betűből álló "nevet", úgynevezett mnemonicot, amit könnyebben megjegyeztek.

Tegyük fel, hogy be akarunk olvasni egy számot a 123-as memóriacímről, és hozzáadni 10-et. Fiktív példánkban a beolvasás a 163-as kód, az összeadás pedig a 42. Tehát:

163 123 42 10

Ha az utasításokhoz mnemonicokat rendelünk, máris barátibb az emberi szemnek:

LOAD 123
ADD 10

És megszületett az assembly nyelv.

Az assemblyt alacsony szintű programozási nyelvnek hívjuk, mert gyakorlatilag a processzor közvetlen vezérlése, nagyon alapszintű utasításokkal. Nyelvnek hívjuk, hiszen ez már közelebb áll az emberi nyelvhez, mint a számok sorozata. Értelemszerűen itt már szükségünk van egy fordítóprogramra, ami a szavakat kicseréli a megfelelő számkódjukra. Ez az assembler. Az assembler programok eleinte csak az egyszerű mnemonic->számkód fordítást végezték, manapság már ezek is jóval fejlettebbek, rengeteg beépített kényelmi funkcióval. 

Ennél a résznél szokott felvetődni a kérdés, hogy "jójó, de az asssemblert milyen 'nyelven' írták?"

A szomorú igazság, hogy az első assemblert bizony gépi kódban kellett megírnia valakinek :)

De hogy jön ide a JAVA és a többiek?

A fejlődés következő lépése az volt, mikor kitalálták, hogy bizony vannak vissza-visszatérő feladatok, amiket felesleges többször megírni gépi kódban/assemblyben, pl egy szám kiírása a képernyőre, egy adat beolvasása, stb.

Ezek jópár, akár 50-80 vagy 200 utasításból álló sorozatok is lehettek, kellett valami még emberközelibb. Megszülettek hát a magasszintű programozási nyelvek, ahol ha a programozó leírta, hogy PRINT, akkor végrehajtódott a megfelelő, előre megírt utasítássorozat, és a gép kinyomtatta amit kellett.

Természetesen ehhez kellett egy program, ami értelmezte a PRINT parancsot, és lefordította a megfelelő számok sorozatára. Ez volt kezdetben az interpreter, később a compiler, de ebbe már nem megyek bele mélységeiben.

A magasszintű programnyelvek fejlődésével egyre kényelmesebben programozhatóak lettek a gépek, viszont nagy hátrány, hogy a könnyű programozhatósággal együtt nőtt ezen rendszerek fordítóinak bonyolultsága is. Így a végső, lefordított bináris kód mindig hosszabb, és lassabb volt, mint amikor egy ember leült, és megírta azt az adott feladatra optimalizáltan.

Manapság a jelenlegi rendszereken értelmetlen, és elképzelhetetlenül hosszú idő lenne csak assemblyben fejleszteni bármit is. Általában speciális helyzetekben használják, ahol pl elvárt a lehető legnagyobb sebességű futás, esetleg nagyon kicsi a rendelkezésre álló memória. 

Természetesen mindig vannak beteg, elborult arcok, akik megcsinálják azt, amit nem lehet, vagy teljesen értelmetlennek tűnik. A Menuet OS egy teljesen működőképes, kizárólag assemblyben írt operációs rendszer. Képek, letöltés itt

Röviden össszefoglalva, a ma használt magasszintű programnyelveken leírt, ember számára is értelmezhető szövegből (a forráskódból) egy fordítóprogram előállítja a végleges bináris számsorozatot, amit majd a processzor végre tud hajtani. Innen ered a "forrás"kód elnevezés egyik része, a "kód" pedig a fent említett, hosszú számok bepötyögésének idejéből ránkragadt szó. Csakúgy mint a "kóder", és a "kódolás" kifejezés is.

Fun fact: Képzeld el, amikor a fenti képen lévő orosz szupermasina belsejébe bemászik egy bogár (bug), és véletlenül rövidzárat okoz valahol a kábelek között. Innentől indulhat a bogártalanítás hosszú, és kellemetlen folyamata, amit ma "debugging"-nek nevezünk :) 

Az első ismert dokumentált bug 1947 szeptember 9-én, a Harvard Egyetem MARK II számítógépében:

002-bug.jpeg

Ui.: Ha a fenti hablaty nem érdekel, vagy nem volt egyértelmű, cseppet se aggódj, olvasd el a következő részt. Ja, és ne pánikolj ;)

A bejegyzés trackback címe:

https://c64assembly.blog.hu/api/trackback/id/tr3516179958

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Heretic83 2023.07.13. 19:15:38

Sziasztok!
Tudnátok ajánlani olyan tudástárt, ahonnan lehet tanulni bővebben az assembly programozásról? Érdekelne a dolog, de sajnos nem találtam megfelelő dokumentációt. Játékok programozásán gondolkodom, minden segítséget előre is köszönök!

C64 assembly alapok

Friss topikok

  • Heretic83: Sziasztok! Tudnátok ajánlani olyan tudástárt, ahonnan lehet tanulni bővebben az assembly programoz... (2023.07.13. 19:15) Mi az az assembly
  • tájbor1001110: Válaszolva a saját kérdésemre: Az End+o -val lehet 5 szín séma között váltogatni. (2022.09.20. 21:14) Turbo Assembler
  • tájbor1001110: Ne haragudj, aludtam rá egyet és észrevettem hogy a "*=$1000" direktívából hiányzik a '$'. (((: Bo... (2022.09.16. 08:56) Képernyőtörlés

Címkék

süti beállítások módosítása