私は、次のコードを持っているが、そのメモリのブロックをXORすることになっている:C/C++インラインアセンブラ不適切なオペランドの型
void XorBlock(DWORD dwStartAddress, DWORD dwSize, DWORD dwsKey)
{
DWORD dwKey;
__asm
{
push eax
push ecx
mov ecx, dwStartAddress // Move Start Address to ECX
add ecx, dwSize // Add the size of the function to ECX
mov eax, dwStartAddress // Copy the Start Address to EAX
crypt_loop: // Start of the loop
xor byte ptr ds:[eax], dwKey // XOR The current byte with 0x4D
inc eax // Increment EAX with dwStartAddress++
cmp eax,ecx // Check if every byte is XORed
jl crypt_loop; // Else jump back to the start label
pop ecx // pop ECX from stack
pop eax // pop EAX from stack
}
}
はしかし、引数dwKeyは私にエラーを与えます。たとえば、dwKeyが0x5Dに置き換えられた場合、コードは完全に機能します。
CまたはC++で書いたよりも速いと思われる理由は何ですか?シーザー暗号が数ミリ秒で壊れる可能性があることを考えると、どれほど速いかは問題ではありません。 –
'DWORD dwsKey'はタイプミスですか?余分な 's'が間違いだと思われる?ローカル変数 'DWORD dwKey;'を削除しますか? –
このコードのポイントは何ですか?コンパイラが4バイトxor、つまりSSE2 PXORを使用しないようにするために、ゆっくりとasmを書いていますか? –