Win32 Assembly
C:\MASM32
;C:\MASM32\INCLUDE
,C:\MASM32\LIB
.C:\TASM
;C:\TASM\INCLUDE
,C:\TASM\LIB
.C:\MASM32\WIN32ASM
;C:\TASM\WIN32ASM
.
Figura 1 - PRIMO.ASM |
---|
int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
IDOK = 00000001h
HWND TYPEDEF DWORD
LPCTSTR TYPEDEF DWORD
MB_OK OR MB_ICONINFORMATION
00000000h OR 00000040h = 00000040h
UINT TYPEDEF DWORD
.MessageBoxA PROTO :DWORD, :DWORD, :DWORD, :DWORD
MessageBoxA PROTO :HWND, :LPCTSTR, :LPCTSTR, :UINT
C:\MASM32
,C:\MASM32\BIN
;c:\masm32\win32asm
;..\bin\ml /c /coff /Fl primo.asm
C:\TASM
,C:\TASM\BIN
.C:\TASM\WIN32ASM
...\bin\tasm32 /l primo.asm
OPTION CASEMAP: NONE
.MODEL
non supporta l'opzione STDCALL; non potendo
utilizzare questa direttiva, dobbiamo scordarci tutte le comodita' legate all'uso dei modelli di
memoria. In parole povere, siamo costretti a riscrivere il nostro programma in puro
Assembly; la Figura 2 mostra appunto il nuovo aspetto che viene assunto da PRIMO.ASM.
Figura 2 - PRIMO.ASM (vecchio stile) |
---|
..\bin\tasm /ml /l primo.asm
..\bin\tasm /ml /op /l primo.asm
Figura 3 - PRIMO.LST |
---|
MB_OK OR MB_ICONINFORMATION
6A 40h
68 00000000h
6A 00h
c:\masm32\win32asm
..\bin\link /subsystem:windows /map primo.obj
c:\tasm\win32asm
..\bin\tlink32 /c /Tpe /aa /s /V4.0 primo.obj
c:\borland\bcc55\bin\ilink32 /c /Tpe /aa /s /V4.0 primo.obj
Figura 4 - PRIMO.MAP |
---|
HMODULE GetModuleHandle(LPCTSTR lpModuleName)
strName db 'REGVAL.EXE', 0
call GetModuleHandleA, offset strName
HMODULE TYPEDEF DWORD
call GetModuleHandleA, NULL
int wsprintf(LPTSTR lpOut, LPCTSTR lpFmt, ...);
strBuffer db 40 dup (0)
strFormat db 'EAX = %.8Xh', 0
'EAX = '
call wsprinfA, offset strBuffer, offset strFormat, eax
'EAX = 0F4AB000h', 0
call MessageBoxA, NULL, strBuffer, strTitolo, MB_OK
.call wsprinfA, offset strBuffer, offset strFormat, eax
push eax push offset strFormat push offset strBuffer call wsprintfA add esp, 0Ch |
wsprintfA PROTO C :DWORD, :DWORD :?
wsprintfA PROTO C :DWORD, :DWORD, :VARARG
EXTRN wsprintfA: PROC
strFormat db 'Indirizzo di partenza del modulo REGVAL.EXE = %.8Xh', 10 db 'Contenuto dei registri di segmento:', 10 db 'CS = %.4Xh', 10 db 'DS = %.4Xh', 10 db 'ES = %.4Xh', 10 db 'SS = %.4Xh', 10 db 'FS = %.4Xh', 10 db 'GS = %.4Xh', 10 db 'Contenuto iniziale di ESP = %.8Xh', 0 |
strBuffer db 256 dup (0)
Indirizzo di partenza del modulo REGVAL.EXE = 00400000h Contenuto dei registri di segmento: CS = 0167h DS = 016Fh ES = 016Fh SS = 016Fh FS = 139Fh GS = 0000h Contenuto iniziale di ESP = 0063FE3Ch |
c:\tasm\bin
Figura 5 - PRIMO.MAK |
---|
ASM = ..\bin\tasm32
ASMOPT = /ml /zn /l
..\bin\make /B /fprimo.mak
..\bin\make -B -fprimo.mak
$(ASM) $(ASMOPT) $(NAME).ASM
..\bin\tasm32 /ml /zn /l primo.asm
SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND ...
c:\masm32\win32asm
c:\tasm\win32asm
Figura 6 - PRIMO.C |
---|
// file primo.c #include < windows.h > #pragma argsused int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdParam, int nCmdShow) { MessageBox(NULL, "Il primo programma Assembly per Win32", "Win32 Assembly", MB_OK | MB_ICONINFORMATION); return 0; } |