我觉得所谓的模块化有两种: "假模块化" 和 "真模块化".

所谓 "假模块化" 就是通过 include 指令把 *.inc 或 *.asm 文件的文本插入到当前位置.
这样最后还是一个大的 asm 文件, 这适合小型的模块化设计.

所谓 "真模块化" 就是一个或几个源文件先通过 lib.exe 编译成 *.lib 文件, 然后通过 includelib 指令引入使用.
这在 RadASM 环境中可通过建立 LIB Project 工程方便做到. 做大工程应该使用这种方式.


假如通过 Win32 App (no res) 模板建立了并实现了这样一个工程(Test33):


; Test33.asm
.386
.model flat, stdcall include windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib .code
;两数求和的函数
sum2 proc v1, v2
  mov eax, v1
  add eax, v2
  ret
sum2 endp
;三数求和的函数
sum3 proc v1, v2, v3
  mov eax, v1
  add eax, v2
  add eax, v3
  ret
sum3 endp
;
main proc
  invoke sum2, ,
  PrintDec eax ;33
  invoke sum3, , ,
  PrintDec eax ;66
  ret
main endp
end main

上面程序的 "假模块化" 的实现:


通过: 工程窗口 -> 右键 -> 新建 -> 源文件, 分别建立 num2.asm 和 num3.asm
现在要把整个程序分散一些分别到: Test33.inc、num2.asm、num3.asm


;Test33.inc
.386
.model flat, stdcall include windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;num2.asm
.code ;这个 .code 可有可无
;两数求和的函数
sum2 proc v1, v2
  mov eax, v1
  add eax, v2
  ret
sum2 endp

;num3.asm
;三数求和的函数
sum3 proc v1, v2, v3
  mov eax, v1
  add eax, v2
  add eax, v3
  ret
sum3 endp

;Test33.asm ;这样主程序的代码就非常简单了

include Test33.Inc

.code
include sum2.asm
include sum3.asm
;
main proc
  invoke sum2, ,
  PrintDec eax ;33
  invoke sum3, , ,
  PrintDec eax ;66
  ret
main endp
end main

上面程序的 "真模块化" 的实现:


准备把 num2 和 num3 两个函数分别作在两个模块里(其实一个模块可以包含很多东西).
文件 -> 新建工程(LIB Project) -> 随意取名为 sum2(准备实现 sum2 函数) -> 然后默认下去, 代码如下:


; sum2.asm
.386
.model flat, stdcall .code
sum2 proc v1, v2
  mov eax, v1
  add eax, v2
  ret
sum2 endp
end ;注意这里只有 end, 模块等待调用, 不能指定入口函数 ;然后执行构建(Alt+Shift+F5), 我们需要的 sum2.lib 已经在刚才建立的工程目录下了
;同样可以建立并得到 sum3.lib

; sum3.asm
.386
.model flat, stdcall .code
sum3 proc v1, v2, v3
  mov eax, v1
  add eax, v2
  add eax, v3
  ret
sum3 endp
end

;调用库测试:
;Test33_2.asm
.386
.model flat, stdcall include windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib ;这里的引入路径可以是全路径, 这里是相对路径
includelib ..\sum2\sum2.lib
includelib ..\sum3\sum3.lib
;子程序声明
sum2 proto :dword, :dword
sum3 proto :dword, :dword, :dword .code
main proc
  invoke sum2, ,
  PrintDec eax ;33
  invoke sum3, , ,
  PrintDec eax ;66
  ret
main endp
end main

;假如把
sum2 proto :dword, :dword
sum3 proto :dword, :dword, :dword
;分别写在 sum2.inc 和 sum3.inc, 程序可改为:

; Test33_3.asm
.386
.model flat, stdcall include windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib include ..\sum2\sum2.Inc
include ..\sum3\sum3.Inc includelib ..\sum2\sum2.lib
includelib ..\sum3\sum3.lib .code
main proc
  invoke sum2, ,
  PrintDec eax ;33
  invoke sum3, , ,
  PrintDec eax ;66
  ret
main endp
end main ;其实把子程序的声明直接写在实现它的 asm 文件里也行, 但那样层次不分明.

