Hello world/Grafici: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m rimuovo lettera tripla |
m Versioni TASM e Borland Pascal |
||
Riga 390:
=== [[w:Windows API|Windows API]] (in Borland Pascal) ===
<source lang="pascal">
{Compilabile con "BPC -CW HELLO.PAS"; il programma eseguibile è per Windows 16 bit e pesa 2048 byte.}
program Hello;
{$M 8192, 8192}
uses WinTypes, WinProcs;
const
ClassName = 'PASCLASS32';
Message
Paint
Window : HWnd;
WindowClass : TWndClass;
function WndProc(Window: HWnd; Message, WParam: Word; LParam: Longint): Longint; export;
var
DC : HDC;
begin
WndProc := 0;
case Message of
WM_DESTROY:
begin
end;
WM_PAINT:
begin
TextOut(DC, 5, 5, 'hello, world', 12);
EndPaint(Window, Paint);
end;
WndProc := DefWindowProc(Window, Message, WParam, LParam);
begin
WindowClass.style := CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS;
WindowClass.lpfnWndProc := @WndProc;
WindowClass.cbClsExtra := 0;
WindowClass.cbWndExtra := 0;
WindowClass.hInstance := HInstance;
WindowClass.hIcon := LoadIcon(0, IDI_APPLICATION);
WindowClass.hCursor := LoadCursor(0, IDC_ARROW);
WindowClass.hbrBackground := GetStockObject(WHITE_BRUSH);
WindowClass.lpszMenuName := ClassName;
WindowClass.lpszClassName := ClassName;
RegisterClass(WindowClass);
Window := CreateWindowEx(
0, { extra style }
ClassName, { Class name }
'Win32 Pascal Program', { Title string }
WS_OVERLAPPEDWINDOW, { Style }
CW_USEDEFAULT, { x }
CW_USEDEFAULT, { y }
CW_USEDEFAULT, { width }
CW_USEDEFAULT, { height }
0, { parent hwnd }
0, { menu }
HInstance, { HInstance }
nil { lpParam }
);
ShowWindow(Window, SW_SHOWNORMAL);
UpdateWindow(Window);
while GetMessage(Message, 0, 0, 0) do
begin
TranslateMessage(Message);
DispatchMessage(Message);
end;
Halt(Message.WParam);
end.
</source>
=== [[w:Windows API|Windows API]] (in Borland Turbo Assembler) ===
<source lang="asm">
; Modalità MASM-compatibile, compilabile con i comandi
; TASM32 /ml HELLO.ASM
; TLINK32 /Tpe /aa /c /x HELLOM.OBJ, HELLO.EXE, , IMPORT32.LIB, HELLO.DEF
; il file risultante è per Windows 32 bit e pesa 8192 byte.
.386
LOCALS
JUMPS
.MODEL FLAT, STDCALL
INCLUDE WIN32.INC
GetModuleHandle EQU <GetModuleHandleA>
LoadCursor
LoadIcon
TextOut
.DATA
TitleName DB "Win32 Assembly Program", 0
ClassName DB "ASMCLASS32", 0
Hello
HelloLength EQU 12
.DATA?
HInstance
Message
Paint
Window
WindowClass WNDCLASS <?>
.CODE
WndProc PROC USES EBX EDI ESI, @@Window:DWORD, @@Message:DWORD, @@WParam:DWORD, @@LParam:DWORD
CMP @@Message, WM_DESTROY
JE @@Destroy
JE @@Paint
JMP @@DefWndProc
@@Destroy:
PUSH 0
CALL PostQuitMessage
MOV EAX, 0
JMP @@Finish
@@Paint:
PUSH OFFSET Paint
PUSH @@Window
CALL BeginPaint
MOV @@DC, EAX
PUSH HelloLength
PUSH OFFSET Hello
PUSH 5
PUSH 5
PUSH @@DC
CALL TextOut
PUSH OFFSET Paint
PUSH @@Window
CALL EndPaint
MOV EAX, 0
JMP @@Finish
@@DefWndProc:
PUSH @@LParam
PUSH @@WParam
PUSH @@Message
PUSH @@Window
CALL DefWindowProc
JMP @@Finish
@@Finish:
RET
WndProc ENDP
PUBLIC WndProc
Begin:
PUSH 0
CALL GetModuleHandle
MOV
MOV WindowClass.clsStyle, CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
MOV
PUSH IDI_APPLICATION
PUSH 0
CALL LoadIcon
MOV
PUSH
PUSH
CALL LoadCursor
MOV
MOV
MOV WindowClass.clsLpszClassName, OFFSET ClassName
PUSH OFFSET WindowClass
CALL RegisterClass
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH OFFSET
PUSH OFFSET
PUSH
CALL CreateWindowEx
MOV
PUSH
PUSH
CALL ShowWindow
PUSH
CALL UpdateWindow
MessageLoop:
PUSH
PUSH
PUSH
PUSH OFFSET
CALL GetMessage
CMP AX, 0
JE EndLoop
PUSH OFFSET
CALL TranslateMessage
PUSH OFFSET
CALL DispatchMessage
JMP
PUSH
CALL ExitProcess
ENDS
END Begin
</source>
file HELLO.DEF:
<source lang="asm">
NAME
DESCRIPTION 'Assembly Win32 Program'
CODE
DATA
EXETYPE WINDOWS
HEAPSIZE 8192
STACKSIZE 8192
EXPORTS WndProc
</source>
=== [[w:Windows API|Windows API]] (in Borland Turbo Assembler IDEAL mode syntax) ===
<source lang="asm">
IDEAL
COMMENT $
Modalità MASM-compatibile, compilabile con i comandi
TASM32 /ml HELLO.ASM
TLINK32 /Tpe /aa /c /x HELLOM.OBJ, HELLO.EXE, , IMPORT32.LIB, HELLO.DEF
il file risultante è per Windows 32 bit e pesa 8192 byte.
IMPORTANTE: la versione 5.0 del TASM32.EXE produce un errore in fase di compilazione,
è necessaria una versione aggiornata
$
P386
LOCALS
JUMPS
MODEL FLAT, STDCALL
EXTRN BeginPaint:PROC
EXTRN CreateWindowExA:PROC
EXTRN DefWindowProcA:PROC
EXTRN DispatchMessageA:PROC
EXTRN EndPaint:PROC
EXTRN ExitProcess:PROC
EXTRN GetMessageA:PROC
EXTRN GetModuleHandleA:PROC
EXTRN GetStockObject:PROC
EXTRN InvalidateRect:PROC
EXTRN LoadCursorA:PROC
EXTRN LoadIconA:PROC
EXTRN PostQuitMessage:PROC
EXTRN RegisterClassA:PROC
EXTRN ShowWindow:PROC
EXTRN TextOutA:PROC
EXTRN TranslateMessage:PROC
EXTRN UpdateWindow:PROC
CreateWindowEx EQU <CreateWindowExA>
DefWindowProc EQU <DefWindowProcA>
DispatchMessage EQU <DispatchMessageA>
GetMessage EQU <GetMessageA>
GetModuleHandle EQU <GetModuleHandleA>
LoadCursor EQU <LoadCursorA>
LoadIcon EQU <LoadIconA>
RegisterClass EQU <RegisterClassA>
TextOut EQU <TextOutA>
WHITE_BRUSH = 0
CS_VREDRAW = 0001h
CS_HREDRAW = 0002h
CS_GLOBALCLASS = 4000h
CW_USEDEFAULT = 8000h
IDC_ARROW = 32512
IDI_APPLICATION = 32512
SW_SHOWNORMAL = 1
WM_DESTROY = 0002h
WM_PAINT = 000Fh
WS_OVERLAPPED = 000000000h
WS_CAPTION = 000C00000h
WS_SYSMENU = 000080000h
WS_THICKFRAME = 000040000h
WS_MINIMIZEBOX = 000020000h
WS_MAXIMIZEBOX = 000010000h
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_THICKFRAME OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX
STRUC TPoint
x DW ?
y DW ?
ENDS TPoint
STRUC TRect
left DW ?
top DW ?
right DW ?
bottom DW ?
ENDS TRect
STRUC TMsg
hwnd DD ?
message DD ?
wParam DD ?
lParam DD ?
time DD ?
pt TPoint <?>
ENDS TMsg
STRUC TPaintStruct
hdc DD ?
fErase DD ?
rcPaint TRect <?>
fRestore DD ?
fIncUpdate DD ?
rgbReserved DB 16 dup(?)
ENDS TPaintStruct
STRUC TWndClass
style DD ?
lpfnWndProc DD ?
cbClsExtra DD ?
cbWndExtra DD ?
hInstance DD ?
hIcon DD ?
hCursor DD ?
hbrBackground DD ?
lpszMenuName DD ?
lpszClassName DD ?
ENDS TWndClass
DATASEG
TitleName DB "Win32 Assembly Program", 0
ClassName DB "ASMCLASS32", 0
Hello DB "hello, world"
HelloLength EQU 12
UDATASEG
HInstance DD ?
Message TMsg <?>
Paint TPaintStruct <?>
Window DD ?
WindowClass TWndClass <?>
CODESEG
PROC WndProc
ARG @@Window:DWORD, @@Message:DWORD, @@WParam:DWORD, @@LParam:DWORD
USES EBX, EDI, ESI
LOCAL @@DC:DWORD
CMP [@@Message], WM_DESTROY
JE @@Destroy
CMP [@@Message], WM_PAINT
JE @@Paint
JMP @@DefWndProc
@@Destroy:
PUSH 0
CALL PostQuitMessage
MOV EAX, 0
JMP @@Finish
@@Paint:
PUSH OFFSET Paint
PUSH [@@Window]
CALL BeginPaint
MOV [
PUSH
PUSH OFFSET
PUSH
PUSH
PUSH CALL TextOut
PUSH OFFSET
PUSH [
CALL EndPaint
MOV EAX, 0
JMP @@Finish
@@DefWndProc:
PUSH [@@Message]
PUSH [
CALL DefWindowProc
JMP @@Finish
@@Finish:
RET
ENDP WndProc
PUBLIC
Begin:
CALL GetModuleHandle
MOV [WindowClass.style], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
MOV [WindowClass.cbWndExtra], 0
MOV [WindowClass.hInstance], EAX
CALL LoadIcon
MOV [WindowClass.hIcon], EAX
PUSH IDC_ARROW
PUSH 0
CALL LoadCursor
MOV [WindowClass.hCursor], EAX
PUSH WHITE_BRUSH
CALL GetStockObject
MOV [WindowClass.hbrBackground], EAX
MOV [WindowClass.lpszMenuName], OFFSET ClassName
MOV [WindowClass.lpszClassName], OFFSET ClassName
PUSH OFFSET WindowClass
CALL RegisterClass
PUSH 0 ; lpParam
PUSH [HInstance] ; HInstance
PUSH 0 ; menu
PUSH 0 ; parent hwnd
PUSH CW_USEDEFAULT ; height
PUSH CW_USEDEFAULT ; width
PUSH CW_USEDEFAULT ; y
PUSH CW_USEDEFAULT ; x
PUSH WS_OVERLAPPEDWINDOW ; Style
PUSH OFFSET TitleName ; Title string
PUSH OFFSET ClassName ; Class name
PUSH 0 ; extra style
CALL CreateWindowEx
MOV [Window], EAX
PUSH SW_SHOWNORMAL
PUSH [Window]
CALL ShowWindow
PUSH [Window]
CALL UpdateWindow
MessageLoop:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET Message
CALL GetMessage
CMP AX, 0
JE EndLoop
PUSH OFFSET Message
CALL TranslateMessage
PUSH OFFSET Message
CALL DispatchMessage
JMP MessageLoop
EndLoop:
PUSH [Message.wParam]
CALL ExitProcess
ENDS
END Begin
</source>
File HELLO.DEF:
<source lang="asm">
NAME HELLO
DESCRIPTION 'Assembly Win32 Program'
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
EXETYPE WINDOWS
HEAPSIZE 8192
STACKSIZE 8192
EXPORTS WndProc
; fine HELLO.DEF
</source>
=== [[w:Windows API|Windows API]] (in C) ===
|