注册 登录
编程论坛 汇编论坛

win32 asm的程序如何链接其他的obj文件

swp160108 发布于 2009-09-18 17:33, 2809 次点击
我要用一个库里的函数, 但是给的是.obj和.h文件, 请问如何使用这个库里的函数
我的dll也要用这个库的函数, 应该怎么链接.

[ 本帖最后由 swp160108 于 2009-9-18 17:48 编辑 ]
6 回复
#2
东海一鱼2009-09-18 17:52
一般流程如下:

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

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

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

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

然后在链接时,链接这个.obj文件即可。
:
link  /MACHINE:IX86 /SUSSYSTEM:WINDOWS  1.obj *.obj 1.res       //OK
#3
swp1601082009-09-19 09:07
感谢东海一鱼的回答, 还是有问题?

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 编辑 ]
#4
东海一鱼2009-09-19 10:56
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


   

     
 
#5
swp1601082009-09-19 11:47
这里没法发附件吗??
我把obj文件和inc上传到 http://www. 这里了
请 东海一鱼 看看 如何使用这个obj库 谢谢
#6
东海一鱼2009-09-19 16:10
啊,我分析了一下。这个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!
#7
swp1601082009-09-20 14:31
不错 谢谢
1