我在尝试将 32 位产品转换为 64 位产品时遇到问题。我使用的是 Visual Studio 2008,代码是 C 和 C++。我希望任何人查看以下两行代码,一行来自 C 源文件,另一行来自 C++ 源文件。这两个文件都包含在 DLL 中。我还包括对两行代码的反汇编。
ewxlcom.c
memcpy(pCM->pSecAccInfo->spUserID,userSecurityInfo.spUserID,
sizeof(UserID));
000000000EF33BB9 mov r8d,80h
000000000EF33BBF mov rdx,qword ptr [rsp+828h]
000000000EF33BC7 mov rcx,qword ptr [rsp+1F8h]
000000000EF33BCF mov rcx,qword ptr [rcx+0BDEh]
000000000EF33BD6 call memcpy (0EF40352h)
tcputil.cpp
memcpy(serv_temp+INIT_MSG_USERID_OFFSET, pCM->pSecAccInfo->spUserID, INIT_MSG_USERID_LEN);
000000000EF3B8E6 lea rcx,[rsp+67h]
000000000EF3B8EB mov r8d,80h
000000000EF3B8F1 mov rdx,qword ptr [rsp+3B0h]
000000000EF3B8F9 mov rdx,qword ptr [rdx+0CBEh]
000000000EF3B900 call memcpy (0EF40352h)
如您所见,第一行将一些字节复制到 指向的内存中pCM->pSecAccInfo->spUserID
。第二行将这些相同的字节复制到内存中的另一个位置。ASM 将memcpy
字节从寄存器指向的内存复制到寄存器rdx
指向的内存rcx
。因此,在第一行中,一个值被移入了 register rcx
。这一点我已经验证指向pCM
。然后将 指向的值rcx + 0BDEh
复制到rcx
. 并且memcpy
被称为。这行得通。
但稍后在第二行将一个值加载到 register rdx
。我已经验证这也指向与pCM
第一行相同的内容。pCM
然后它加载驻留在从( rdx
)偏移的内存中的指针0CBEh
。该内存全为零,因此memcpy
崩溃。
问题是为什么编译器会为同一个源变量生成不同的代码。我认为这是一个对齐问题。这是C文件和C++文件之间的区别吗?VS 是否对 C 和 C++ 使用相同的编译器?还有什么我应该看的吗?
任何帮助,将不胜感激。