📄 让你的masm支持__fastcall调用方式.txt
字号:
ELSE
push arg
ENDIF
ELSE
IFIDNI <arg>, <eax> ;;Do not overwrite eax
IF reax
line TEXTEQU %@Line
% ECHO @FileCur(line) : ERROR! EAX register value overwritten by fastcall macro.
.ERR
ELSE
push arg
ENDIF
ELSE
push arg
ENDIF
ENDIF
ENDM
ENDIF
IFNB <p1>
IF @SizeStr(<p1>) GE 6
IFIDNI @SubStr(<p1>, 1, 5), <ADDR >
% lea ecx, @SubStr(<p1>, 6)
recx = -1
ENDIF
ENDIF
IF @SizeStr(<p1>) GE 8
IFIDNI @SubStr(<p1>, 1, 7), <OFFSET >
mov ecx, p1
recx = -1
ENDIF
ENDIF
IF @SizeStr(<p1>) GE 10
IFIDNI @SubStr(<p1>, 1, 9), <LROFFSET >
mov ecx, p1
recx = -1
ENDIF
ENDIF
IF (NOT recx)
IF (OPATTR (p1)) AND 00000100b ;; Is an immediate value
IF (OPATTR (p1)) AND 00000001b
mov ecx, p1
ELSE
IF p1 EQ 0
xor ecx, ecx
ELSEIF p1 EQ 1
xor ecx, ecx
inc ecx
ELSEIF p1 EQ -1
or ecx, -1
ELSE
mov ecx, p1
ENDIF
ENDIF
recx = -1
ELSEIF (OPATTR (p1)) AND 00010000b ;; Is a register value
IFDIFI <p1>, <ecx>
IFIDNI <p1>, <eax>
IF reax
line TEXTEQU %@Line
% ECHO @FileCur(line) : ERROR! EAX register value has changed.
.ERR
ENDIF
ENDIF
mov ecx, p1
recx = -1 ;; no more ecx
ENDIF
ELSE
mov ecx, p1
recx = -1
ENDIF
ENDIF
ENDIF
IFNB <p2>
IF @SizeStr(<p2>) GE 6
IFIDNI @SubStr(<p2>, 1, 5), <ADDR >
% lea edx, @SubStr(<p2>, 6)
redx = -1
ENDIF
ENDIF
IF @SizeStr(<p2>) GE 8
IFIDNI @SubStr(<p2>, 1, 7), <OFFSET >
mov edx, p2
redx = -1
ENDIF
ENDIF
IF @SizeStr(<p2>) GE 10
IFIDNI @SubStr(<p2>, 1, 9), <LROFFSET >
mov edx, p2
redx = -1
ENDIF
ENDIF
IF (NOT redx)
IF (OPATTR (p2)) AND 00010000b ;; Is a register value
IFDIFI <p2>, <edx> ;; do not move edx onto itself
IFIDNI <p2>, <eax>
IF reax
line TEXTEQU %@Line
% ECHO @FileCur(line) : ERROR! EAX register value has changed.
.ERR
ENDIF
ENDIF
IFIDNI <p2>, <ecx>
IF recx ;; if ecx was used report error
line TEXTEQU %@Line
% ECHO @FileCur(line) : ERROR! ECX register value has changed.
.ERR
ENDIF
ENDIF
mov edx, p2
redx = -1
ENDIF
ELSEIF (OPATTR (p2)) AND 00000100b ;; Is an immediate value
IF (OPATTR (p2)) AND 00000001b
mov ecx, p2
ELSE
IF p2 EQ 0
xor edx, edx
ELSEIF p2 EQ 1
xor edx, edx
inc edx
ELSEIF p2 EQ -1
or edx, -1
ELSE
mov edx, p2
ENDIF
ENDIF
redx = -1
ELSE
mov edx, p2
redx = -1
ENDIF
ENDIF
ENDIF
call api
ENDM
ENDIF
;;------------------------------------------------------------------------------------
;;(MF)快速调用宏函数
;;
;;用法 :返回值 = $fastcall(函数名,参数1,参数2...)
;;
;;参数 :同fastcall
;;
;;返回值:该函数的返回值(eax)
;;
;;影响的寄存器:同fastcall
;;
;;------------------------------------------------------------------------------------
IFNDEF $fastcall
$fastcall MACRO api:REQ, p1, p2, px:VARARG
fastcall api, p1, p2, px
EXITM <eax>
ENDM
ENDIF
;;------------------------------------------------------------------------------------
;;(MF)快速调用函数名修饰宏
;;
;;用法 :$FcallFuncNameGen(函数名,参数个数)
;;
;;参数 :函数名,该函数参数个数
;;
;;返回值:函数的修饰名
;;
;;影响的寄存器:无
;;
;;------------------------------------------------------------------------------------
IFNDEF $FcallFuncNameGen
$FcallFuncNameGen MACRO fname:REQ, argsize:REQ
LOCAL num
num TEXTEQU %(&argsize& * 4)
EXITM @CatStr(<@>, <fname>, <@>, %num)
ENDM
ENDIF
;;------------------------------------------------------------------------------------
;;(MF)定义一个快速调用的函数头
;;
;;用法 :[$]BeginfcProc(函数名,参数个数[,距离]) Uses 寄存器列表 除第1,2参数外其他参数
;;
;;参数 :不用多说
;;
;;返回值:无需操心
;;
;;影响的寄存器:无
;;
;;------------------------------------------------------------------------------------
IFNDEF $BeginfcProc
$BeginfcProc MACRO fname:REQ, argsize:REQ, distance
fname TEXTEQU $FcallFuncNameGen(fname, argsize)
IFB <distance>
EXITM <$FcallFuncNameGen(fname, argsize) PROC SYSCALL >
ELSE
EXITM <$FcallFuncNameGen(fname, argsize) PROC &distance& SYSCALL >
ENDIF
ENDM
BeginfcProc TEXTEQU <$BeginfcProc>
ENDIF
;;------------------------------------------------------------------------------------
;;(MF)快速调用的函数结尾, 必须和$BeginfcProc成对使用
;;
;;用法 :$EndfcProc(函数名,参数个数)
;;
;;参数 :不用多讲
;;
;;返回值:无需操心
;;
;;影响的寄存器:无
;;
;;------------------------------------------------------------------------------------
IFNDEF $EndfcProc
$EndfcProc MACRO fname:REQ, argsize:REQ
EXITM <$FcallFuncNameGen(fname, argsize) ENDP>
ENDM
EndfcProc TEXTEQU <$EndfcProc>
ENDIF
;;------------------------------------------------------------------------------------
;;(MA)快速调用函数的专用返回宏
;;
;;
;;用法 :fcret 返回值, 参数个数
;;
;;参数 :同return, 会自动修正清栈参数
;;
;;
;;影响的寄存器:eax(必须)
;;
;;------------------------------------------------------------------------------------
IFNDEF fcret
fcret MACRO retv, argsize:REQ
LOCAL num
IF argsize GT 2
num TEXTEQU %(&argsize& - 2)
ELSE
num TEXTEQU <0>
ENDIF
return retv, num
ENDM
ENDIF
;;------------------------------------------------------------------------------------
;;用于声明一个外部的fastcall函数
;;
;;用法 :$FcProto(函数名,参数个数)
;;
;;参数 :不用多说
;;
;;
;;影响的寄存器:无
;;
;;------------------------------------------------------------------------------------
IFNDEF $FcProto
$FcProto MACRO fname:REQ, argsize:REQ
fname TEXTEQU $FcallFuncNameGen(fname, argsize)
EXITM @CatStr(<EXTERNDEF SYSCALL >, <$FcallFuncNameGen(fname, argsize)>, <:PROC>)
ENDM
FcProto TEXTEQU <$FcProto>
ENDIF
;;End of File
ENDIF ;;FastCall.inc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -