0

次のコードがあります

void PacketEncrypt(Packet* packet, int sizeofpacket)
{
    int* pointer;
    pointer = ((int*)packet+sizeofpacket)-2;
    (int)*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   8D5481 F8        LEA EDX,DWORD PTR DS:[ECX+EAX*4-8]

しかし、私が本当に欲しいのは:

0041585E   8B45 0C          MOV EAX,DWORD PTR SS:[EBP+C]
00415861   8B4D 08          MOV ECX,DWORD PTR SS:[EBP+8]
00415864   8D5481 F8        LEA EDX,DWORD PTR DS:[ECX+EAX-2]

私は C++ に慣れていないので、私が間違っていること、またはコンパイラがスカラー *4 を追加する理由について教えてもらえますか? ありがとう !

4

2 に答える 2

4

C++ は、ポインター型を使用してポインター演算を行います。ptr+2は 2要素であり、過去の 2 バイトではありませんptr。の場合sizeof(*ptr)==4、これらの 2 つの要素は 8 バイトであるptr+2ため、 の 8 バイト先を指しますptr

于 2012-07-24T07:04:40.567 に答える
1

intポインターのサイズはマシン上であり、バイト単位4 bytesでのみシフトできます。にキャストして4*nポインターを移動する必要がある場合は、2 bytescharsizeof(char) = 1

char *ptr = (char*)otherPtr;
ptr += 2; //shift by 2 bytes

int *ptr = (int*)otherPtr;
ptr += 2; //shift by 8 bytes. (2 * sizeof(int))

編集

(short*)pointer = something.- に割り当てることはできませんrvalue。私はあなたが意味したと思います:

pointer = (char*) something

shortまたは、ポインターが必要な場合:

short *someOtherPointer = something 
于 2012-07-24T07:04:08.117 に答える