我有以下内容
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 都生成了错误 C2415:不正确的操作数类型。
如您所见,我想做的是将 [ESI+0x77C] 的值存储到 myJohn.oldA 中
然后我想用 myJohn.A 替换相同的 [ESI+0x77C] 的值
最佳答案
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
}
}
顺便说一句,我真的怀疑你真的必须在现代操作系统下处理段寄存器(由于虚拟内存,即你可以使用直接地址)。您应该在进行上述更改后检查您的代码。
关于C++ ASM Inline如何在ASM中使用struct成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9001177/