Win32asm hello, világ és három freebies MASM32

Win32ASM: "Hello, World", és három freebies MASM32

# 1. Egy kis baloldali Denisa Richi hagyománnyá vált kezdeni fejlődés egy új programozási nyelvet hozzon létre egy egyszerű program „Hello, World”. Semmi emberi nem idegen számunkra - és tegyük vétkezzél.
A pozapr oshlom kérdés arról beszéltem, hogyan kell dolgozni szerelő apishnymi funkciókat, de talán nem érti;). Ez normális, és nem kell, mert ez a gond. Minden lesz több, mint világos, miután a írsz egy-két egyszerű programot, és elemzik azokat a sorokat.
Re-read „A minimális alkalmazás” és nyomkodjuk forrása a következő:

Íme két sort én batch fájlt (* .bat), amely lehetővé teszi, hogy nem „párolt” a parancssorba:

Vegye figyelembe, hogy a használni kívánt kulcs / alrendszer építeni a konzol alkalmazás: a konzol. Annak ellenére, hogy az ablak, amelyben fut, fájdalmasan emlékeztet „MS-DOS ülés”, hogy a program - vindoznoe teljes 32 bites alkalmazás a PE formátumban. Assembliruem, linkuem, fut, élvezzük.

# 2. És most nézzük, hogy ez egy forráskód szétszerelés.
Csecsebecsét 1. Így határozza meg a helyi változó nevű hStdout és akkora, mint egy dupla szó (DWORD). Miért helyi? És mivel ez már csak a Main eljárást. és ha megpróbáltuk elérni a változó hStdout kívül az eljárásban, a szerelő volna szidtam minket mindenféle rossz szó - ellentétben mondjuk az állandó sWriteText. akinek a neve „ismert” bárhol a programban.
Ügyeljen arra, hogy a h előtag a változó nevét. Csak hagyta meg magad egy emlékeztetőt, hogy a változó felszámolás alatt a fogantyút.
Csecsebecsét 2. Apishnaya SetConsoleTitleA funkció - Állítsa Tittle (a címet) a konzolt. Íme egy részlet a MSDN'a:

Csecsebecsét 3. A konzol tudjuk használni, mint egy beviteli eszköz (beviteli eszköz), kimeneti eszköz (kimeneti eszköz), egy eszköz a hibabejelentő (Device). Annak érdekében, hogy a munka ezzel a „kézi eszköz,” mi kell, hogy a nyél és a következő funkciók:

Az egyetlen paraméter, amely kötelező számunkra - egy jelzés, egy eszköz kívánunk szerezni „jegy” -hendl. Itt van egy táblázat:

Kezelje a standard input

Kezelje standard kimenetre

Mire van szükségünk? Nyomtatás a sor! Így - kérje a fogantyút a standard kimenetre, hogy van, mielőtt hívja a funkció „Sui” -11 a verem. Miután a regiszterben EAX tartalmaz hőn áhított „kezelni szabványos kimenet”. Tedd a kilincset változó hStdout (amelyeket mint elővigyázatosságból a töréspont 1) későbbi felhasználásra.

- Nos ez az, amit a rendetlenség? - Kiálts Önnek. - Mi az asztalra úgy, egészségtelen? Minden negatív számok, amelyek zhist nem emlékszik! Szeretnénk asztalra MSDN'e! Nem -10, -11, -12, és emlékeztető hosszú STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE!
Egyszerű! A forráskód, amit most azt fontolgatja, egészen pontosan tükrözi a valós folyamatok zajlanak a programok. Egy kicsit később fogjuk, hogy ez a változat C-stílusban és nézze meg, hogyan használhatja a magas szintű tervezés, nagyban megkönnyíti az élet az alacsony szintű programozó.

Csecsebecsét 4. Nos, végül, a legfontosabb dolog - jellemző, hogy valójában, és megjelenik a konzol húr. Itt van egy leírás:

Most, hogy már kiválogattam az összes paramétert, vegye figyelembe, hogy MSDN'ovskaya érdekében a paraméterek nem egyezik meg a sorrendet, amelyben írjuk, a verem a mi forráskódját. Menj vissza a minimális alkalmazását és azt állítják, 12 pontot stdcall olvassa el a szerződést. Most már értem?

5. töréspont érdekében sikerült élvezni az eredményt munkájuk igazak segítségével a Sleep hívja a program a késedelem 2 másodpercig. Azt hiszem, a paraméterek akkor könnyen érthető.

És végül, a töréspont 6 - kilép a program.

Tény, hogy a megfelelő stílust igényel explicit megjelenése minden alkalmazott források már nincs szükség, köztük kilincsek, annak ellenére, hogy azok automatikusan bezáródnak ExitProcess' om. De reméljük, hogy ha ezt nem teszi meg egy ilyen kis programmulina, mint a miénk, semmi rettenetes fog történni. Természetesen „tse formátum” nem számít.

