C ++ ASM内联如何在ASM中使用struct成员?

时间:2012-01-25 10:32:20

标签: c++ data-structures assembly inline-assembly

我有以下

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]的值

1 个答案:

答案 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,我真的怀疑你真的必须处理现代操作系统下的段寄存器(由于虚拟内存,即你可以使用直接地址)。您应该在上述更改后检查您的代码。