太晚了,注释我明天一定补上,大家有什么好建议尽可能留言,ASM不死!!!
文件oop.inc
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++define class symbol first++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
;==============================a class here will be defined==============================;
; class jeffclass
; localvar1 dd ?
; localvar2 dd ?
; ......
; METHOD function1,param1,param2,parm3...paramn
; METHOD function2,param1,param2...paramk
; ......
; jeffclass endc
class TEXTEQU <CLASS>
endc TEXTEQU <ENDC>
method TEXTEQU <METHOD>
member TEXTEQU <MEMBER>
override TEXTEQU <OVERRIDE>
new TEXTEQU <NEW>
getclass TEXTEQU <GETCLASS>
releaseclass TEXTEQU <RELEASECLASS>
virtual TEXTEQU <VIRTUAL>
exert TEXTEQU <EXERT>
getaddr TEXTEQU <GETADDR>
ENDC TEXTEQU <ENDS>
MEMBER TEXTEQU <DD>;usage member1 MEMBER 0
CLASS MACRO _name:REQ,_parent
_proto CATSTR <_name>,< STRUCT>
_proto
ENDM
METHOD MACRO function:REQ,params:VARARG
local funcPtr,func,def,_params,COUNT
_params TEXTEQU <>
COUNT=0
FOR __params,<params>
_params CATSTR _params,<__params>,<:dword,>
COUNT=COUNT+@SizeStr(__params)+7
ENDM
COUNT=COUNT-1
IFNB _params
_params SUBSTR _params,1,COUNT
ENDIF
func CATSTR <function>,<_proto typedef proto >,<_params>
func
funcPtr CATSTR <function>,<_ptr>,< typedef ptr >,<function>,<_proto>
funcPtr
def CATSTR <function>,< function>,<_ptr>,< ?>
def
ENDM
;================================GETADDR GET A ADDRESS FROM THE CLASS=============================================;
GETADDR MACRO MEMBER:REQ
LOCAL CONTENT
CONTENT CATSTR <[EBX].>,<MEMBER>
LEA EDI,CONTENT
ENDM
;================================OVERRIDE ASSUMES THAT EBX HAS THE CLASS'S POINTER================================;
OVERRIDE MACRO methodName:REQ,lpFunc:REQ
local vFunc
vFunc CATSTR <methodName>
mov [EBX].vFunc,lpFunc
ENDM
VIRTUAL MACRO funcName:REQ
funcName dd ?
ENDM
;================================EXERT DO VIRTAL FUNCTION CALLING================================;
REVERSE MACRO params:VARARG
local vargs,COUNT
vargs TEXTEQU <>
COUNT=0
;do reverse
FOR var,<params>
vargs CATSTR <var>,<,>,vargs
ENDM
IFNB vargs
vargs SUBSTR vargs,1,@SizeStr(%vargs)-1
ENDIF
EXITM vargs
ENDM
EXERT MACRO funcName:REQ,params:VARARG
local vargs
vargs TEXTEQU REVERSE(params)
% FOR vvar,<vargs>
push vvar
ENDM
call [ebx].funcName
ENDM
;================================GETCLASS ASSUMES THAT EBX RETUERNS================================;
GETCLASS MACRO className:REQ
assume EBX:PTR className
ENDM
RELEASECLASS MACRO
assume EBX:nothing
ENDM
;================================NEW MACRO RETURN NEW CLASS IN EAX================================;
NEW MACRO className:REQ,initParams:VARARG
local COUNT,params,callInit,initFunc
invoke GetProcessHeap
invoke HeapAlloc,eax,HEAP_ZERO_MEMORY,sizeof className
COUNT=0
params TEXTEQU <>
FOR _params,<initParams>
params CATSTR params,<_params>,<,>
COUNT=COUNT+@SizeStr(_params)+1
ENDM
COUNT=COUNT-1
IFNB params
params SUBSTR params,1,COUNT
ENDIF
mov ebx,eax
initFunc CATSTR <className>,<_init>
mov dword ptr[eax],initFunc
assume eax:ptr className
callInit CATSTR <invoke >,<[eax].>,<className>,<_init>,<,>,<params>
callInit
ENDM
DEL MACRO className:REQ,lpClass:REQ,releaseParams:VARARG
local destructor,COUNT,params
params TEXTEQU <>
COUNT=0
destructor CATSTR <className>,<_release>
invoke GetProcessHeap
invoke HeapFree,eax,0,lpClass
FOR _params,<releaseParams>
params CATSTR params,<_params>,<,>
COUNT=COUNT+@SizeStr(_params)+1
ENDM
COUNT=COUNT-1
IFNB params
params SUBSTR params,1,COUNT
ENDIF
% echo params
IFNB params
invoke destructor,params
ELSE
invoke destructor
ENDIF
ENDM
INHERIT MACRO PARENT
local _parent
_parent db sizeof(PARENT)-4 DUP (0)
ENDM
;==============================STRING MACRO ASSUME THAT ESI RETURNS A STRING
STRINGA MACRO @STRING:REQ
LOCAL TEMP,_NEXTPOS,NEXTPOS,_STRING
_NEXTPOS CATSTR <N>,<TEMP>
_STRING CATSTR <S>,<TEMP>
NEXTPOS CATSTR _NEXTPOS,<:>
JMP _NEXTPOS
_STRING DB @STRING,0
NEXTPOS
_STRING CATSTR <OFFSET>,< >,_STRING
EXITM _STRING
ENDM