首页
社区
课程
招聘
[求救]汇编无法使用VC编译的LIB
发表于: 2010-2-2 13:50 5343

[求救]汇编无法使用VC编译的LIB

2010-2-2 13:50
5343
我的程序需要用压缩解压缩,我找了个7ZIP压缩库源代码。里面没有生成LIB的,只有生成DLL,我建了个LIB工程,生成了一个在VC下建了个工程正常使用。转到汇编平台就不行了,卡死在LzmaCompress这个函数,LzmaCompress在大约230条指令的时候调用了HeapAlloc函数,就卡死在这个函数里。
PUSH ESI         ;HeapSize  ESI==5824
PUSH 8           ;Flags     HEAP_ZERO_MENORY
PUSH DWORD PTR DS:[533258]   ;hHeap
CALL DWORD PTR DS:[411018]   ;HeapAlloc
hHeap是533258地址的一个双字变量,他是0,所以进入HeapAlloc大约20个指令内就出现访问越界。
我于是跟踪VC下编译的程序进入这个函数调用,发现hHeap【533258】指向的双字不是零,是00370000,结果是可以正常使用。
我重启VC下编译的程序,在【533258】设置了内存写入断点,结果发现在main函数没有调用之前,VC初始化代码设置了【533258】,用的是HeapCreate函数返回值。
查看汇编编译的程序,一直执行到HeapAlloc出错也没有设置【533258】的值,应为汇编没有像VC编译出程序那样的初始代码,而是直接就调用了start:开始处;
我重新进入VC添加了一些代码去除了VC自动添加的初始代码:
#pragma comment(linker, "/ENTRY:EntryPoint")
void EntryPoint()
{
     
     ExitProcess(main());
}
设置从EntryPoint启动,结果一样出现了在HeapAlloc出错。甚至连printf都出错在HeapAlloc。
以上的VC下是控制台工程,我建了个WIN32工程一样是出错。

我怀疑是不是那个LIB使用了类似NEW一样的C++操作符,所以导致必须要初始化代码,而汇编平台无法提供。但是我看他的代码都是.c结尾的,里面却调用了一些类似C++类的东西。他代码,
p = alloc->Alloc(alloc, sizeof(CLzmaEnc));里的Alloc是objidl.h的
void *( STDMETHODCALLTYPE *Alloc )(
            IMalloc * This,
            /* [in] */ SIZE_T cb);
以后就查不到了。

objidl.h 是用來放 COM 的核心宣告用的,以及 MIDL (Microsoft Interface Definition Language)  的宣告,這些東西和 COM Automation 有很密切的關係。

是不是跟这个有关系??求解!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 152
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
LzmaLib.rar上传,里面是LzmaLib的工程可以编译出静态库,附加INC可以再汇编里使用。
就是会出错,不知怎么解决。
上传的附件:
2010-2-2 14:07
0
雪    币: 145
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
在汇编中调用GetProcessHeap()函数的返回值是0么?
2010-2-2 16:00
0
雪    币: 152
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不会的 ,应该是起始地址。
2010-2-2 16:20
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
函数调用约定 写对了吗
2010-2-2 17:02
0
雪    币: 152
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个没问题的,2楼有附件,大家可以试试,VC工程就不出错。
2010-2-2 17:39
0
雪    币: 152
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
http://topic.csdn.net/u/20100202/14/b996e820-d125-4fbe-9c70-e78a703ffad0.html?seed=19714011&r=63227772#r_63227772

CSDN有人解答我了,是汇编没有RUNTIME的初始化,不知道如何解决!
2010-2-3 15:25
0
雪    币: 152
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
http://topic.csdn.net/u/20100202/14/b996e820-d125-4fbe-9c70-e78a703ffad0.html?seed=1418158962&r=63231616#r_63231616
问题已经解决了,但是ASM是不是不能使CRUNTIME还是不知道。
2010-2-3 16:49
0
雪    币: 2166
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢楼主,问题解决了知道把链接放上来,不像某些人解决了就不管了,也不说是怎么解决的,
值得学习
2010-2-3 23:08
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
10
win32汇编都是调用系统API,还没见过调用C函数的例子....
2010-2-4 09:39
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
11
有看过调用的,是要变化下编译环境,搜下有的
2010-2-4 09:56
0
雪    币: 152
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
解决方法就是不调用RUNTIME函数,例如malloc,free之类的函数,想字符串lstr类函数不算是RUNTIME函数。
RUNTIME函数会在每调用MAIN函数之前初始化一些东西,汇编没有初始化所以C编译出的LIB无法使用。
只要不是用C的RUNTIME函数一切都解决了。
2010-2-5 11:04
0
游客
登录 | 注册 方可回帖
返回
//