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