MASM Compiler
În toate lecțiile anterioare, am vorbit despre compilatorul TASM, deoarece este standard și neexploatat. Dar compilatorul mai popular este MASM, a fost creat special pentru scrierea programelor în asamblare pentru Win32. Are macrocomenzi și directive speciale pentru a simplifica programarea.
Funcția.
Principalul avantaj al MASM este macroul invoke, vă permite să apelați funcțiile API în mod obișnuit, verificând numărul și tipul parametrilor. Acesta este aproape același apel ca în TASM, dar această macrocomandă verifică numărul de parametri și tipurile acestora. Acesta este modul în care se numește funcția:
invoca <функция>, <параметр1>, <параметр2>, <параметр3>
Pentru a utiliza invocarea pentru a apela o procedură, trebuie să definiți prototipul acesteia:
Protocolul PROTO STDCALL: DWORD. DWORD. DWORD
Această directivă declară o procedură numită testproc, care are 3 parametri în dimensiunea DWORD.
Dacă faci asta.
invocați testproc, 1, 2, 3, 4
masm vă va oferi o eroare deoarece procedeul testproc are 3 parametri și nu 4. Masmul are, de asemenea, o verificare de tip, adică verifică dacă parametrii au tipul corect (dimensiunea).
testproc PROTO STDCALL: DWORD. DWORD. DWORD
.cod
testproc proc param1: DWORD, param2: DWORD, param3: DWORD
..........
putrezi
testproc endp
Aceasta creează o procedură numită testproc, cu trei parametri. Prototipul este folosit, invocați. Toți parametrii pot fi utilizați în codul procedurii, fiind extrași automat din stivă. De asemenea, variabilele locale pot fi utilizate în proceduri.
testproc proc param1: DWORD, param2: DWORD, param3: DWORD
LOCAL var1: DWORD
LOCAL var2: BYTE
mov ecx, param1
mov var2, cl
mov edx, param2
mov eax, param3
mov var1, eax
adăugați edx, eax
mul eax, ecx
mov ebx, var1
.Dacă bl == var2
xor eax, eax
.ENDIF
putrezi
testproc endp
Nu puteți utiliza aceste variabile în afara procedurii. Acestea sunt stocate pe stivă și sunt șterse la revenirea din procedură.
Construcții de comparație și repetare.
dacă
Am vorbit despre acest design în a zecea lecție. Are aceeași sintaxă ca TASM.
repeta
Această construcție execută blocul până când condiția este adevărată:
REPEAT
; cod aici
.UNTIL eax == 1
Această construcție repetă codul între repetare și până când eax devine 1.
în timp ce
Construcția în timp este o repetare a designului. Execută blocul până când condiția este adevărată:
WHILE eax == 1
; cod aici
.ENDW
Puteți utiliza directiva .BREAK pentru a anula buclele și pentru a ieși.
ÎN TIMP edx == 1
inc eax
.Dacă eax == 7
.BREAK
.ENDIF
.ENDW
Dacă eax = 7, bucla în timp va fi anulată.
Direcția continuă face o tranziție la codul de verificare a condiției de buclă în repetate și în timp ce constructe.Acum, primul nostru program este modificat după cum urmează:
486
.model plat, stdcall
casemap opțiune: niciunul
includeelib. \ masm32 \ lib \ kernel32.lib
includeelib. \ masm32 \ lib \ user32.lib
MessageBoxA PROTO STDCALL: DWORD. DWORD. DWORD. DWORD
ExitProcess PROTO STDCALL: DWORD
date
ttl db '11111', 0
.cod
începe:
invoca MessageBoxA, 0, offset ttl, offset ttl, 0
invocați ExitProcess, 0
Începeți sfârșitul
ML [/ options] fișier list [/ link linkoptions]
asamblarea fără legătură
Practic, veți utiliza această opțiune, deoarece veți folosi un linker extern (de exemplu link.exe) pentru a vă conecta fișierele.
generați un fișier obiect în format COFF
Aceasta generează un format de fișier pentru link-ul microsoft.
nume de fișier obiect
poate fi folosit dacă doriți ca fișierul de ieșire să aibă un nume diferit, nu același cu fișierul sursă.
Utilizează apelurile Pascal, C sau Stdcall
selectați tipul de apeluri pentru procedurile dvs.
Adăugați informații despre depanarea caracterelor
Setați această opțiune dacă doriți să utilizați depanatorul.
Setați include calea
Definește calea dvs. de includere
LINK [opțiuni] [fișiere] [@comandfile]
depanare
Aceasta va crea informații pentru depanare. Utilizați această opțiune atunci când doriți să utilizați depanatorul.
Tip de depanare: codeview / coff
Selectează formatul de ieșire al informațiilor de depanare. Depinde de depanatorul dvs. Softice și Visual C ++ debuggerii pot gestiona CV (codeview)
Fișier DEF
Specifică fișierul de definiție (.def). Folosit cu dll, pentru funcțiile exportate.
DLL
Fișierul de ieșire este un DLL, nu un EXE.
Calea către biblioteci
Specifică calea către fișierele bibliotecii (* .lib).
Setează calea pentru fișierele inc
Specifică calea pentru fișiere inc, în mod implicit.
Out: numele fișierului
Poate schimba numele fișierului de ieșire.
subsistemul
Selectează sistemul de operare pe care ar trebui să ruleze programul: NATIVE | WINDOWS | CONSOLE | WINDOWSCE | POSIX
Am instalat masm în dosarul d: \ masm \ masm32, în directorul d: \ masm sunt toate textele programelor noastre * .asm. Și pentru compilație am creat un fișier bat care compilează fișierul curent.asm:
; ====== [CUT AICI] =====
d: \ masm \ masm32 \ bin \ ml.exe / c / coff curent.asm
d: \ masm \ masm32 \ bin \ link.exe / subsistemul: windows current.obj
pauză
; ======= [CUT AICI] ========
Ca urmare, după pornirea acestui fișier, avem programul curent.exe gata în dosarul d: \ masm.
Acesta este sfârșitul acestei lecții. În această lecție, am vorbit despre compilatorul MacOS MASM. În următoarea lecție vom scrie prima aplicație de fereastră în asamblare.