首页
社区
课程
招聘
关于多个asm文件的编译和连接
发表于: 2006-2-22 00:02 10960

关于多个asm文件的编译和连接

2006-2-22 00:02
10960

有的时候函数太多,一个asm文件可能不会去写那么多~~

所以就分成好几个asm文件来写~~

但是我却不知道masm在这方面的规则是怎么样定义的~~

原来写C++都是这样的~~

main.cpp
fun.cpp
fun.h

fun.h里面是fun.cpp的函数声明
fun.cpp里面是函数体

如果main.cpp要调用fun.cpp里面的函数,包含fun.h就可以了~~

但是masm好像不行~~

main.asm
fun.asm
fun.inc

main.asm
.386
.mode ....
....
...
...
..
..
.code
start:
end start

fun.asm
include fun.inc
.code
..
..
..
..

fun.inc是fun.asm里面的函数定义

当我用main.asm去包含fun.asm之后,却无法使用fun.asm里面的函数

如果直接包含fun.asm就是正常的~~~

但是总觉得怪怪的~~

不知道你们都是怎么做的??


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (21)
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
只要在你调用函数前面的地方饱含fun.asm就行了,如下
;-------------main.asm---------------
include.fun.asm
2006-2-22 01:06
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
MASM和C++是一样的, 包含函数声明头文件就可以了
不过链接的时候要同时指定两个OBJ文件
象这样:link ..... asm.obj fun.obj
2006-2-22 13:48
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不用呀,编译时会链接成一个OBJ,不用在link下指定
2006-2-22 18:08
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
我的意思是分别编译几个独立的源代码文件, 生成多个obj文件, 然后把这些obj文件连接成exe文件
2006-2-22 18:36
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
是不是需要用到public和extern操作符?
2006-2-23 02:22
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
默认就是public
声明函数可以用extern和externdef, proto也是可以的
要先分别把fun.asm和main.asm编译成fun.obj和main.obj,
然后连接时同时指定两个obj文件
2006-2-23 12:21
0
雪    币: 202
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
就是radasm主页上面的那个CHM教程。里面有介绍多moudle的程序书写方法

简单的讲一下:
在项目文件里面加入moudle文件,然后如果是要使用外部变量就用extern
如果该模块中的一些变量需要给别的模块使用,就用public

如果是函数也是同样的方法
2006-2-23 16:28
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
我试了好久,都没有成功~~~

可否举一个简单的例子,或者上传一段简单的代码~~

A.asm
B.asm
B.inc

A文件里面调用B文件里面的函数

而A只需要include B.inc文件

就是C语言的风格
2006-2-24 00:26
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
这里有一个例子, 让它和masm32在同一个盘符下执行assemble.bat文件就可以编译连接了
上传的附件:
2006-2-24 10:17
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
哦,原来在B.asm中也需要声明开始的一些东西啊~

就好像

.386
.model

了解了,真是谢谢~~~~~~~~

这里的人还真是挺热心的
2006-2-25 02:29
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
我在Winasm中不能连接成功~~~

winasm好像把两个文件编译成了一个obj文件
2006-2-25 08:17
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
13
Winasm不支持多模块程序
两个源文件一定要分别编译, 一起连接
2006-2-25 10:57
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
那什么集成开发环境支持多模块?
2006-2-25 13:07
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
15
RadAsm
2006-2-25 13:21
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
RadAsm

好像也不支持多个文件
2006-2-25 13:37
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
17
支持的, 只是默认不激活, 而且也不是太方便
工程选项里有个"编译模块", 选中前面的勾后就可以在构建菜单中激活对应的菜单项, 然后在工程中导入模块, 编译后把生成的obj文件导入工程就可以链接了, 详见chm帮助文件
2006-2-25 13:41
0
雪    币: 202
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
具体可以参看winasm安装目录下面的sample目录里面的Module示例!
2006-2-28 19:51
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
OPTION PROC:PRIVATE

好像是这句话
2006-2-28 21:50
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
20
嗯,确实, 看到18楼的帖子我到WinAsm官网上去看了看, 已经升级到5.1.1.3版了,我自己的版本是很久以前的, 赶快升级. 我好长时间没有用WinAsm了, 现在发现它是支持多模块的
谢谢18楼的朋友
2006-2-28 22:40
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
研究了一下~~~

已经搞定了

OPTION PROC:PRIVATE是将函数声明为私有的~~

这个好像C++的类权限,但是不一样~~

然后将需要在其它文件中调用的函数加上public标识~~

就可以正常使用了~~

如果不要那个OPTION PROC:PRIVATE也可以~就标识全部函数都是public

都可以在其它文件中调用

其实关键不在这里,关键在于需要把非主文件设置成非编译文件

这样可以可以生成多个obj了
2006-2-28 23:14
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
希望版主可以收录成精华哦

哈哈,好多朋友其实都不知道这个方法吧~~

估计也都还是在用命令行的编译方法~~

相对来说集成开发环境还是比较好一些,方便一些~

容易找到代码的错误,编译也很方便~~

命令行的编译方式了解一下就好了~~~
2006-2-28 23:17
0
游客
登录 | 注册 方可回帖
返回
//