编程论坛
注册
登录
编程论坛
→
汇编论坛
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
swp160108
2009-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
swp160108
2009-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
swp160108
2009-09-20 14:31
不错 谢谢
1