📄 appentry.asm
字号:
;-----------------------------------------------------------------------------;
; APPENTRY.ASM :Windows Application Startup Routine
;-----------------------------------------------------------------------------;
; From Microsoft Windows Software Developers Kit (c) Microsoft
; Chapter 22: Windows Application Startup
;-----------------------------------------------------------------------------;
;
; To create a Windows application, the WinMain function has to be called
; by some startup code contained in the executable file. This startup code is
; in the APPENTRY.ASM file. Since INVOKE directives depend on the memory model
; in use, APPENTRY.ASM expects MODEL to be set with the memory model of
; the application. APPENTRY.OBJ is then created from APPENTRY.ASM.
;
; for example: ml -c -DMODEL=small appentry.asm
;
; In the link line, APPENTRY.OBJ has to be the first file in the chain,
; because the first 16 bytes of data in the DATA segment are reserved by
; Windows. A run file name has to be specified to the linker, otherwise
; the linker will create an APPENTRY.EXE executable.
;
; for example: link appentry+winapp,winapp.exe,,libw,winapp
;
; For PWB, this amounts to selecting APPENTRY.ASM as the first entry in the
; list (put APPENTRY.ASM at the Top of List)
; Since MODEL is required, an IFNDEF handles the case in which it isn't
; defined, outputting an error and avoiding assembly of the rest.
;
;-----------------------------------------------------------------------------;
IFNDEF MODEL
.ERR <MODEL hasn't been defined>
EXTERNDEF __astart:PROC
ELSE
.model MODEL, pascal ; set model to MODEL, language
; to pascal (as required by Windows)
; MODEL should be defined in ML
; command line
; Numeric Equates
STACKSLOP = 256 ; amount of stack slop space required
maxRsrvPtrs = 5 ; number of Windows reserved pointers
; External/Public definitions
EXTERNDEF rsrvptrs:WORD ; pointers to Windows reserved pointers
PUBLIC __astart ; application startup routine
; Type definitions for functions used.
; Faster and more efficient than including 'windows.inc'
UINT TYPEDEF WORD
HINSTANCE TYPEDEF UINT
HTASK TYPEDEF UINT
LPSTR TYPEDEF FAR PTR BYTE
; Prototypes for functions used
Dos3Call PROTO FAR PASCAL
InitApp PROTO FAR PASCAL, :HTASK
WaitEvent PROTO FAR PASCAL, :HINSTANCE
InitTask PROTO FAR PASCAL
WinMain PROTO NEAR PASCAL, :HINSTANCE, :HINSTANCE, :LPSTR, :UINT
.data
DWORD 0 ; Windows reserved data space.
rsrvptrs WORD maxRsrvPtrs ; 16 bytes at the top of the DATA seg.
WORD maxRsrvPtrs DUP (0) ; Do not alter
hPrev WORD 0 ; space to save WinMain parameters
hInst WORD 0
lpszCmd DWORD 0
cmdShow WORD 0
.code
__astart:
xor bp,bp ; zero bp
push bp
INVOKE InitTask ; Initialize the stack
or ax,ax
jz noinit
add cx,STACKSLOP ; Add in stack slop space.
jc noinit ; If overflow, return error.
mov hPrev,si
mov hInst,di
mov word ptr lpszCmd,bx
mov word ptr lpszCmd+2,es
mov cmdShow,dx
xor ax,ax ; Clear initial event that
INVOKE WaitEvent, ax ; started this task.
INVOKE InitApp, hInst ; Initialize the queue.
or ax,ax
jz noinit
INVOKE WinMain, hInst,hPrev,lpszCmd,cmdShow
ix:
mov ah,4Ch
INVOKE Dos3Call ; Exit with return code from app.
noinit:
mov al,0FFh ; Exit with error code.
jmp short ix
ENDIF ; End of IFNDEF MODEL
end __astart ; start address
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -