Консультация № 105427
14.10.2007, 16:01
0.00 руб.
0 2 2
Здраствуйте уважаемые эксперты! Подскажите пожалуйста как скопировать текущее значение EIP в регистр общего назначения (например в еах)!? Если Вас не затруднит, напишите пару строк кода!!!
С уважением к Вам, max!!!

Обсуждение

Неизвестный
14.10.2007, 16:59
общий
это ответ
Здравствуйте, Maksim/max!
воспользуйтесь оператором $

например
MiEIP equ $
mov eax,MiEIP

команда mov eax,MiEIP занимает 4 байта поэтому если вам необходим eip после выполнения этой команды, можно записать MiEIP equ $+4
Неизвестный
15.10.2007, 10:16
общий
это ответ
Здравствуйте, Maksim/max!

Можно сделать это, например, использовав свойство команды CALL, которая при работе заносит в стек адрес возврата.
Написав процедуру типа DisplayRegs можно в нужном месте сделать её вызов, а в ней залезть в стек и увидеть EIP, указывающий на команду, следующую за CALL.
Подробный пример писать было лень, поэтому взял первое, что нашёл в www.google.ru (в приложении).

Ну, если в кратце это выглядит так:
.386
.model flat
.code
start:
jmp short begin

get_eip:
pop eax
; ...

begin:
call get_eip
end start


Приложение:
OutBufferSize =200DisplayRegs:;Начало процедуры. В стэке находится адрес возврата, ;помещенный коммандой call при вызове.;используем его для отображения регистра EIP pushf ;сохраним флаги pusha ; и регистры общего назначения. add dword ptr [esp+3*4],8 ;команда pusha поместила в стэк значение esp ;до выполнения. Добавим 8 (команды call и pushf поместили в стэк 8 байт) ;чтобы отобразить значение esp до вызова процедуры. mov ebp,esp ;сохраним значение esp в ebp для более удобного ;(и короткого) обращения к сохраненным в стэке значениям регистров. ;Обычно также поступают компиляторы языков высокого уровня и ;макросы, объявляющие процедуры. sub esp,OutBufferSize ;выделим OutBufferSize байт стэка для формирования строки ;Часто так выделяют память под небольшие локальные переменные. mov edi,esp;содержимое памяти:;edi=esp; область паяти в OutBufferSize байт для формирования стрки;ebp=esp+OutBufferSize=edi+OutBufferSize; регистры общего назначения, помещенные командой pusha (8 регистров - 20h байт);ebp+20h; регистр флагов (pushf);ebp+24h; адрес возврата из процедуры (регистр eip)Источник: http://subscribe.ru/archive/comp.soft.prog.asm32/200602/28211309.html
Форма ответа