# 3. Most az első lépést, hogy a nyers olvasható formában.
Tehát az első dolog, amit egy pillantást - ez egyenértékű előírt /MASM32/windows.inc fájlt.
Már találkoztunk MSDN'ovskoy jele:

Normál beviteli fogantyú

Szokásos kimeneti fogantyú

Standard hiba fogantyú

Azonban ahelyett, hogy az emlékezet intuitív érv STD_OUTPUT_HANDLE be a köteget az érték -11, sehol venni. Írjuk után azonnal az irányelv includelib a következő sort:

A vonal a push -11 helyére tolja STD_OUTPUT_HANDLE.
Mi történt? A program összeállítása gond nélkül, mert az elején a tőzsdei, regisztráltunk bere [Valens]. Egyszerűen fogalmazva, azt mondtuk szerelő: „Ha találkoznak a szövegben STD_OUTPUT_HANDLE program ezután szem előtt tartani, hogy ez ugyanaz, mint a -11.”. Más szóval, mi van olyasmi, mint egy állandó (nem változtatható!) A nevét és értékét STD_OUTPUT_HANDLE -11.
Most nyissuk meg a fájlt windows.inc és élvezze annak tartalmát. Van egy csomó „ekvivalens”, mint az egyik a fent tárgyalt! És, hogy kihasználják ezt a freebie - nem kell másolni ezt vagy azt a konstans a vágólapon keresztül. Meg tudod csinálni egy sokkal egyszerűbb - Add hozzá a forráskód irányelv

Válaszul a szerelő kivonat magát windows.inc minden rendelkezésre álló információt ebben a fájlban, és bemutatja, hogy a fordító egy ezüst tál.

# 4. A második freebie, amit majd használni - a „inkluda” (mondjuk csak úgy hívjuk fájlok * .inc) Prototype. Azt már láttuk, hogy az ilyen prototípusok, és milyen szerepet játszanak az összekötő programunkat import könyvtárak. Természetesen tehetünk, leírás alapján a függvény MSDN'ovkogo, hogy egy prototípus, de miért kell szorozni szervezetek túl szükség? Valóban, MASM32 egyes import könyvtár ugyanaz a fájl nevét és a prototípusok. Példánkban használtuk kernel32 funkciókat, és e kapcsolat azt kernel32.lib könyvtárban. De a megfelelő fájlt a prototípusok nevű kernel32.inc!
Mi lehetne ennél egyszerűbb? A mi forráskódot, hogy csökkentsék a sorban egység prototípusok, és a helyén lepim irányelv tartalmazza [útvonal] kernel32.inc. Fordítását és mint mondják a TV-ben, „most akkor felejtsd el ezeket a kellemetlen nedves lesz,” (. Uuups ismét elment brutális fantasy, ideje elindítani egy új bekezdés.).
Most talán eljött az ideje annak, hogy megtartom az ígéretemet, és magyarázza -, mi a fene mi ragadt a „A” betű a végén WriteConsole funkciót. Elmagyarázom - és mert nincs funkciója a Windows WriteConsole!

# 5. de WriteConsoleA és WriteConsoleW funkciót. „A” -, ha azt szeretné, hogy nyomtassa ki a húr ASCII formátumban (azaz minden karakter egy byte), és a „W” - ha Unicode (W -. A széles, nagy Unicode karakterek nem 8 bites, és 16 bites, és elfoglalják a két bájt). Ilyen záró csak azokat a funkciókat, amelyek valamilyen módon a munkát húr értékeket. ExitProcess funkciót. például egy ilyen szó végén nem - bíró magad, nem mindegy, amelyen a nemzeti nyelv befejezni a pályázatát?
Kernel32.inc nyissa meg a fájlt, és közelről a tartalmát, különösen a következőket:

Mint látható, MASM32 fejlesztőcsapat gondját nem csak a lap prototípusok, hanem a „függetlenség” a mi forráskódját a kiválasztott kódolásban. Ez azt jelenti, hogy „éleztesse” program keretében a UNICODE, nem kell cserélni a végén egy W a függvény neve. Egyszerűen priinklyudit másik fájl prototípusok és ekvivalensek, például

és a „gőz” a átírta a forráskódot.
Meg kell jegyezni, MASM32, mint a „unicode” inkluda nem, de könnyen csináld magad.

# 6. És végül, a harmadik legnagyobb „freebie” - egy kis Fenichka, amelynek használata közvetlenül fordul a makró szerelő kódolási nyelv programozási nyelv!
Ezzel a „fenechki” blokk utasítások:

mi könnyen helyettesíti a sort:

Vegye figyelembe, hogy ha ezt a parancsot, átadjuk balról jobbra, ugyanabban a sorrendben, mint az adásokat MSDN minket. Ellentétben lap „pushey” c „Cullom” a végén.

# 7. Most a legfontosabb szempont. Tartsa vissza a lélegzetét!
A fentiek fényében, és vysheraspisannogo vysheraszhevannogo forrásunk úgy nagyon szép „magas szintű” nézet: