C++ 转换为短类型指针?
我最近从内联汇编转到了高级语言(C++),我想将C++ 转换为短类型指针?,c++,inline-assembly,C++,Inline Assembly,我最近从内联汇编转到了高级语言(C++),我想将值^0x1A3C的结果设置为短类型指针(WORD PTR),但我遇到了以下错误: int类型的值不能用于初始化short类型的实体* 我在将int类型传递给short*时遇到问题: void PacketEncrypt(Packet* packet, int sizeofpacket) { char* pointer; pointer = ((char*)packet+sizeofpacket) -2; short *poi
值^0x1A3C
的结果设置为短类型指针(WORD PTR),但我遇到了以下错误:
int类型的值不能用于初始化short类型的实体*
我在将int类型传递给short*时遇到问题:
void PacketEncrypt(Packet* packet, int sizeofpacket)
{
char* pointer;
pointer = ((char*)packet+sizeofpacket) -2;
short *pointer = packet->PacketSize^0x1A3C;
packet->Type += 0x0FFF7;
}
我想让编译器做什么:
0041585E 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00415861 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00415864 8D5401 FE LEA EDX,DWORD PTR DS:[ECX+EAX-2]
00415868 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
0041586B 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
0041586E 0FBF08 MOVSX ECX,WORD PTR DS:[EAX]
00415871 81F1 3C1A0000 XOR ECX,1A3C
00415877 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
0041587A 880A MOV WORD PTR DS:[EDX],CX
假设要将计算值写入
指针所指向的位置:
*reinterpret_cast<short*>(pointer) = packet->PacketSize^0x1A3C;
*重新解释(指针)=数据包->数据包大小^0x1A3C;
reinterpret_cast
的意思是“获取一种类型的对象并将其强制转换为另一种类型”,是用于在指针之间转换为不相关类型的强制转换;赋值时,指针指向short
。请注意,如果指针没有正确对齐short
,这可能会导致未定义的行为。一般来说,reinterpret\u cast
会删除编译时类型检查,让程序员有责任确保正确使用结果。我想你可能用了错误的方法——“我希望我的编译器生成此代码”是相当随意的。编译器可以合法地生成任何具有正确可观察行为的代码。您在这里真正想要什么?我最近从内联汇编迁移到高级语言(C++),我想将值^0x1A3C的结果设置为短类型指针(单词PTR)但是我仍然有以下错误:int类型的值不能用于初始化C++中的Type *的实体,不要试图像汇编语言程序员那样思考,你最终会对语言感到沮丧和恼火。最好做C++所要做的事情:关注更大的图片,更高层次的东西。在大多数情况下,编译器比真正优秀的程序员更擅长生成合理的代码。如果你强迫它输出类似的东西,你可能会阻止其他优化。@ USE1175832:不要太注意C++编译器生成的汇编代码。如果编写一个包含数百行的大型程序,您将无法检查整个输出代码的外观。请相信你的C++编译器。这就是我需要的,你能给我们一点关于RealType的额外信息吗?我知道这个名字说明了一切,但是为了学习,顺便说一句,我没有找到合适的词来描述我的问题,所以我想asm输出可以帮助某人作为参考。再次感谢。@user1175832:我已经添加了更多关于reinterpret\u cast
的详细信息。