| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2802 人关注过本帖
标题:win32 asm的程序如何链接其他的obj文件
只看楼主 加入收藏
swp160108
Rank: 2
等 级:论坛游民
威 望:4
帖 子:63
专家分:98
注 册:2008-11-10
结帖率:100%
收藏
 问题点数:0 回复次数:6 
win32 asm的程序如何链接其他的obj文件
我要用一个库里的函数, 但是给的是.obj和.h文件, 请问如何使用这个库里的函数
我的dll也要用这个库的函数, 应该怎么链接.

[ 本帖最后由 swp160108 于 2009-9-18 17:48 编辑 ]
搜索更多相关主题的帖子: asm 链接 obj 文件 
2009-09-18 17:33
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
一般流程如下:

首先判断这个.obj文件是OMF格式还是COFF格式。如果是OMF格式,就只能用BC、BC++将其处理成DLL文件再调用了。

如果是COFF格式,就很简单了。

首先用H2INC工具将.h文件转换为汇编的.inc文件。

然后在你的代码里包含这个inc文件,正常调用库函数即可。

然后在链接时,链接这个.obj文件即可。
:
link  /MACHINE:IX86 /SUSSYSTEM:WINDOWS  1.obj *.obj 1.res       //OK

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-18 17:52
swp160108
Rank: 2
等 级:论坛游民
威 望:4
帖 子:63
专家分:98
注 册:2008-11-10
收藏
得分:0 
感谢东海一鱼的回答, 还是有问题?

1. 如何判断obj的格式呢??
2. 我是用masmplus编译asm的 这个里面应该怎么写编译条件, 你知道不?
3. link  /SUSSYSTEM:WINDOWS  1.obj 库.obj
   我是这么链接的 但是总是提示不能写  库.obj
   我是要用 库.obj的函数 他好像要生成 库.obj 一样 这时怎么回事
4. 除了函数 好像他还有全程变量
   这时.h中的定义 这个能转换成汇编格式吗
  extern short int DogBytes,DogAddr;
extern unsigned long DogPassword;
extern unsigned long NewPassword;
extern unsigned long DogResult;
extern unsigned char DogCascade;
extern void * DogData;

[ 本帖最后由 swp160108 于 2009-9-19 09:10 编辑 ]
2009-09-19 09:07
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
1、OMF我没有太多研究,COFF的OBJ文件很简单:第一个WORD就是平台标示码,对X86来说就是 0x014c。
   其他的标示你可以查阅一下PE文件文档。
2、aogo的masmplus我没有用过。
3、好好研究下这个.obj文件吧。呵呵。
4、很简单,基本与C一样,稍有区别:
     extern DogBytes:      WORD
    extern DogAddr:       WORD
    extern DogPassword:   DWORD  
    extern NewPassword:   DWORD
    extern DogResult:     DWORD
    extern DogCascade:    DWORD
    extern DogData:       DWORD


   

     
 

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-19 10:56
swp160108
Rank: 2
等 级:论坛游民
威 望:4
帖 子:63
专家分:98
注 册:2008-11-10
收藏
得分:0 
这里没法发附件吗??
我把obj文件和inc上传到 http://www. 这里了
请 东海一鱼 看看 如何使用这个obj库 谢谢
2009-09-19 11:47
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
啊,我分析了一下。这个OBJ文件是比较特别。他的外部变量是需要主程序定义的。

所以你的.inc文件必须修改为:
程序代码:
;EXTERNDEF        C DogAddr:SWORD         /
;                                         |                    
;EXTERNDEF        C DogPassword:DWORD     |
;                                         |    
;EXTERNDEF        C NewPassword:DWORD     |  - 取消这些定义,他们是给C的编译器看的
;                                         |
;EXTERNDEF        C DogResult:DWORD       |  
;                                         |
;EXTERNDEF        C DogCascade:BYTE       |  
;                                         |
;EXTERNDEF        C DogData:DWORD         \ 
 
@proto_0        TYPEDEF        PROTO C  
DogCheck        PROTO        @proto_0 
 
@proto_1        TYPEDEF        PROTO C  
ReadDog            PROTO        @proto_1 
 
@proto_2        TYPEDEF        PROTO C  
DogConvert        PROTO        @proto_2 
 
@proto_3        TYPEDEF        PROTO C  
WriteDog        PROTO        @proto_3 
 
@proto_4        TYPEDEF        PROTO C  
DisableShare    PROTO        @proto_4 
 
@proto_5        TYPEDEF        PROTO C  
GetCurrentNo    PROTO        @proto_5 
 
@proto_6        TYPEDEF        PROTO C  
SetPassword        PROTO        @proto_6 
 
@proto_7        TYPEDEF        PROTO C  
SetDogCascade    PROTO        @proto_7
在你的主程序里添加:
程序代码:
include gsmh.inc 
 
public DogBytes,DogAddr,DogPassword,NewPassword,DogResult,DogCascade,DogData  ;在OBJ里导出符号,供外部的OBJ使用
 
.data 
    DogBytes        SWORD    ?            /
    DogAddr            SWORD    ?         |
    DogPassword        DWORD    ?         |
    NewPassword        DWORD    ?         |  + 具体使用的变量
    DogResult        DWORD    ?           | 
    DogCascade        BYTE    ?           |
    DogData            DWORD     ?        \
编译、链接命令:
程序代码:
@echo off 
 
set mdir=d:\masm32                                       
set path=d:\masm32\bin 
set include=d:\masm32\include;d:\My_Sdk\include 
set lib=d:\masm32\lib;d:\My_Sdk\lib 
 
if exist testdog.obj    del testdog.obj 
if exist testdog.exe    del testdog.exe 
 
ml /c /coff /Cp /Gz testdog.Asm 
 
link /MACHINE:IX86 /SUBSYSTEM:WINDOWS testdog.obj MHWIN32C.OBJ 
 
@echo on 
 
dir testdog.* 
 
pause 

OK!

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-19 16:10
swp160108
Rank: 2
等 级:论坛游民
威 望:4
帖 子:63
专家分:98
注 册:2008-11-10
收藏
得分:0 
不错 谢谢
2009-09-20 14:31
快速回复:win32 asm的程序如何链接其他的obj文件
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021102 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved