2016. dec 27.

Hogyan lesz a kódunkból program?

írta: Ra0k
Hogyan lesz a kódunkból program?

Elmélet és a fejlesztői környezet telepítése

Sziasztok!

Ebben a bejegyzésben arról lesz szó, hogy hogyan lesz az assembly kódunkból futtatható állomány, gépi kód.

A 21. században remélhetőleg már mindenki számára egyértelmű, hogy a számítógép kettes számrendszerben dolgozik, binárisban, egyszerűség kedvéért 0-ban és 1-ben. Minden ami a képernyőn megjelenik egy jó hosszú 0, 1-es sorozatból áll elő, ez az úgynevezett gépi kód.

Miért nem programozunk gépi kódban? Mert kicsit sem emberi, kívülről kellene megtanulnunk 0, 1 sorozatokat, memóriacímeket kellene saját magunktól számolni és binárisba átírni stb. Elképzelhetetlené válna, nagyobb, összetettebb programok megírása korlátos idők alatt.

Ennek a feloldására találták ki az assembly-t, amelyik nyelvben a legközelebb maradunk a gépi kódhoz, és a gép logikája szerint kell programokat írnunk, mindenféle magasabb szintű absztrakciót nélkülözve. Kétségtelenül a legtöbb esetben egy assemblyben írt program egy másik nyelven gyorsabban megírható (ha megírható egyáltalán) viszont az assembly cserébe gyorsabb. Az assembly kódot az úgynevezett assembler fordítja le gépi kódra. Fontos megjegyezni, hogy általában minden processzorcsaládhoz saját assembly nyelv is tartozik, ami természetesen jellemzően sok hasonlóságot mutat más assembly nyelvek iránt.

A magasabb szintű nyelvek általában assembly nyelvre fordítanak, majd onnan tovább gépi kódra, a létrehozásuk célja, hogy a programozás ne gépi kód szerinti logika, hanem emberi logika szerint történjen. Azaz egyfajta absztrakciót valósítanak meg, sok esetben egy adott feladat-problémakörhöz. Továbbá lényeges, hogy az úgynevezett interpreteres nyelvek nem fordulnak le gépi kódra, hanem egy program értelmezi és hajtja végre az utasításait. Ezek a nyelvek lényegesen lassabbak.

Melyik programozási nyelvet válasszam? Általánosságban elmondható, hogy nem a programnyelv a lényeg, hanem gondolkodásmód, látni fogjuk, hogy a legtöbb nyelv alapvető elemei megegyeznek, a jó programozó mindig az adott feladathoz választ programnyelvet. Vannak programnyelvek amikkel kiválóan lehet bootloadert és operációs rendszert írni, de egy böngészős játékot, ha megszakadsz sem fogsz tudni. Ilyen nyelv például az assembly és a C. Én azt javaslom, hogy kezdésnek lehetőleg egy alacsonyabb szintű nyelvet válasszunk, hogy jobban megértsük a számítógép működését. Nem biztos, hogy jó ötlet javascript, jquery kombóval kezdeni, mert alapvető dolgokat sem fogunk megtanulni, annyi előre csomagolt kész megoldás létezik rá. Az én személyes véleményem, hogy érdemes egy teljesen kezdőnek a C++ nyelvvel kezdenie, mert a C-vel szemben már olyan magasabb szintű absztrakciók is megvalósíthatóak benne mint az OOP, ami sok munkahelyen elvárás, de a mutatók és a dinamikus helyfoglalással, a számítógép működését sok esetben elegendő mélységben megismeri. 

Fejlesztői környezet telepítése Assembly-hez Windows 10 alatt.

3 programra lesz szükségünk:
- notepad++ (vagy valamilyen szövegszerkesztő)
- nasm
- gcc (MinGW)

A notepad++ egyértelműen ahhoz kell, hogy a programunkat megírjuk benne. A nasm pedig egy assembler amivel x86/64 architektúrára tudunk assembly programot fordítani. A nasm parancsot jellemzően az -fwin32 kapcsolóval fogjuk használni, hogy úgynevezett object fájlt generáljunk belőle ami még nem közvetlenül futtatható, de már áthelyezhető, újrafelhasználható stb. Ebből az object fájlból fogunk a gcc paranccsal futtatható .exe fájlt generálni mindenki nagy örömére, ami már "csinál" is valamit.

Notepad++ letöltés itt
Nasm letöltése itt
MinGW letöltése itt

A Notepad++ és a Nasm telepítése egyértelmű, de a Nasm esetén szükségünk lesz a telepítési könyvtár címére, úgyhogy azt jegyezzük fel.
A MinGW telepítése után a MinGW Installation Managerben a képen látható csomagokat telepítsük. 

Ezt követően navigáljunk MinGW telepítési könyvtárán belül a "bin" mappába (nálam ez: C:\MinGW\bin) és onnan az összes DLL fájlt másoljuk be (ne áthelyezzük) a telepítési könyvtáron belül a libexec\gcc\mingw32\[verziószám] mappába (nálam: C:\MinGW\libexec\gcc\mingw32\5.3.0). 

Ha ezzel megvagyunk lényegében minden eszköz a rendelkezésünkre áll. Windows alól gyakran nehézkes ezeket a parancsokat használni, ezért én készítettem egy "compiler.bat" fájlt arra a helyre ahol az assembly programjaim vannak. Ennek a fájlnak a tartalma:


doskey nasm="C:\Users\Ra0k\AppData\Local\NASM\nasm.exe" $*
doskey gcc="C:\MinGW\bin\gcc.exe" $*
cmd \k

Az első két sor létrehoz egy-egy hivatkozást egy-egy programhoz. Az első sorban a nasm parancshoz kapcsoljuk a Nasm telepítési könyvtárában található nasm.exe fájlt, a másodikban pedig a gcc-hez a MinGW telepítési könyvtárában található \bin\gcc.exe fájlt. Az utolsó sor csak arról rendelkezik, hogy az első két sor végrehajtása után ne lépjen ki a parancssorból.

Ezek után ha egy assembly programot írunk, és elmentjük ASCII kódolásban mint valami.asm, ilyen módon fordíthatjuk gép kódra:
1. megnyitjuk a compiler.bat fájlt (ha a *.asm fájlunk másik könyvtárban van a cd paranccsal oda navigálunk)
2. beírjuk, hogy nasm -fwin32 valami.asm
3. beírjuk, hogy gcc valami.obj -o valami.exe
4. futtatáshoz beírjuk a parancssorba, hogy valami.exe vagy a szokásos módon kétszer a .exe fájlra kattintva is megtehetjük.

Ha ily módon elkészültünk a fejlesztői környezet felépítésével a számítógépünkön, nekivághatunk a fejlesztésnek is. Első Helloworld programunk megírásához itt találjátok a folytatást.

 

Szabó Dávid

Szólj hozzá

x86 Programozás GCC Assembly Nasm Programnyelv