学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程
我觉得所谓的模块化有两种: "假模块化" 和 "真模块化".
所谓 "假模块化" 就是通过 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 汇编的模块化编程的更多相关文章
- arm汇编(c内嵌汇编及c和汇编互调)
C语言编译成汇编: arm-linux-gcc -S test.c -o test.S C语言编译成可执行文件: arm-linux-gcc test.c -o test 多个文件编译链接: arm- ...
- GCC嵌入式汇编(内嵌汇编)入门
GCC嵌入式汇编(内嵌汇编)入门 1. 入门 在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联.当然,gcc都帮我们想好了.下面是是一个简单例子. asm("fsinx %1, ...
- win32应用程序和win32控制台应用程序的区别
win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的.而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序. 后续答案: Win32 Appl ...
- Win32控制台程序和Win32应用程序
刚接触Windows那一套,大多数概念都还没建立起来,整理了一下网上对“Win32控制台程序”的理解,谢谢各位网友了. win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运 ...
- Win32 Console Application、Win32 Application、MFC三者之间的联系和区别
转自:http://blog.csdn.net/c_base_jin/article/details/52304845 在windows编程中,我们或多或少都听说这三个名称,分别是Win32 Cons ...
- [VS2010搭建汇编开发环境win32和x64]
场景: 1. 虽然使用MASM32也可以编译运行汇编程序,但是既然装了VS2010,它也能支持编译运行汇编吧.不然微软的开发人员难道还不用vs写汇编程序了? http://www.masm32.com ...
- 16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS
;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.as ...
- neon汇编,C嵌入汇编
1. Neon-intrics.pdf中的 void vst2q_u16(__transfersize(16) uint16_t * ptr, uint16x8x2_t val);// VST2.16 ...
- ADS ARM 汇编和GNU ARM汇编
Linux/Unix内核源代码用的编译器是GCC,而GCC采用的是AT&T的汇编格式,这与ADS下使用的汇编格式是不同的. 两种汇编格式的部分对比如下: GNU ARM汇编 ADS ARM汇编 ...
随机推荐
- Manthan, Codefest 18 (Div 1 + Div 2) (A~E)
目录 Codeforces 1037 A.Packets B.Reach Median C.Equalize D.Valid BFS E.Trips(正难则反) Codeforces 1037 比赛链 ...
- [转]eclipse转idea, 快捷键设置
原文地址: eclipse转idea, 快捷键设置 设置快捷键的途径: 打开idea的配置,找到Keymap,设置为eclipse 另外还要手动设置某些快捷键 上下移动 点击类打开 代码提示 查询 ...
- Stf-windows版本
Stf-windows Stf 原项目地址:https://github.com/openstf/stf . 介绍 用于Web端设备远程管理 系统支持 支持Android版本2.3.3 (SDK10) ...
- SNOI 滚粗记
连睡觉都只能睡一半就吓醒 真的蠢 CE了四道 没有cstring 踏马本机怎么能过??!! 还有几次夏令营什么的 可能水水就结束了 最单纯的拿点优惠的想法也没实现 都说以后会有用的 大概是吧 也大概是 ...
- MySQL 集群
MySQL Galera介绍 主要功能: 同步复制 真正的multi-master,即所有节点可以同时读写数据库 自动的节点成员控制,失效节点自动被清除 新节点加入数据自动复制 真正的并行复制,行级 ...
- BZOJ 3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队 动态规划
3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=34 ...
- USB2.0 速度识别--区分低速-高速-全速
USB2.0是向下兼容USB1.X的,即USB2.0支持高速,全速,低速的USB设备 (HIGH-SPEED,FULL-SPEED,LOW-SPEED),而USB1.X不支持高速设备. 因此如果高速设 ...
- AngularJS路由系列(4)-- UI-Router的$state服务、路由事件、获取路由参数
本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router的$state服务● UI-Router的路由事件● UI-Router获取路由参数 Angular ...
- C# 连接Oracle数据库,免安装oracle客户端
一.方案1 首先下面的内容,有待我的进一步测试和证实.18.12.20 被证实了,还需要安装Oracle客户端,或者本机上安装oracle数据库软件. 18.12.20 1.下载Oracle.Mana ...
- ios 向sqlite数据库插入和读取图片数据
向sqlite数据库插入和读取图片数据 (for ios) 假定数据库中存在表 test_table(name,image), 下面代码将图片文件test.png的二进制数据写到sqlite数据库: ...