2012-01-25 28 views
0

私はあなたが私が何をしたいのか見ることができるようにあなたは、両方のMOVのはerror C2415: improper operand type.C++ ASM ASMで構造体メンバを使用する方法をインライン?

を生成することを伝えることができ、次の

struct john { 
    int oldA; 
    int A; 
} myJohn; 
DWORD gotoAddressBack = 0x00401000; 

void __declspec(naked) test(void) { 
    __asm { 
     MOV myJohn.oldA, DWORD PTR DS:[ESI+0x77C] 
     MOV DWORD PTR DS:[ESI+0x77C], myJohn.A 
     JMP gotoAddressBack 
    } 
} 

が店myJohn.oldA

に[ESI + 0x77C]の値であり、持っています

それから私はMOV命令のためのメモリ/メモリオペランドがありませんmyJohn.A

+0

なぜDSに対処する必要がありますか? –

+0

ESIが変わる前に、4バイトの値がメモリに保存され、ESIは毎秒新しい値に変更され続けます。ESI + 0x77Cの値の位置を自分のものに置き換えて、参照のために古い値を保存する必要があります。あなたが興味を持っているのであれば、test()関数はターゲット内の小さなパッチによって呼び出されるように束縛されています – SSpoke

+0

なぜそれがDSなのかわかりません。レジスタを別の値にパッチしたかったのです。それは私の代わりにmyJohn.Aの場合は動作します。代わりに '12345'のように置き換えれば、完全に変更が適用されます。誰かが構造体なしでこれを行う方法を私に教えてもらえれば、 'int oldA = 0;' 'int A = 0;'も役に立ちます..私には関係ありません。もう少しパッケージ化された/私のためのneater – SSpoke

答えて

3

と同じ[ESI + 0x77C]の値を置き換えたいです。そのような用途にはレジスタを使用する必要があります。これは、そのようなものです:

void __declspec(naked) test(void) { 
    __asm { 
     MOV EAX, DWORD PTR [ESI+0x77C] 
     MOV myJohn.oldA, EAX 

     MOV EAX, myJohn.A 
     MOV DWORD PTR [ESI+0x77C], EAX 

     JMP gotoAddressBack 
    } 
} 

ところで、私は本当にあなたが本当に現代のOSの下でセグメントレジスタに対処する必要があることを疑う(による仮想メモリに、すなわち、あなたは直接アドレスを使用することができます)。上記の変更後にコードをチェックする必要があります。

+0

ありがとうOSman Turan、ちょうどテストされ、うまく動作する完全に。 – SSpoke

関連する問題