В листингах программ, написанных на Delphi, часто можно заметить после ret'а два jmp'а. Это не глюк Иды или Софтайса. Исследование Софтайсом показывает , что после рета перехода на эти джампы не происходит. Вопрос: зачем они нужны?
Не обращай внимания - это стандартная дельфийская реализация try/except и try/finally. Посмотри в DeDe - во всех кликах VCL-компонентов сидят эти фишки. Попасть на эти JMP код может только при наличии исключения в теле функции или необработанного исключения в вызываемых ею функциях. Выглядит это так: Код (Text): @@try: xor eax,eax ;установка SEH push ebp push @@jmp_to_SEH ;это адрес JMP на стандартный обработчик push fs:[eax] mov fs:[eax],esp @@body: ;................... ;тело процедуры @@end_try: ;................... ;восстановление SEH-chain push @@exit ;пуш адреса завершения @@finally: ;................... ;здесь код блока finally..end ret ;это "хитрый" RET = jmp @@exit @@jmp_to_SEH: jmp @@Std_SEH_Handler ;переход на стандартный SEH-обработчик jmp @@finally ;сюда идет возврат из SEH для выполнения блока finally @@exit: ;................... ;код завершения = очистка стека ret ;настоящий выход из процедуры При отсутствии исключения первый ("хитрый") RET работает просто как jmp @@exit, обходя два jmp. При наличии исключения код попадает на первый jmp и прыгает на стандартный обработчик, который решает что делать. Если продолжить обработку нельзя, то вызывается исполнение блока finally. Беря адрес первого jmp из SEH-chain, обработчик вычисляет адрес второго jmp, пушит новый адрес возврата и через второй jmp попадает на блок finally из которого по "хитрому" ret возвращается назад в обработчик.