学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程
16lz
2021-04-30
学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程
我觉得所谓的模块化有两种: "假模块化" 和 "真模块化".
所谓 "假模块化" 就是通过 include 指令把 *.inc 或 *.asm 文件的文本插入到当前位置.
这样最后还是一个大的 asm 文件, 这适合小型的模块化设计.
所谓 "真模块化" 就是一个或几个源文件先通过 lib.exe 编译成 *.lib 文件, 然后通过 includelib 指令引入使用.
这在 RadASM 环境中可通过建立 LIB Project 工程方便做到. 做大工程应该使用这种方式.
假如通过 Win32 App (no res) 模板建立了并实现了这样一个工程(Test33):
; Test33.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.code;两数求和的函数sum2 proc v1, v2 mov eax, v1 add eax, v2 retsum2 endp;三数求和的函数sum3 proc v1, v2, v3 mov eax, v1 add eax, v2 add eax, v3 retsum3 endp;main proc invoke sum2, 11, 22 PrintDec eax ;33 invoke sum3, 11, 22, 33 PrintDec eax ;66 retmain endpend main
上面程序的 "假模块化" 的实现:
通过: 工程窗口 -> 右键 -> 新建 -> 源文件, 分别建立 num2.asm 和 num3.asm
现在要把整个程序分散一些分别到: Test33.inc、num2.asm、num3.asm
;Test33.inc.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib;num2.asm.code ;这个 .code 可有可无;两数求和的函数sum2 proc v1, v2 mov eax, v1 add eax, v2 retsum2 endp;num3.asm;三数求和的函数sum3 proc v1, v2, v3 mov eax, v1 add eax, v2 add eax, v3 retsum3 endp;Test33.asm ;这样主程序的代码就非常简单了include Test33.Inc.codeinclude sum2.asminclude sum3.asm;main proc invoke sum2, 11, 22 PrintDec eax ;33 invoke sum3, 11, 22, 33 PrintDec eax ;66 retmain endpend main
上面程序的 "真模块化" 的实现:
准备把 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 文件里也行, 但那样层次不分明.
posted on 2010-04-29 14:01 万一 阅读(2309) 评论(0) 编辑 收藏©著作权归作者所有:来自51CTO博客作者JLee79的原创作品,如需转载,请注明出处,否则将追究法律责任
更多相关文章
- 0428作业-函数
- php之函数,匿名函数与回调函数
- Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数
- XP 之后, Delphi 动注册表不方便了...逼出来一个办法:
- C++(template模板 && 函数模板)
- 读深度学习《深度学习简介》
- 【php基础入门】运算符、流程控制语句及单双引号和模块化编程的
- Laravel 添加自定义函数
- 文件下载函数