macros.asm
来自「工欲善其事」· 汇编 代码 · 共 639 行 · 第 1/2 页
ASM
639 行
invoke InitCommonControls
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
ENDM
ShellAboutBox MACRO handle,IconHandle,quoted_Text_1,quoted_Text_2:VARARG
LOCAL AboutTitle,AboutMsg,buffer
.data
AboutTitle db quoted_Text_1,0
AboutMsg db quoted_Text_2,0
buffer db 128 dup (0)
.code
mov esi, offset AboutTitle
mov edi, offset buffer
mov ecx, lengthof AboutTitle
rep movsb
invoke ShellAbout,handle,ADDR buffer,ADDR AboutMsg,IconHandle
ENDM
; --------------------------------------------------------------
; Specifies processor, memory model & case sensitive option.
; The parameter "Processor" should be in the form ".386" etc..
; EXAMPLE : AppModel .586
; --------------------------------------------------------------
AppModel MACRO Processor
Processor ;; Processor type
.model flat, stdcall ;; 32 bit memory model
option casemap :none ;; case sensitive
ENDM
; --------------------------------------------
; The following two macros must be used as a
; pair and can only be used once in a module.
; Additional code for processing within the
; message loop can be placed between them.
;
; The single parameter passed to both macros
; is the name of the MSG structure and must be
; the same in both macros.
; --------------------------------------------
BeginMessageLoop MACRO mStruct
MessageLoopStart:
invoke GetMessage,ADDR mStruct,NULL,0,0
cmp eax, 0
je MessageLoopExit
ENDM
EndMessageLoop MACRO mStruct
invoke TranslateMessage, ADDR mStruct
invoke DispatchMessage, ADDR mStruct
jmp MessageLoopStart
MessageLoopExit:
ENDM
; --------------------------------------------------------
; MsgBox macro takes 2 parameters, both can be either
; literal text in quotes or addresses of zero terminated
; strings passed with "ADDR szString" where szString is
; a zero terminated string. Note that ADDR is uppercase.
;
; example : MsgBox "Greetings all",ADDR szTitle
; MsgBox ADDR szMessage,"Result"
;
; --------------------------------------------------------
MsgBox MACRO handl, TxtMsg, TxtTitle, styl
LOCAL Msg1
LOCAL Titl
If @InStr(1,<TxtMsg>,<ADDR>) eq 0
If @InStr(1,<TxtTitle>,<ADDR>) eq 0
.data
Msg1 db TxtMsg,0
Titl db TxtTitle,0
.code
invoke MessageBox,handl,ADDR Msg1,ADDR Titl,styl
EXITM
EndIf
EndIf
If @InStr(1,<TxtMsg>,<ADDR>) gt 0
If @InStr(1,<TxtTitle>,<ADDR>) eq 0
.data
Titl db TxtTitle,0
.code
invoke MessageBox,handl,TxtMsg,ADDR Titl,styl
EXITM
EndIf
EndIf
If @InStr(1,<TxtMsg>,<ADDR>) eq 0
If @InStr(1,<TxtTitle>,<ADDR>) gt 0
.data
Msg1 db TxtMsg,0
.code
invoke MessageBox,handl,ADDR Msg1,TxtTitle,styl
EXITM
EndIf
EndIf
If @InStr(1,<TxtMsg>,<ADDR>) gt 0
If @InStr(1,<TxtTitle>,<ADDR>) gt 0
invoke MessageBox,handl,TxtMsg,TxtTitle,styl
EXITM
EndIf
EndIf
ENDM
; -------------------------------------------
; put zero terminated string in .data section
; alternative to the szText MACRO
; -------------------------------------------
dsText MACRO Name, Text:VARARG
.data
Name db Text,0
.code
ENDM
; -------------------------------
; make 2 WORD values into a DWORD
; result in eax
; -------------------------------
MAKEDWORD MACRO LoWord,HiWord
mov ax, HiWord
ror eax, 16
mov ax, LoWord
ENDM
; -----------------------------
; return IMMEDIATE value in eax
; -----------------------------
retval MACRO var
IF var EQ 0
xor eax, eax ;; slightly more efficient for zero
ELSE
mov eax, var ;; place value in eax
ENDIF
ENDM
; ------------------------
; inline memory copy macro
; ------------------------
Mcopy MACRO lpSource,lpDest,len
mov esi, lpSource
mov edi, lpDest
mov ecx, len
rep movsb
ENDM
;; -----------------------------------
;; INPUT red, green & blue BYTE values
;; OUTPUT DWORD COLORREF value in eax
;; -----------------------------------
RGB MACRO red, green, blue
xor eax, eax
mov al, blue ; blue
rol eax, 8
mov al, green ; green
rol eax, 8
mov al, red ; red
ENDM
; ------------------------------------------------
; The following macro were written by Ron Thomas
; ------------------------------------------------
; Retrieves the low word from double word argument
; ------------------------------------------------
LOWORD MACRO bigword
mov eax,bigword
and eax,0FFFFh ;; Set to low word
ENDM
; ----------------------
; fast lodsb replacement
; ----------------------
lob MACRO
mov al, [esi]
inc esi
ENDM
; ----------------------
; fast stosb replacement
; ----------------------
stb MACRO
mov [edi], al
inc edi
ENDM
; -------------------------------
; pascal calling convention macro
; left to right push
; -------------------------------
Pcall MACRO name:REQ,items:VARARG
LOCAL arg
FOR arg,<items>
push arg
ENDM
call name
ENDM
; ------------------------------------------------------------------
; macro for making STDCALL procedure and API calls.
; ------------------------------------------------------------------
Scall MACRO name:REQ,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12, \
p13,p14,p15,p16,p17,p18,p19,p20,p21,p22
;; ---------------------------------------
;; loop through arguments backwards, push
;; NON blank ones and call the function.
;; ---------------------------------------
FOR arg,<p22,p21,p20,p19,p18,p17,p16,p15,p14,p13,\
p12,p11,p10,p9,p8,p7,p6,p5,p4,p3,p2,p1>
IFNB <arg> ;; If not blank
push arg ;; push parameter
ENDIF
ENDM
call name ;; call the procedure
ENDM
; ---------------------------------------------------------------------
;
; The GLOBALS macro is for allocating uninitialised data in the .DATA?
; section. It is designed to take multiple definitions to make
; allocating uninitialised data more intuitive while coding.
;
; EXAMPLE: GLOBALS item1 dd ?,\
; item2 dd ?,\
; item3 dw ?,\
; item4 db 128 dup (?)
;
; ---------------------------------------------------------------------
GLOBALS MACRO var1,var2,var3,var4,var5,var6,var7,var8,var9,var0,
varA,varB,varC,varD,varE,varF,varG,varH,varI,varJ
.data?
var1
var2
var3
var4
var5
var6
var7
var8
var9
var0
varA
varB
varC
varD
varE
varF
varG
varH
varI
varJ
.code
ENDM
; ------------------------------------------------------
; macro for concantenating strings using the szMultiCat
; procedure written by Alexander Yackubtchik.
;
; USAGE strcat buffer,str1,str2,str3 etc ...
;
; buffer must be large enough to contain all of the
; strings to append. Limit is set by maximum line
; length in MASM.
; ------------------------------------------------------
strcat MACRO arguments:VARARG
txt equ <invoke szMultiCat,> ;; lead string
pcount = 0
FOR arg, <arguments>
pcount = pcount + 1 ;; count arguments
ENDM
% pcount = pcount - 1 ;; dec 1 for 1st arg
txt CATSTR txt,%pcount ;; append number to lead string
FOR arg, <arguments>
IF @InStr(1,<arg>,<ADDR>) ne 0
txt CATSTR txt, <,arg>
ELSE
txt CATSTR txt, <,ADDR arg> ;; append 'ADDR' + args
ENDIF
ENDM
txt ;; put result in code
ENDM
; ----------------------------------------------------------
; function position macros that takes a DWORD parameter and
; returns the address of the buffer that holds the result
; ----------------------------------------------------------
str$ MACRO DDvalue
LOCAL rvstring
.data
rvstring db 20 dup (0)
.code
invoke dwtoa,DDvalue,ADDR rvstring
EXITM <ADDR rvstring>
ENDM
hex$ MACRO DDvalue
LOCAL rvstring
.data
rvstring db 12 dup (0)
.code
invoke dw2hex,DDvalue,ADDR rvstring
EXITM <ADDR rvstring>
ENDM
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?