我正在使用Adobe Flash ocx将其加载到我的C++程序中.ocx应该是64位但由于某种原因,当我使用x64平台编译时它会出现问题.我已经阅读了这篇文章,发现有些函数可能会接收DWORD userData
而不是void* userData
通过某种结构,然后将其转换为对象指针.这在32位环境中正常工作,但在64位崩溃.
在导致崩溃的ocx内部的函数调用的反汇编有以下几行:
mov ecx,r8d
Run Code Online (Sandbox Code Playgroud)
第一个操作仅将低32位复制R8D
到ECX
(ECX为32位).
cmp dword ptr [rcx+11BCh],0
Run Code Online (Sandbox Code Playgroud)
第二个操作访问64位寄存器,其中低32位包含正确的地址,高32位包含一些垃圾.当然,导致崩溃.
解
我已经读过一个可能的解决方案是执行以下操作:
创建一个包含以下代码的asm文件:
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8d // I've replaced ecx with rcx here
cmp dword ptr [rcx+11BCh],0
Run Code Online (Sandbox Code Playgroud)使用此asm文件和MASM.exe构建obj文件
问题
我通过制作以下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 …
Run Code Online (Sandbox Code Playgroud)