macros.asm
来自「工欲善其事」· 汇编 代码 · 共 639 行 · 第 1/2 页
ASM
639 行
; ###########################################################################
;
; Support macros for MASM32
;
; ###########################################################################
; -----------------------------------------------------
; Macros for declaring named floating point variables
; -----------------------------------------------------
FLOAT4 MACRO name,value
.data
name REAL4 value
.code
ENDM
FLOAT8 MACRO name,value
.data
name REAL8 value
.code
ENDM
FLOAT10 MACRO name,value
.data
name REAL10 value
.code
ENDM
; -----------------------------------------------------
; Macros for directly inserting floating point values
; into floating point instructions and as parameters
; -----------------------------------------------------
FP4 MACRO value
LOCAL vname
.data
vname REAL4 value
.code
EXITM <vname>
ENDM
FP8 MACRO value
LOCAL vname
.data
vname REAL8 value
.code
EXITM <vname>
ENDM
FP10 MACRO value
LOCAL vname
.data
vname REAL10 value
.code
EXITM <vname>
ENDM
; ----------------------------------------------------------
; load a library and get the procedure address in one macro
; return value for the proc address in in EAX
; ----------------------------------------------------------
LoadProcAddress MACRO quoted_text1,quoted_text2
LOCAL library_name
LOCAL proc_name
.data
library_name db quoted_text1,0
proc_name db quoted_text2,0
.code
invoke LoadLibrary,ADDR library_name
invoke GetProcAddress,eax,ADDR proc_name
ENDM
; -------------------------
; initialised GLOBAL value
; -------------------------
GLOBAL MACRO variable:VARARG
.data
variable
.code
ENDM
; --------------------------------
; initialised GLOBAL string value
; --------------------------------
STRING MACRO variable:REQ,args:VARARG
.data
variable db args,0
.code
ENDM
; ---------------------
; literal string MACRO
; ---------------------
literal MACRO quoted_text:VARARG
LOCAL local_text
.data
local_text db quoted_text,0
.code
EXITM <local_text>
ENDM
; --------------------------------
; string address in INVOKE format
; --------------------------------
SADD MACRO quoted_text:VARARG
EXITM <ADDR literal(quoted_text)>
ENDM
; --------------------------------
; string OFFSET for manual coding
; --------------------------------
CTXT MACRO quoted_text:VARARG
EXITM <offset literal(quoted_text)>
ENDM
; -----------------------------------------------------
; string address embedded directly in the code section
; -----------------------------------------------------
CADD MACRO quoted_text
LOCAL vname,lbl
jmp lbl
vname db quoted_text,0
lbl:
EXITM <ADDR vname>
ENDM
; --------------------------------------------------
; Macro for placing an assembler instruction either
; within another or within a procedure call
; --------------------------------------------------
ASM MACRO parameter1,source
LOCAL mnemonic
LOCAL dest
LOCAL poz
% poz INSTR 1,<parameter1>,< > ;; get the space position
mnemonic SUBSTR <parameter1>, 1, poz-1 ;; get the mnemonic
dest SUBSTR <parameter1>, poz+1 ;; get the first argument
mnemonic dest, source
EXITM <dest>
ENDM
; ------------------------------------------------------------
; Macro for nesting function calls in other invoke statements
; ------------------------------------------------------------
FUNC MACRO parameters:VARARG
invoke parameters
EXITM <eax>
ENDM
; --------------------------------------------------
; Two macros for allocating and freeing OLE memory.
; stralloc returns the handle/address of the string
; memory in eax. strfree uses the handle to free
; memory after use.
; NOTE that you must use the following INCLUDE &
; LIB files with these two macros.
;
; include \MASM32\include\oleaut32.inc
; includelib \MASM32\LIB\oleaut32.lib
;
; --------------------------------------------------
stralloc MACRO ln
invoke SysAllocStringByteLen,0,ln
ENDM
strfree MACRO strhandle
invoke SysFreeString,strhandle
ENDM
; ---------------------------------------
; Append literal string to end of buffer
; ---------------------------------------
Append MACRO buffer,text
LOCAL szTxt
.data
szTxt db text,0
.code
invoke szCatStr,ADDR buffer,ADDR szTxt
ENDM
; ---------------------------
; Put ascii zero at 1st byte
; ---------------------------
zero1 MACRO membuf
mov membuf[0], 0
ENDM
; ----------------------------------------------
; This set of macros were written by Greg Falen
; ----------------------------------------------
; Switch/Case emulation
; ----------------------
$casflg equ <>
$casvar equ <>
$casstk equ <>
switch macro _var:req, _reg:=<eax>
mov _reg, _var
$casstk catstr <_reg>, <#>, $casflg, <#>, $casstk
$casvar equ _reg
$casflg equ <0> ;; 0 = emit an .if, 1 an .elseif
endm
case macro _args:vararg ;; like Pascal: case id1. id4 .. id8, lparam, ...
;; does an or (case1 || case2 || case3...)
$cas textequ <>
irp $v, <_args> ;; for each case
t@ instr <$v>, <..> ;; range ?
if t@ ;; yes
$LB substr <$v>, 1, t@-1 ;; lbound = left portion
$LB catstr <(>, $casvar, <!>=>, $LB, <)> ;; ($casvar >= lbound)
$UB substr <$v>, t@+2 ;; ubound = right portion
$UB catstr <(>, $casvar, <!<=>, $UB, <)> ;; ($casvar <= ubound)
$t catstr <(>, $LB, <&&> , $UB,<)> ;; (($casvar >= $lb) && ($casvar <= $ub))
else ;; no, it's a value (var/const)
$t catstr <(>, $casvar, <==>, <$v>, <)> ;; ($casvar == value)
endif
$cas catstr <|| >, $t, $cas ;; or this case w/ others
endm
$cas substr $cas, 3 ;; lose the extra "|| " in front
ifidn $casflg, <0> ;; 0 = 1'st case
% .if $cas ;; emit ".if"
else ;; all others
% .elseif $cas ;; emit ".elseif"
endif
$casflg equ <1> ;; NOT 1'st
endm
default macro _default:vararg
.else
_default
endm
endsw macro _cmd:vararg
ifidn $casstk, <>
.err <Endsw w/o Switch>
else
t@ instr $casstk, <#>
$casvar substr $casstk, 1, t@-1
$casstk substr $casstk, t@+1
t@ instr $casstk, <#>
$casflg substr $casstk, 1, t@-1
ifidn $casstk, <#>
$casstk equ <>
else
$casstk substr $casstk, t@+1
endif
.endif
endif
endm
; ------------------------------------------
; equates for case variation in macro names
; ------------------------------------------
Case equ <case>
CASE equ <case>
Switch equ <switch>
SWITCH equ <switch>
Endsw equ <endsw>
EndSw equ <endsw>
ENDSW equ <endsw>
; -------------------------------------------------------------------
; The following 2 macros are for limiting the size of a window while
; it is being resized. They are to be used in the WM_SIZING message.
; -------------------------------------------------------------------
LimitWindowWidth MACRO wdth
LOCAL label
mov eax, lParam
mov ecx, (RECT PTR [eax]).right
sub ecx, (RECT PTR [eax]).left
cmp ecx, wdth
jg label
.if wParam == WMSZ_RIGHT || wParam == WMSZ_BOTTOMRIGHT || wParam == WMSZ_TOPRIGHT
mov ecx, (RECT PTR [eax]).left
add ecx, wdth
mov (RECT PTR [eax]).right, ecx
.elseif wParam == WMSZ_LEFT || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_TOPLEFT
mov ecx, (RECT PTR [eax]).right
sub ecx, wdth
mov (RECT PTR [eax]).left, ecx
.endif
label:
ENDM
LimitWindowHeight MACRO whgt
LOCAL label
mov eax, lParam
mov ecx, (RECT PTR [eax]).bottom
sub ecx, (RECT PTR [eax]).top
cmp ecx, whgt
jg label
.if wParam == WMSZ_TOP || wParam == WMSZ_TOPLEFT || wParam == WMSZ_TOPRIGHT
mov ecx, (RECT PTR [eax]).bottom
sub ecx, whgt
mov (RECT PTR [eax]).top, ecx
.elseif wParam == WMSZ_BOTTOM || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_BOTTOMRIGHT
mov ecx, (RECT PTR [eax]).top
add ecx, whgt
mov (RECT PTR [eax]).bottom, ecx
.endif
label:
ENDM
; -------------------------
; Application startup code
; -------------------------
AppStart MACRO
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?