我最近从内联汇编转到高级语言(C ++),我希望将结果从value^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
答案 0 :(得分:2)
假设您要将计算值写入pointer
指向的位置:
*reinterpret_cast<short*>(pointer) = packet->PacketSize^0x1A3C;
reinterpret_cast
表示“获取一种类型的对象并将其强制转换为另一种类型”,并且是用于在指向不相关类型的指针之间进行转换的转换;该值被指定为pointer
指向short
。请注意,如果指针没有short
的正确对齐方式,则可能会导致未定义的行为。通常,reinterpret_cast
会删除编译时类型检查,而在程序员身上留下责任以确保正确使用结果。