学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程的更多相关文章

  1. arm汇编(c内嵌汇编及c和汇编互调)

    C语言编译成汇编: arm-linux-gcc -S test.c -o test.S C语言编译成可执行文件: arm-linux-gcc test.c -o test 多个文件编译链接: arm- ...

  2. GCC嵌入式汇编(内嵌汇编)入门

    GCC嵌入式汇编(内嵌汇编)入门 1. 入门 在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联.当然,gcc都帮我们想好了.下面是是一个简单例子. asm("fsinx %1, ...

  3. win32应用程序和win32控制台应用程序的区别

          win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的.而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序. 后续答案: Win32 Appl ...

  4. Win32控制台程序和Win32应用程序

    刚接触Windows那一套,大多数概念都还没建立起来,整理了一下网上对“Win32控制台程序”的理解,谢谢各位网友了. win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运 ...

  5. Win32 Console Application、Win32 Application、MFC三者之间的联系和区别

    转自:http://blog.csdn.net/c_base_jin/article/details/52304845 在windows编程中,我们或多或少都听说这三个名称,分别是Win32 Cons ...

  6. [VS2010搭建汇编开发环境win32和x64]

    场景: 1. 虽然使用MASM32也可以编译运行汇编程序,但是既然装了VS2010,它也能支持编译运行汇编吧.不然微软的开发人员难道还不用vs写汇编程序了? http://www.masm32.com ...

  7. 16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

    ;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.as ...

  8. neon汇编,C嵌入汇编

    1. Neon-intrics.pdf中的 void vst2q_u16(__transfersize(16) uint16_t * ptr, uint16x8x2_t val);// VST2.16 ...

  9. ADS ARM 汇编和GNU ARM汇编

    Linux/Unix内核源代码用的编译器是GCC,而GCC采用的是AT&T的汇编格式,这与ADS下使用的汇编格式是不同的. 两种汇编格式的部分对比如下: GNU ARM汇编 ADS ARM汇编 ...

随机推荐

  1. BZOJ.4832.[Lydsy1704月赛]抵制克苏恩(期望DP)

    题目链接 \(f[s][i][j][k]\)表示还剩\(s\)次攻击,分别有\(i,j,k\)个血量为\(1,2,3\)的奴隶主时,期望受到伤害. 因为期望是倒推,所以这么表示从后往前求,注意\(a, ...

  2. 20172308《Java软件结构与数据结构》第一周学习总结

    教材学习内容总结 第 1 章 概述 软件质量的特征:正确性.可靠性.健壮性.可用性.可维护性.可重用性(别人写的组件自己可以拿过来用).可移植性.运行效率 数据结构:计算机存储.组织数据的方式 程序 ...

  3. Markdown基础用法

    1. 标题 文字前加#,共6级标题,# 一级标题,## 二级标题,...,###### 六级标题 2. 列表 文字前加-或* 即可变无序列表,文字前加 数字. 即可变有序列表 3. 引用 在引用文本前 ...

  4. [原创]浅谈H5页面性能优化方法

    [原创]浅谈H5页面性能优化方法 前阶段公司H5页面性能测试,其中测试时也发现了一些性能瓶颈问题,接下来我们在来谈谈H5页面性能优化,仅仅是一些常用H5页面性能优化措施,其实和Web页面性能优化思路大 ...

  5. javaDoc 注释规范

    Javadoc虽然是Sun公司为Java文档自动生成设计的,可以从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档.但是Javadoc的注释也符合C的注释格式,而且doxyen ...

  6. delphi Image处理

    procedure ImageDrawText(ATextEdo: IGGCCADTextEDO); var oImageBitmap: TBitmap; x1,x2,y1,y2: double; b ...

  7. [Winform]Media Player播放控制面板控制,单击事件截获

    摘要 在项目中有这样的一个需求,需要在一台宣传机器上循环播放一段视频,并在体验的用户单击鼠标左键的时候推出全屏,可以让用户体验电脑的其它功能. 解决方案 考虑到都是windows系统的,所以采用了wi ...

  8. delphi udp文件传输

    客户端: unit UnitClient; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...

  9. Android上的单元测试

    Android上的单元测试 http://www.sina.com.cn  2009年12月04日 16:07  IT168.com [IT168 技术文档]任何程序的开发都离不开单元测试来保证其健壮 ...

  10. IIS回收后首次访问慢问题

    禁用时间间隔回收 设置为0 然后设置指定时间回收 0:00:00 然后设置脚本 @echo off @echo 正在关掉所有的IE进程(需要设置默认浏览器是IE) taskkill /im iexpl ...