我有以下
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
}
}
你可以看出两个MOV都生成了error C2415: improper operand type.
你可以看到我想要做的是将[ESI + 0x77C]的值存储到myJohn.oldA
然后我想用myJohn.A替换相同的[ESI + 0x77C]的值
答案 0 :(得分:3)
MOV
指令没有内存/内存操作数。您应该使用注册表来进行此类使用。这是这样的:
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
}
}
BTW,我真的怀疑你真的必须处理现代操作系统下的段寄存器(由于虚拟内存,即你可以使用直接地址)。您应该在上述更改后检查您的代码。