学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程
我觉得所谓的模块化有两种: "假模块化" 和 "真模块化".
所谓 "假模块化" 就是通过 include 指令把 *.inc 或 *.asm 文件的文本插入到当前位置.
这样最后还是一个大的 asm 文件, 这适合小型的模块化设计.
所谓 "真模块化" 就是一个或几个源文件先通过 lib.exe 编译成 *.lib 文件, 然后通过 includelib 指令引入使用.
这在 RadASM 环境中可通过建立 LIB Project 工程方便做到. 做大工程应该使用这种方式.
假如通过 Win32 App (no res) 模板建立了并实现了这样一个工程(Test33):
通过: 工程窗口 -> 右键 -> 新建 -> 源文件, 分别建立 num2.asm 和 num3.asm
现在要把整个程序分散一些分别到: Test33.inc、num2.asm、num3.asm准备把 num2 和 num3 两个函数分别作在两个模块里(其实一个模块可以包含很多东西).
文件 -> 新建工程(LIB Project) -> 随意取名为 sum2(准备实现 sum2 函数) -> 然后默认下去, 代码如下:; sum2.asm.386.model flat, stdcall.codesum2 proc v1, v2? mov eax, v1? add eax, v2? retsum2 endpend ;注意这里只有 end, 模块等待调用, 不能指定入口函数;然后执行构建(Alt+Shift+F5), 我们需要的 sum2.lib 已经在刚才建立的工程目录下了;同样可以建立并得到 sum3.lib; sum3.asm.386.model flat, stdcall.codesum3 proc v1, v2, v3? mov eax, v1? add eax, v2? add eax, v3? retsum3 endpend;调用库测试:;Test33_2.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib;这里的引入路径可以是全路径, 这里是相对路径includelib ..\sum2\sum2.libincludelib ..\sum3\sum3.lib;子程序声明sum2 proto :dword, :dwordsum3 proto :dword, :dword, :dword.codemain proc? invoke sum2, 11, 22? PrintDec eax ;33? invoke sum3, 11, 22, 33? PrintDec eax ;66? retmain endpend main;假如把sum2 proto :dword, :dwordsum3 proto :dword, :dword, :dword;分别写在 sum2.inc 和 sum3.inc, 程序可改为:; Test33_3.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.libinclude ..\sum2\sum2.Incinclude ..\sum3\sum3.Incincludelib ..\sum2\sum2.libincludelib ..\sum3\sum3.lib.codemain proc? invoke sum2, 11, 22? PrintDec eax ;33? invoke sum3, 11, 22, 33? PrintDec eax ;66? retmain endpend main;其实把子程序的声明直接写在实现它的 asm 文件里也行, 但那样层次不分明.