Win32ASM: "Hello World" și trei freebies MASM32
# 1. Cu o mână ușoară stânga Denisa Richi a devenit o tradiție pentru a începe dezvoltarea unui nou limbaj de programare pentru a crea un program simplu „Hello World“. Nimic uman nu este străin pentru noi - și să ne angajăm acest păcat.
În problema oshlom pozapr am vorbit despre modul de a lucra cu funcții de asamblare apishnymi, dar probabil că nu înțeleg;). Acest lucru este normal și nu are nevoie sa din cauza acestei griji. Totul va deveni mai mult decât clar după ce cu voi scrie una sau două program simplu și să le analizeze pe liniile.
Re-citit „Aplicarea minimă“ și tamp următoarea sursă:
Aici sunt două linii din fișierul meu lot (* .bat), care vă permite să nu „aburit“ la linia de comandă:
Luați în considerare faptul că doriți să utilizați SUBSISTEMUL tasta / pentru a construi aplicația consolă: CONSOLE. În ciuda faptului că fereastra în care este rulat, dureros care amintește de „sesiune MS-DOS este“ pentru a obține programul - vindoznoe aplicație completă pe 32 de biți în formatul PE. Assembliruem, linkuem, alerga, ne bucurăm.
# 2. Și acum să dau o dezasamblare codul sursă.
Trinket 1. Astfel, vom defini o variabilă locală numită hStdout și de mărimea unui cuvânt dublu (DWORD). De ce locală? Și pentru că există numai în procedura principală. și dacă am încercat să acceseze variabila hStdout în afara acestei proceduri, de asamblare ne-ar fi certat tot felul de cuvinte rele - spre deosebire de, să zicem, sWriteText constantă. al cărui nume este „cunoscut“ oriunde în programul nostru.
Acordați atenție la prefixul h în numele variabilei. Tocmai l-am lăsat pentru tine un memento că variabila de lichidare sub mâner.
Trinket 2. Apishnaya caracteristica SetConsoleTitleA - set Tittle (titlu) pentru fereastra noastră consolă. Iată un fragment din MSDN'a:
Trinket 3. Consola putem folosi ca un dispozitiv de intrare (dispozitiv de intrare), dispozitiv de ieșire (dispozitiv de ieșire), un dispozitiv pentru raportarea erorilor (dispozitiv de eroare). Pentru a putea lucra cu acest „dispozitiv portabil,“ avem nevoie pentru a obține mâner cu următoarele funcții:
Singurul parametru care este necesară dintre noi - o indicație, pentru un dispozitiv dorim să obțină un „bilet“ -hendl. Aici este un tabel:
Manipulați la intrarea standard
Mâner standard de ieșire
Ce avem nevoie? Imprimare linie! Deci, - cere mânerul la ieșirea standard, adică, înainte de a apela funcția „Sui“ -11 pe stivă. După EAX registru funcția conține râvnit „mâner de ieșire standard de“. Puneți mânerul variabilă hStdout (pe care îl definim ca o măsură de precauție la punctul de întrerupere 1) pentru o utilizare ulterioară.
- Ei bine, asta este ceea ce o mizerie? - strigi. - Care este masa atât de nesănătoase? Orice numere negative, care, în zhist nu amintesc! Ne-ar dori să tabel în MSDN'e! Nu la -10, -11, -12, și mnemotehnică STD_INPUT_HANDLE lung, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE!
Simplu! Codul sursă, pe care îl analizăm acum, reflectă destul de fidel procesele actuale care au loc în program. Puțin mai târziu, vom da la versiunea în stil C și a vedea modul în care puteți utiliza unele dintre design la nivel înalt, în mare măsură facilitează viața programator de nivel scăzut.
Trinket 4. Ei bine, în cele din urmă, cel mai important lucru - o caracteristică care, de fapt, și afișează pe șirul de consolă. Aici este o descriere:
Acum, că ne-am rezolvat toți parametrii, rețineți că MSDN'ovskaya ordinea parametrilor nu se potrivește cu ordinea în care le-am scrie pe stivă în codul nostru sursă. Du-te înapoi din nou la aplicarea minimă și revendicarea 12 puncte stdcall citiți cu atenție acordul. Acum înțelegi?
5. Pentru breakpoint am reușit să se bucure de rezultatul muncii lor drepte, prin utilizarea Sleep apela programul o întârziere de 2 secunde. Cred că, cu parametrii puteți înțelege cu ușurință.
Și, în sfârșit, breakpoint 6 - ieșiți din program.
De fapt, stilul de drept necesită eliberarea explicită a tuturor resurselor angajate nu mai aveau nevoie de ei, inclusiv mânere, în ciuda faptului că acestea sunt închise automat om ExitProcess'. Dar să sperăm că, dacă nu facem acest lucru într-o astfel de programmulina mică ca a noastră, nimic nu se va întâmpla teribil. Firește, „formatul TSE“ nu contează.
# 3. Acum vom face primul pas pentru a aduce prime noastre într-o formă ușor de citit.
Deci, primul lucru pe care îl aruncăm o privire - este echivalent prevăzut în fișierul /MASM32/windows.inc.
Am întâmpinat deja MSDN'ovskoy semn:
Mâner standard de intrare
Mâner standard de ieșire
mâner Eroarea standard
Cu toate acestea, în loc de argumentul intuitiv mnemonic STD_OUTPUT_HANDLE introdus în stivă valoarea de -11, luată nicăieri. Să scrie imediat după directiva includelib linia următoare:
O linie de pe împinge -11 înlocui împinge STD_OUTPUT_HANDLE.
Ce sa întâmplat? Programul este compilat fara probleme, deoarece la începutul listării, am înregistrat teh [Valens]. Pur și simplu pune, am spus de asamblare: „Dacă întâlniți în programul STD_OUTPUT_HANDLE de text, apoi să aibă în vedere faptul că aceasta este aceeași ca și -11.“. Cu alte cuvinte, avem ceva de genul o constantă (nu variabila!) Cu numele și valoarea STD_OUTPUT_HANDLE -11.
Acum, deschide fișierul windows.inc și se bucură de conținutul său. Există o grămadă de „echivalente“, ca cel discutat mai sus! Și pentru a profita de acest drum liber - nu trebuie să copiați acest lucru sau că constantă prin intermediul clipboard. Puteți face mult mai ușor - adăuga directivei codul sursă
Ca răspuns, de asamblare se va extrage din windows.inc toate informațiile disponibile în acest fișier și îl va prezenta la compilator pe un platou de argint.
# 4. Al doilea freebie, pe care îl vom folosi - este „inkluda“ (hai doar ca noi numim fișiere * .inc) prototip. Am văzut deja că astfel de prototipuri, și ce rol au jucat în conectarea programul nostru de a importa biblioteci. Desigur, putem face, pe baza descrierii funcției MSDN'ovkogo, aduce un prototip, dar de ce avem nevoie pentru a se multiplica entități dincolo de necesitate? Într-adevăr, în MASM32 pentru fiecare bibliotecă de import are același nume și fișierul cu prototipuri. În exemplul nostru, am folosit funcțiile kernel32 și pentru care se leagă cu biblioteca kernel32.lib. Dar fișierul corespunzător cu prototipuri numit kernel32.inc!
Ce ar putea fi mai simplu? Din codul nostru de a reduce unitatea de linie cu prototipuri, iar în locul său Directiva lepim includ [cale] kernel32.inc. Compilați, și așa cum se spune la televizor „acum vă puteți uita aceste incomod să se ude“ (. Uuups a mers din nou fantezie brutală, timp pentru a începe un nou paragraf.).
Acum, este, probabil, a venit timpul să-mi țin promisiunea și să explice - ce naiba ne-am blocat litera „A“ până la sfârșitul funcției WriteConsole. Am explica - și pentru că nu există nici o funcție în Windows WriteConsole!
# 5. dar WriteConsoleA și funcția WriteConsoleW. „A“ - este, dacă doriți să imprimați șirul în format ASCII (adică fiecare caracter este un octet), iar „W“ - în cazul în care Unicode (W -. Din lat, lat în Unicode caractere nu sunt de 8 biți și 16-biți, și ocupă doi octeți). O astfel de închidere sunt doar acele funcții care într-un fel cu valorile șir de lucru. Funcția ExitProcess. de exemplu, un astfel de scop literală nu - judecător pentru tine, contează pe care limba națională pentru a completa cererea de locuri de muncă?
Kernel32.inc deschide fișierul și uita-te atent la conținutul, în special, la următoarele:
După cum puteți vedea, echipa de dezvoltare MASM32 a avut grijă să nu numai prototipurilor foaie, dar, de asemenea, despre „independenta“ a codului nostru sursă de codificare selectată. Aceasta este, în scopul de a „șlefuite“ program de sub UNICODE, nu avem nevoie pentru a înlocui sfârșitul A la W în numele funcției. Pur și simplu priinklyudit un alt fișier cu prototipuri și echivalente, cum ar fi
și „abur“ cu rescrierea codul sursă.
Trebuie remarcat în MASM32 ca „unicode“ inkluda nu, dar o puteți face cu ușurință singur.
# 6. Și, în sfârșit, al treilea cel mai mare „freebie“ - un mic Fenichka, utilizarea care se transformă imediat din macro codificare de asamblare limbaj de programare limba!
Cu acest „fenechki“ un bloc de instrucțiuni:
putem înlocui cu ușurință o singură linie:
Rețineți că atunci când utilizați această comandă, vom trece de la stânga la dreapta, în aceeași ordine ca și emisiunile MSDN noi. Spre deosebire de foi „pushey“ c „Cullom“ la sfârșit.
# 7. Acum, cel mai important punct. Țineți-vă respirația!
Având în vedere cele de mai sus, și vysheraspisannogo vysheraszhevannogo sursa noastra ia foarte frumos „nivel înalt“ vedere: