学 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的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 0428作业-函数
  2. php之函数,匿名函数与回调函数
  3. Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数
  4. XP 之后, Delphi 动注册表不方便了...逼出来一个办法:
  5. C++(template模板 && 函数模板)
  6. 读深度学习《深度学习简介》
  7. 【php基础入门】运算符、流程控制语句及单双引号和模块化编程的
  8. Laravel 添加自定义函数
  9. 文件下载函数

随机推荐

  1. 基于数据的访问控制
  2. android通过Location API显示地址信息的
  3. Web API 文档生成工具 apidoc
  4. 你应该要理解的java并发关键字volatile详
  5. 状态机在移动端项目中的使用
  6. 「一周答疑」2018年的第12周
  7. 良好的 API 设计指南
  8. 【文末福利】Java面试通关要点(一)基础篇
  9. 文件权限管理剖析
  10. 报表导出