Libusb-1.0.9错误消息

时间:2016-01-15 19:51:06

标签: assembly

使用汇编语言编写基于Windows的程序以使用库。 Windows XP Sevice Pack 3 32位程序集。在我调用库中的任何函数之前,Cand将include和lib文件放到项目中甚至可以正确编译!

LINK:致命错误LNK1196:导入对象无效或损坏:未知版本所以我有库的源代码如何让链接器停止抱怨错误? 我想我需要知道我要在库的源代码中做些什么才能使它符合要求? 该库正确编译,我可以在C或C ++中使用它,但我在汇编语言中更加舒适,已经做了30多年。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

要从Windows VS环境中的汇编语言例程调用库例程,需要执行以下步骤(示例来自VS 2015):

步骤1:在汇编程序中,请声明如下函数(例如_sopen_s()):

extern _sopen_s:proc;这是一个库函数

步骤2:Project环境必须包含包含该功能的库。对于标准的VS C / C ++库,这可以通过Project-> Linker-> General-> Link Library Dependencies设置为" Yes"

来完成。

如果您已创建自己的库,则Project-> Linker-> General->其他库目录应指向其他库所在的目录。

现在关于包含,请注意包括定义某些标志值,所以如果你想使用任何特定的标志值,你需要重写"重写"它是

SEEK_CUR EQU 1;从stdio.h复制

或直接使用,如下所示(文件创建示例):

lea         rcx,dest_file_descriptor        ; int * fd
mov         rdx,r11                         ; filename * in R11
mov         r8,8000H                        ; set up the flag _O_BINARY (we handle all translations ourselves)
or          r8,100H                         ; or with _O_CREAT
or          r8,200H                         ; and further or with _O_TRUNC
or          r8,0002H                        ; and finally with _O_RDWR (fcntl.h)
mov         r9,040H                         ; set up the flag _SH_DENYNO (share.h)
mov         r10,0080H                       ; set up the flag _S_IWRITE (io.h)
or          r10,0100H                       ; or with _S_IREAD
sub         rsp,20H
push        r10                             ; _sopen_s(int * fd,char * filename, _O_BINARY | _O_CREAT | _O_TRUNC | _O_RDWR, _SH_DENYNO, _S_IWRITE)
call        _sopen_s
pop         r10
add         rsp,20H

相信这有帮助......根据我的经验,它通常是一个令人沮丧的开始,但很快就会被整理出来......