读书人

学 Win32 汇编[33] - 研讨 Win32 汇编

发布时间: 2012-09-22 21:54:54 作者: rapoo

学 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 文件里也行, 但那样层次不分明.

读书人网 >编程

热点推荐