-2

最近、インラインアセンブリから高級言語(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
4

1 に答える 1

2

pointer計算された値を、次を指す場所に書き込みたいと仮定します。

*reinterpret_cast<short*>(pointer) = packet->PacketSize^0x1A3C;

reinterpret_cast「ある型のオブジェクトを取得し、それを別の型に強制する」ことを意味し、関連のない型へのポインター間の変換に使用されるキャストです。pointerを指しているかのように値が割り当てられshortます。ポインタが に対して正しいアラインメントを持っていない場合、これにより未定義の動作が発生する可能性があることに注意してくださいshort。一般に、reinterpret_castコンパイル時の型チェックを削除し、結果が正しく使用されていることを確認する責任をプログラマーに残します。

于 2012-07-24T08:10:59.097 に答える