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

所谓 "假模块化" 就是通过 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. 【莫队算法】【权值分块】bzoj3920 Yuuna的礼物

    [算法一] 暴力. 可以通过第0.1号测试点. 预计得分:20分. [算法二] 经典问题:区间众数,数据范围也不是很大,因此我们可以: ①分块,离散化,预处理出: <1>前i块中x出现的次 ...

  2. android的AsyncTask.get()方法会阻塞UI线程

    AsyncTask.get()方法, 是有阻塞UI的能力的.

  3. Gunicorn部署部分的翻译

    部署Gunicorn 文档建议Gunicorn最好是用在代理服务器后面.(等于前面最好加一个反向代理) Nginx Configuration 文档建议用Nginx,当然用其他也可以,但是要确保当你用 ...

  4. Linux学习笔记08—如何关闭防火墙

    Linux系统下面自带了防火墙iptables,iptables可以设置很多安全规则.但是如果配置错误很容易导致各种网络问题,那么如果要关闭禁用防火墙怎么操作呢,咗嚛本经验以centos系统为例演示如 ...

  5. 微信小程序开发需要注意的29个坑

    1.小程序名称可以由中文.数字.英文.长度在3-20个字符之间,一个中文字等于2个字符. 2.小程序名称不得与公众平台已有的订阅号.服务号重复.如提示重名,请更换名称进行设置. 3.小程序名称在帐号信 ...

  6. 基于开源SuperSocket实现客户端和服务端通信项目实战

    一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...

  7. 【Devops】【docker】【CI/CD】1.docker搭建Gitlab环境

    CI/CD[持续化集成/持续化交付] docker搭建Gitlab环境 1.查询并拉取gitlab镜像 docker search gitlab docker pull gitlab/gitlab-c ...

  8. Office Web Apps 错误日志

    前言 最近一直在用Office Web Apps,使用过程会有各种各样的错误,众所周知,sharepoint的错误都在15/Logs下面保存错误日志,那么OWA呢? 经过查找,发现Office Web ...

  9. 超感猎杀/超感八人组第一季至二季/全集Sense8迅雷下载

    本季 Sense8 (2015)看点:<超感八人组>由沃卓斯基姐弟执导的科幻剧集是Netflix继“纸牌屋第二季”后的又一大手笔制作,讲述未来世界不同地区的8个人因同时目睹同一暴力事件.从 ...

  10. bat与jscript开发工具时遇到的一些问题

    之前使得bat调用luac进行编译时,会弹出一个"黑色的界面",闪烁一下,感觉不太好.而脚本vbs或者jscript调用bat是可以利用Run方法,将其第二个参数设置为0便可以隐藏 ...