Я хочу получить текущее значение регистра EIP с ассемблером. Это возможно?Как проверить значение EIP на языке ассемблера?
ответ
Предполагая, что 32-битный x86, используют следующую функцию:
get_eip: mov eax, [esp]
ret
Затем, чтобы получить значение EIP в EAX, просто:
call get_eip
call foo
foo:
pop eax ; address of foo
Этот подход имеет тонкую проблему. Современные процессоры пытаются предсказать обратные адреса - вызов, который не сопряжен с возвратом, искажает предсказание. См. Http://blogs.msdn.com/b/oldnewthing/archive/2004/12/16/317157.aspx – user200783
@Paul Baker обычно это не критическая проблема. Например, 'call @f/db '123', 0/@@:' является обычной практикой – Abyx
call foo, pop eax, push eax, ret –
На x86-64 (в отличие от 32 бит x86), есть RIP
- относительная адресация (RIP
- это 64-разрядный аналог EIP
). Таким образом, в 64-битном коде, вы можете просто сделать
lea rax, [rip]
переместить текущее содержимое RIP
в RAX
(вы можете использовать lea
но не mov
для этого).
Отличный комментарий. Я удалил свой неправильный ответ. Комментарии не должны размещаться в качестве ответов. –
Хммм, это не работает в блоке VC++ 2015 '__asm {}'. :(Получить 'ошибка C2415: ошибка неправильного операнда. – Adrian
- 1. «Ярлык» на языке ассемблера
- 2. Арифметические операции в языке ассемблера
- 3. Значение «ds:» в языке ассемблера
- 4. Указатели на языке ассемблера
- 5. GetChar() на языке ассемблера
- 6. Как проверить инструкцию LIDT на языке ассемблера с Fedora16?
- 7. Последовательность Fibonacci на языке ассемблера
- 8. , как решить последовательность на языке ассемблера
- 9. Шрифт DOS на языке ассемблера
- 10. Определение «переменные» на языке ассемблера
- 11. Регистрация использования на языке ассемблера
- 12. Серия Tetrabonacci на языке ассемблера
- 13. Использование DUP на языке ассемблера
- 14. Числовые адреса на языке ассемблера
- 15. оператор смещения на языке ассемблера
- 16. Как установить значение в реестре Windows на языке ассемблера?
- 17. Как напечатать 0,2,4,6, ... на языке ассемблера?
- 18. Как напечатать остаток на языке ассемблера
- 19. как lisp реализован на языке ассемблера?
- 20. Как изменить число на языке ассемблера
- 21. Как изменить массив на языке ассемблера ARM?
- 22. Запись на языке ассемблера, как работает совместимость?
- 23. Как создать цикл на языке ассемблера x86?
- 24. Как реализовать многопроцессорность на языке ассемблера?
- 25. Как выводить символ на языке ассемблера?
- 26. Как печатать цветную строку на языке ассемблера?
- 27. Вопрос о языке ассемблера
- 28. Доступ к системному вызову на языке ассемблера
- 29. Вопрос о языке ассемблера
- 30. Факториал в языке ассемблера
Это потрясающе: D – Mehrdad
Мне жаль, что не было возможности сделать это без ярлыков или подсчета байтов – Dmitry