Вопрос о вставке ассемблерного кода в C ++ - PullRequest
0 голосов
/ 31 декабря 2010

Я работаю над компилятором VC ++. Я хочу сделать следующее

Переменные s.AddrFrame.Offset и s.AddrStack.Offset содержат значения EBP и ESP соответственно. Смещение - это 64-разрядное целое число без знака. Моя машина с прямым порядком байтов.

typedef unsigned __int64 DWORD64; 

Я хочу извлечь значение старого EBP и обратный адрес. Предполагая, что адрес EBP + 1 содержит старое 32-битное значение EBP, а EBP + 5 - адрес возврата, я написал следующий код:

unsigned int old_ebp = 0;
unsigned int ret_addr = 0;

__asm{

mov old_ebp, DWORD PTR [s.AddrFrame.Offset + 1] 
mov ret_addr, DWORD PTR [s.AddrStack.Offset + 5]

}

Но это не компиляция

xxxx.cpp(1130) : error C2415: improper operand type

Пожалуйста, помогите

1 Ответ

2 голосов
/ 31 декабря 2010

Вы не можете использовать два операнда памяти для mov; надо быть регистром. Итак, в вашем случае вам нужно две mov инструкции:

mov eax, [s.AddrFrame.Offset + 1]
mov old_ebp, eax

и аналогично для ret_addr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...