- 注册时间
- 2010-10-22
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 2292
- 在线时间
- 小时
|
发表于 2011-4-27 15:12:11
|
显示全部楼层
JWasm的16/32/64是集成的,考虑到MS 的ml.exe 和ml64.exe 仍然可统一win32/win64编程.
调用规则上,win32多样,而win64只有fastcall (JWasm也如此)。所以为了调用的外观上一致,写了一个调用宏_invoke ,解决了这个问题。在编译和链接的时候,它们各自调用自己的include 和lib文件,源代码是共用的,干净凝练。
相关说明在代码中。
src.rar
(3.27 KB, 下载次数: 1)
- ;---------------------------------------------------------------
- ;---------------------------------------------------------------
- ;--- Win32/Win64 simple GUI application. By G-Spider 2011
- ;--- Note: requires ml.exe \ml64.exe ,link.exe
- ;---------------------------------------------------------------
- ;--- X86
- ;--- ml /c /coff file.ASM
- ;--- link /out:win32.exe /subsystem:windows /entry:main file.obj
- ;---------------------------------------------------------------
- ;--- X64
- ;--- ml64 /c /Zp8 /D _WIN64=1 file.ASM
- ;--- link /out:win64.exe /subsystem:windows /entry:main file.obj
- ;---------------------------------------------------------------
- ;---------------------------------------------------------------
- ;说明:ml.exe 和ml64.exe中有个命令选项:
- ;/D sysmbol=value 定义给定名字的文本宏。
- ;所以可以通过这个命令来自动选择源代码中的x86或x64部分.
- ;在x86中,默认不用设置/D sysmbol=value或设置/D _WIN64=0
- ;若选择ml64.exe编译,可以加上/D _WIN64=1即可
- ;/Zp[n] 对结构指定的字节边界对齐
- ;---------------------------------------------------------------
-
- ifndef _WIN64
- _WIN64 equ <0>
- endif
-
-
- if _WIN64 eq 0 ;no -_WIN64 switch?
- .386
- .model flat, stdcall
- rax equ <eax>
- rbx equ <ebx>
- rcx equ <ecx>
- rdx equ <edx>
- rsp equ <esp>
- rbp equ <ebp>
- rsi equ <esi>
- rdi equ <edi>
- ;//如果x64的inc文件也合法的话,可以通用include ,只是路径不一样
- ;//一个是masm32\include 一个是masm64\include
- include user32.inc
- include kernel32.inc
-
- else ;_WIN64不为0 开启64位
- ;//X64的inc文件可以写成如下形式
- ;//用晓风残月的生成def/inc64工具即可
- extrn wsprintfA : proc
- extrn MessageBoxA : proc
- extrn ExitProcess : proc
- ;//
- endif
-
- option casemap:none
-
- includelib kernel32.lib
- includelib user32.lib
- ;================================================
- ;以下为通用调用宏
- ;================================================
- ;------------------------------------------------
- ; 参数翻转
- ;------------------------------------------------
- reverseArgs macro arglist:VARARG
- local txt,count
-
- txt TEXTEQU <>
- count = 0
- for i, <arglist>
- count=count+1
- txt TEXTEQU @CatStr(i, <,> , <%txt> )
- endm
- if count GT 0
- txt SUBSTR txt,1,@SizeStr(%txt)-1
- endif
- exitm txt
- endm
-
- ;------------------------------------------------
- ; 一个x86\x64 invoke Macro
- ;------------------------------------------------
- _invoke macro _Proc,args:VARARG
- local count
- local stack
- local rspL
-
- count= 0
- if _WIN64 NE 0 ;//不等于0时,选择X64,fastcall
- rspL = 20h
- % for i,<args>
- count=count+1
- if count GT 4
- rspL= rspL + 8h
- endif
- endm
- count=rspL/16
- count=count*16
- if rspL EQ count
- rspL=rspL+8
- endif
-
- sub rsp,rspL
-
- 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
- else
- % for i,< reverseArgs( args ) >
- count = count + 1
- push i
- endm
- call [_Proc]
- endif
-
- endm
- ;================================================
- ;以上为通用调用宏
- ;================================================
-
- .data
- imsg byte 'this invoke feels like 32bit',0
- szFmt1 byte '%d',0
- szFmt2 byte '%d %d',0
- szFmt3 byte '%d %d %d',0
- szFmt4 byte '%d %d %d %d ',0
- .data?
- Buffer dword 8 dup(?)
-
- .code
- main proc
- ;========================
- _invoke wsprintfA,offset Buffer,offset szFmt1,10h
- _invoke wsprintfA,offset Buffer,offset szFmt2,10h,16h
- _invoke wsprintfA,offset Buffer,offset szFmt3,10h,16h,17h
- _invoke wsprintfA,offset Buffer,offset szFmt4,10h,16h,17h,18h
-
- ;========================
- _invoke MessageBoxA,0,offset imsg,offset Buffer,0
- _invoke ExitProcess,0
-
- main endp
- end
复制代码 |
|