2012-01-25 2 views
0

У меня есть следующиеC++ ASM Inline как использовать члены структуры в 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 
    } 
} 

Вы можете сказать, что оба MOV Сгенерируют error C2415: improper operand type.

Как вы можете видеть, что я хочу сделать, это магазин [+ ESI 0x77C] значение в myJohn.oldA

's

Тогда я хочу, чтобы заменить один и тот же [ESI + 0x77C] s значение с myJohn.A

+0

Почему вам приходится иметь дело с DS? –

+0

Ну, значение 4 байта хранится в памяти, и 'ESI' постоянно меняет каждую секунду на новое значение, перед изменением ESI я должен заменить местоположение значения ESI + 0x77C своим собственным ... и сохранить старое значение для справочных целей , Если вам интересно, функция test() привязана к вызову небольшим патчем в цель – SSpoke

+0

Я не знаю, почему это DS .. вот как это было до того, как я захотел исправить регистр на другое значение. Это работает. Если я просто вместо myJohn.A поставил, как '12345', вместо этого он применил бы изменения отлично. Если кто-нибудь может сказать мне, как это сделать без структур .. например, просто используя 'int oldA = 0;' 'int A = 0;', что также было бы полезно .. для меня не имеет значения .. просто структура немного больше упакованных/аккуратных для меня – SSpoke

ответ

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 
    } 
} 

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

+0

Yup Спасибо OSman Turan, просто протестирован и yup, который отлично работает. – SSpoke

Смежные вопросы