文档章节

学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程

涂孟超
 涂孟超
发布于 2014/09/26 15:30
字数 856
阅读 6
收藏 0

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

所谓 "假模块化" 就是通过 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, 11, 22
    PrintDec eax ;33
    invoke sum3, 11, 22, 33
    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, 11, 22 PrintDec eax ;33 invoke sum3, 11, 22, 33 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, 11, 22 PrintDec eax ;33 invoke sum3, 11, 22, 33 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, 11, 22 PrintDec eax ;33 invoke sum3, 11, 22, 33 PrintDec eax ;66 ret main endp end main ;其实把子程序的声明直接写在实现它的 asm 文件里也行, 但那样层次不分明.

本文转载自:http://www.cnblogs.com/del/archive/2010/04/29/1723799.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
win32汇编和x64汇编?

win32汇编升到winx64汇编,转型容易吗?我指的是会win32汇编,还学x64汇编吗?我是初学,能不能直接学x64汇编语言,请推荐本书?

IIOWE
2014/10/01
840
3
为什么破解要学win32汇编?

听说破解要学win32汇编,写壳也要用win32汇编?为什么呢?不学不能学破解吗?

IIOWE
2014/10/02
2.4K
13
Win32汇编开发环境介绍和RadAsm简明教程

Win32汇编开发环境介绍和RadAsm简明教程 现在很多朋友都在学习汇编语言,一方面汇编语言是大学计算机课程的必修课,另一方面则是为了从其它语言转到汇编语言来,无论什么原因,我认为学习汇编...

nothingfinal
2009/08/01
0
0
MASM32 SDK

MASM32 SDK是不同工具软件的大集合,它的汇编编译器用的是微软MASM软件包中的Ml.exe,资源编译器和32位链接器使用的是Microsoft Visual Studio中的Rc.exe和Link.exe,同时包含了Microsoft V...

匿名
2011/05/04
5.9K
1
[Beautifulzzzz的博客目录] 快速索引点这儿O(∩_∩)O~~,红色标记的是不错的(⊙o⊙)哦~

3D相关开发 [direct-X] 1、direct-X最小框架 [OpenGL] 1、环境搭建及最小系统 [OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析 51单片机 [51单片机] 1602液晶显示控制代码 [51单片机] 1...

史迪奇2号
2017/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux下find、awk、sed、grep命令的例子

find:搜索工具 # 列出当前目录及子目录下所有文件和文件夹find .# 在/home目录下查找以.txt结尾的文件名,-i表示忽略大小写find /home -iname "*.txt" find命令的详细介绍 awk:数据快...

吴伟祥
36分钟前
1
0
flink的Async I/O 异常处理

异常 Async function call has timed out1.3+AsyncFunctionflink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/functions/async/AsyncFunction.java@Public......

stys35
48分钟前
2
0
sql plus入门

用sqlplus操作数据库的基本步骤: #su - oracle $sqlplus / as sysdba >!ps -ef|grep ora #查看oracle进程,看看oracle是否已经启动,如果未启动则使用下面这条语句启动. >startup #启动oracl...

突突突酱
今天
1
0
kettle10 利用java代码解压gz格式文件

kettle默认只能解压zip格式的文件,比如linux里的tar、gz等格式的文件需要用到java代码来解压 在java代码里引入需要的包,要返回的变量 java代码如下 import java.io.BufferedInputStream;...

wells杨
今天
2
0
Wince之旅——设备控制(重启网卡为例)

其实根据我的实践,在wince下面重启网卡其实十分简单,直接把驱动程序和网卡分离然后再绑定一次就好了。怎么绑定呢。就是一个函数DeviceIoControl和底层通信下。 方法1 :把第二个参数设为I...

rainbowcode
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部