通过将加载到我的C++程序中,我正在使用它。ocx应该是64位,但由于某种原因,当我使用x64平台编译时,它会出现问题。我已经阅读了这方面的内容,并发现某些函数很可能通过某种结构接收DWORD userData而不是void* userData,然后将其转换为对象指针。这在32位环境中工作正常,但在64位环境中崩溃。
导致崩溃的ocx内部函数调用的反汇编如下所示:
mov ecx,r8d 第一个操作只复制低32位从R8D到ECX (ECX是32位).
cmp dword ptr [rcx+11BCh],0 第二个操作访问64位寄存器,其中低32位包含正确的地址,高32位包含一些垃圾。当然会导致坠机。
溶液
据我所知,一种可能的解决办法是做以下工作:
nop mov ecx,r8d cmp dword ptr rcx+11BCh,0 nop mov rcx,r8d // I用rcx替换ecx,这里cmp dword ptr rcx+11BCh,0
问题
我尝试使用以下asm文件并使用ml64.exe构建它(我没有masm.exe,但我认为ml.exe是它的新32位版本,这段代码只能使用ml64.exe构建,可能是因为64位运算符吗?):
TITLE: Print String Assembly Program (test.asm)
.Code
main Proc
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8
cmp dword ptr [rcx+11BCh],0
main ENDP
END在第二节将r8d更改为r8之前,我在构建它时遇到了困难(我一直收到关于指令长度匹配的错误)。
我要构建这个obj,并使用十六进制编辑器打开它,并能够找到这两个字节字符串。但我的问题是,当我搜索应该在闪存ocx中的第一个字节字符串时,我找不到它。它不在那里,所以我不能用第二个代替它。
我做错了什么?
谢谢!
发布于 2012-03-08 20:22:16
nop mov ecx,r8d cmp dword ptr rcx+11BCh,0 nop mov rcx,r8d // I已经用rcx替换了ecx,cmp dword ptr rcx+11BCh,0
我创建了以下asm文件并使用ml64.exe构建它
TITLE: Print String Assembly Program (test.asm)
.Code
main Proc
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8
cmp dword ptr [rcx+11BCh],0
main ENDP
END我要构建这个obj,并使用十六进制编辑器打开它,并能够找到这两个字节字符串。我在Flash中找到了第一个字节字符串,并将其更改为第二个字节字符串。(唯一的实际变化是字符串中的41比49 )
https://stackoverflow.com/questions/9303865
复制相似问题