C ++ ASM Inline, как использовать элементы структуры в ASM? - PullRequest
0 голосов
/ 25 января 2012

У меня есть следующее

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

Затем я хочу заменить то же значение [ESI + 0x77C] на myJohn.A

1 Ответ

3 голосов
/ 25 января 2012

Нет операнда памяти / памяти для инструкции 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
    }
}

Кстати, я действительно подозреваю, что вам действительно приходится иметь дело с сегментными регистрами в современных ОС (из-за виртуальной памяти, то есть вы можете использовать прямые адреса).Вы должны проверить свой код после вышеуказанных изменений.

...