|
发表于 2012-6-10 21:53:24
|
显示全部楼层
汗一个,在这里居然看到这个了,实在抱歉,这个发的有点早,在后期的使用中发现偶尔会出现问题,保留的栈空间不够,在调用某些特殊API时会导致覆盖,发个新的:- ;------------------------------------------------
- ; 一个x64 invoke Macro
- invoke macro _Proc,args:VARARG
- local count
- LOCAL stack
- LOCAL rspL
-
- rspL = 0
- % for i,<args>
- rspL = rspL + 20h
- endm
- if rspL EQ 0
- rspL = 20h
- sub rsp,rspL
- elseif rspL GE 5
- sub rsp,rspL
- endif
-
- count = 0
- stack = 0
- % for i,<args>
- count = count + 1
- if count EQ 1
- mov rcx,i
- elseif count EQ 2
- mov rdx,i
- elseif count EQ 3
- mov r8,i
- elseif count EQ 4
- mov r9,i
- elseif count GE 5
- mov rax,i
- mov QWORD ptr [rsp+stack],rax
- endif
- stack = stack + 8
- endm
- call _Proc
- add rsp,rspL
- endm
复制代码 另外,回楼上几位的,这是标准的MASM,那些个IF什么的只是伪指令而已~ 只是因为64位汇编器不支持invoke,才写了这个方便一些。以后出了官方版本的invoke时,只需要把程序中上面这个宏直接删除,其它哪里都不用动,就可以直接用官方的。 |
|