Hello world/Grafici: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Fale (discussione | contributi)
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;
program Hello;
uses WinTypes, WinProcs;
{$M 8192, 8192}
const
uses WinTypes, WinProcs;
szClassName = 'PASCLASS32';
const
function WndProc(Window: HWnd; Message, WParam: Word;
ClassName = 'PASCLASS32';
LParam: Longint): Longint; export;
var
Message LPPaint : TPaintStructTMsg;
Paint TheDC : HDCTPaintStruct;
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
WndProc := PostQuitMessage(0);
case Message ofExit;
wm_Destroy:
begin
PostQuitMessage(0);
Exit;
end;
wm_Paint:
begin
TheDC := BeginPaint(Window, LPPaint);
TextOut(TheDC, 5, 5, 'hello, world', 12);
end;
end;
WndProc := DefWindowProc(Window, Message, WParam, LParam);
end;
WM_PAINT:
procedure WinMain;
var
Window: HWnd;
Message: TMsg;
const
WindowClass: TWndClass = (
style: 0;
lpfnWndProc: @WndProc;
cbClsExtra: 0;
cbWndExtra: 0;
hInstance: 0;
hIcon: 0;
hCursor: 0;
hbrBackground: 0;
lpszMenuName: szClassName;
lpszClassName: szClassName);
begin
if HPrevInstDC := 0BeginPaint(Window, thenPaint);
TextOut(DC, 5, 5, 'hello, world', 12);
begin
EndPaint(Window, Paint);
WindowClass.hInstance := HInstance;
WindowClass.hIcon := LoadIcon(0, idi_Application);
WindowClass.hCursor := LoadCursor(0, idc_Arrow);
WindowClass.hbrBackground := GetStockObject(white_Brush);
if not RegisterClass(WindowClass) then
Halt(255);
end;
Window := CreateWindow(
szClassName,
'Win32 Pascal Program',
ws_OverlappedWindow,
cw_UseDefault,
cw_UseDefault,
cw_UseDefault,
cw_UseDefault,
0,
0,
HInstance,
nil);
ShowWindow(Window, CmdShow);
UpdateWindow(Window);
while GetMessage(Message, 0, 0, 0) do
begin
TranslateMessage(Message);
DispatchMessage(Message);
end;
Halt(Message.wParam);
end;
beginend;
WndProc := DefWindowProc(Window, Message, WParam, LParam);
WinMain;
end.;
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">
.386
; Modalità MASM-compatibile, compilabile con i comandi
LOCALS
; TASM32 /ml HELLO.ASM
JUMPS
; TLINK32 /Tpe /aa /c /x HELLOM.OBJ, HELLO.EXE, , IMPORT32.LIB, HELLO.DEF
.model FLAT, STDCALL
; il file risultante è per Windows 32 bit e pesa 8192 byte.
INCLUDE WIN32.INC
.386
L EQU <LARGE>
LOCALS
EXTRN BeginPaint:PROC
JUMPS
EXTRN CreateWindowExA:PROC
.MODEL FLAT, STDCALL
EXTRN DefWindowProcA:PROC
INCLUDE WIN32.INC
EXTRN DispatchMessageA:PROC
EXTRN EndPaintBeginPaint:PROC
EXTRN ExitProcessCreateWindowExA:PROC
EXTRN FindWindowADefWindowProcA:PROC
EXTRN GetMessageADispatchMessageA:PROC
EXTRN GetModuleHandleAEndPaint:PROC
EXTRN GetStockObjectExitProcess:PROC
EXTRN InvalidateRectGetMessageA:PROC
EXTRN LoadCursorAGetModuleHandleA:PROC
EXTRN LoadIconAGetStockObject:PROC
EXTRN MessageBeepInvalidateRect:PROC
EXTRN MessageBoxALoadCursorA:PROC
EXTRN PostQuitMessageLoadIconA:PROC
EXTRN RegisterClassAPostQuitMessage:PROC
EXTRN ShowWindowRegisterClassA:PROC
EXTRN SetWindowPosShowWindow:PROC
EXTRN TextOutA:PROC
EXTRN TranslateMessage:PROC
EXTRN UpdateWindow:PROC
CreateWindowEx EQU <CreateWindowExA>
DefWindowProc EQU <DefWindowProcA>
DispatchMessage EQU <DispatchMessageA>
FindWindowGetMessage EQU <FindWindowAGetMessageA>
GetModuleHandle EQU <GetModuleHandleA>
GetMessage EQU <GetMessageA>
LoadCursor GetModuleHandle EQU <GetModuleHandleALoadCursorA>
LoadIcon LoadCursor EQU <LoadCursorALoadIconA>
LoadIcon RegisterClass EQU <LoadIconARegisterClassA>
TextOut MessageBox EQU <MessageBoxATextOutA>
.DATA
RegisterClass EQU <RegisterClassA>
TitleName DB "Win32 Assembly Program", 0
TextOut EQU <TextOutA>
ClassName DB "ASMCLASS32", 0
.data
Hello NewHWND DB "hello, DD 0world"
HelloLength EQU 12
lpPaint PAINTSTRUCT <?>
.DATA?
Msg MSGSTRUCT <?>
HInstance wc DD WNDCLASS <?>
Message hInst MSGSTRUCT DD 0<?>
Paint szTitleName DB "Win32 AssemblyPAINTSTRUCT Program"<?>
Window Zero DD DB 0?
WindowClass WNDCLASS <?>
szAlternate DB "(Secondary)", 0
.CODE
szClassName DB "ASMCLASS32", 0
WndProc PROC USES EBX EDI ESI, @@Window:DWORD, @@Message:DWORD, @@WParam:DWORD, @@LParam:DWORD
szHello DB "hello, world", 0
HelloLength LOCAL EQU ($ - OFFSET szHello) - 1@@DC:DWORD
CMP @@Message, WM_DESTROY
.code
JE @@Destroy
Begin:
PUSHCMP L 0@@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 @@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 [hInst]HInstance, EAX
MOV WindowClass.clsStyle, CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
PUSH L 0
PUSHMOV WindowClass.clsLpfnWndProc, OFFSET szClassNameWndProc
CALLMOV FindWindow WindowClass.clsCbClsExtra, 0
ORMOV EAXWindowClass.clsCbWndExtra, EAX0
JZMOV EAX, RegClassHInstance
MOV [Zero]WindowClass.clsHInstance, ' 'EAX
PUSH IDI_APPLICATION
RegClass:
PUSH 0
MOV [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
MOV [wc.clsLpfnWndProc], OFFSET WndProc
MOV [wc.clsCbClsExtra], 0
MOV [wc.clsCbWndExtra], 0
MOV EAX, [hInst]
MOV [wc.clsHInstance], EAX
PUSH L IDI_APPLICATION
PUSH L 0
CALL LoadIcon
MOV [wcWindowClass.clsHIcon], EAX
PUSH L IDC_ARROW
PUSH L 0
CALL LoadCursor
MOV [wcWindowClass.clsHCursor], EAX
MOVPUSH [wc.clsHbrBackground], COLOR_WINDOW + 1WHITE_BRUSH
MOVCALL DWORD PTR [wc.clsLpszMenuName], 0GetStockObject
MOV DWORD PTR [wcWindowClass.clsLpszClassName]clsHbrBackground, OFFSET szClassNameEAX
PUSHMOV WindowClass.clsLpszMenuName, OFFSET wcClassName
MOV WindowClass.clsLpszClassName, OFFSET ClassName
PUSH OFFSET WindowClass
CALL RegisterClass
PUSH L 0 ; lpParam
PUSH [hInst]HInstance ; hInstance
PUSH L 0 ; menu
PUSH L 0 ; parent hwnd
PUSH L CW_USEDEFAULT ; height
PUSH L CW_USEDEFAULT ; width
PUSH L CW_USEDEFAULT ; y
PUSH L CW_USEDEFAULT ; x
PUSH L WS_OVERLAPPEDWINDOW ; Style
PUSH OFFSET szTitleNameTitleName ; Title string
PUSH OFFSET szClassNameClassName ; Class name
PUSH L 0 ; extra style
CALL CreateWindowEx
MOV [NewHWND]Window, EAX
PUSH L SW_SHOWNORMAL
PUSH [NewHWND]Window
CALL ShowWindow
PUSH [NewHWND]Window
CALL UpdateWindow
MessageLoop:
MsgLoop:
PUSH L 0
PUSH L 0
PUSH L 0
PUSH OFFSET MsgMessage
CALL GetMessage
CMP AX, 0
JE EndLoop
PUSH OFFSET MsgMessage
CALL TranslateMessage
PUSH OFFSET MsgMessage
CALL DispatchMessage
JMP MsgLoopMessageLoop
EndLoop:
PUSH [MsgMessage.msWPARAM]
CALL ExitProcess
ENDS
WndProc PROC USES EBX EDI ESI, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
END Begin
LOCAL TheDC:DWORD
</source>
CMP [wmsg], WM_DESTROY
file HELLO.DEF:
JE wmDestroy
<source lang="asm">
CMP [wmsg], WM_RBUTTONDOWN
NAME JE wmRButtonDownHELLO
DESCRIPTION 'Assembly Win32 Program'
CMP [wmsg], WM_SIZE
CODE JE PRELOAD MOVEABLE wmSizeDISCARDABLE
DATA CMP PRELOAD MOVEABLE [wmsg], WM_CREATEMULTIPLE
EXETYPE WINDOWS
JE wmCreate
HEAPSIZE 8192
CMP [wmsg], WM_LBUTTONDOWN
STACKSIZE 8192
JE wmLButtonDown
EXPORTS WndProc
CMP [wmsg], WM_PAINT
</source>
JE wmPaint
 
CMP [wmsg], WM_GETMINMAXINFO
=== [[w:Windows API|Windows API]] (in Borland Turbo Assembler IDEAL mode syntax) ===
JE wmGetMinMaxInfo
<source lang="asm">
JMP DefWndProc
IDEAL
wmPaint:
COMMENT $
PUSH OFFSET lpPaint
Modalità MASM-compatibile, compilabile con i comandi
PUSH [hwnd]
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 [TheDC@@DC], EAX
PUSH L HelloLength ; lunghezza stringa
PUSH OFFSET szHelloHello ; stringa
PUSH L 5 ; y
PUSH L 5
PUSH ; x[@@DC]
PUSH [TheDC] ; DC
CALL TextOut
PUSH OFFSET lpPaintPaint
PUSH [hwnd@@Window]
CALL EndPaint
MOV EAX, 0
JMP @@Finish
@@DefWndProc:
wmCreate:
MOVPUSH EAX, 0[@@LParam]
JMPPUSH Finish[@@WParam]
PUSH [@@Message]
DefWndProc:
PUSH [lparam@@Window]
PUSH [wparam]
PUSH [wmsg]
PUSH [hwnd]
CALL DefWindowProc
JMP @@Finish
@@Finish:
wmDestroy:
PUSH L 0
CALL PostQuitMessage
MOV EAX, 0
JMP Finish
wmLButtonDown:
PUSH L 0
PUSH L 0
PUSH [hwnd]
CALL InvalidateRect ; ridisegna finestra
MOV EAX, 0
JMP Finish
wmRButtonDown:
PUSH L 0
CALL MessageBeep
JMP Finish
wmSize:
MOV EAX, 0
JMP Finish
wmGetMinMaxInfo:
MOV EBX, [lparam] ; ptr a minmaxinfo struct
MOV [(MINMAXINFO PTR ebx).mintrackposition_x], 350
MOV [(MINMAXINFO PTR ebx).mintrackposition_y], 60
MOV EAX, 0
JMP Finish
Finish:
RET
ENDP WndProc ENDP
PUBLIC PUBLIC WndProc
Begin:
ENDS
END Begin PUSH 0
CALL GetModuleHandle
; creare questo file HELLO.DEF:
NAME MOV HELLO[HInstance], EAX
MOV [WindowClass.style], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
DESCRIPTION 'Assembly Win32 Program'
CODE MOV PRELOAD[WindowClass.lpfnWndProc], MOVEABLEOFFSET DISCARDABLEWndProc
DATA MOV PRELOAD[WindowClass.cbClsExtra], MOVEABLE MULTIPLE0
MOV [WindowClass.cbWndExtra], 0
EXETYPE WINDOWS
HEAPSIZE MOV 8192 EAX, [HInstance]
MOV [WindowClass.hInstance], EAX
STACKSIZE 8192
EXPORTS PUSH WndProc IDI_APPLICATION
; fine HELLO.DEF PUSH 0
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) ===