|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
STATUS_ILLEGAL_INSTRUCTION
При выполнении кода try finally но только в асме, возникает ошибка STATUS_ILLEGAL_INSTRUCTION.
Код Код:
014C0000 E801000000 call $014c0006 014C0005 C3 ret 014C0006 55 push ebp 014C0007 89E5 mov ebp,esp 014C0009 31C0 xor eax,eax 014C000B 55 push ebp 014C000C 682B004C01 push $014c002b 014C0011 64FF30 push dword ptr fs:[eax] 014C0014 648920 mov fs:[eax],esp 014C0017 CC int 3 ; внутри try 014C0018 31C0 xor eax,eax 014C001A 8B00 mov eax,[eax] 014C001C 31C0 xor eax,eax 014C001E 5A pop edx 014C001F 59 pop ecx 014C0020 59 pop ecx 014C0021 648910 mov fs:[eax],edx 014C0024 6836004C01 push $014c0036 014C0029 CC int 3 ; finally 014C002A C3 ret 014C002B FF2519004B01 jmp dword ptr [$014b0019] ; system.@HandleException 014C0031 E9F3FFFFFF jmp $014c0029 014C0036 89EC mov esp,ebp 014C0038 5D pop ebp 014C0039 C3 ret При исполнении этого кода, например в процедуре нажатия кнопки, все ок, при выполнении в выделенном куске памяти вылетает ошибка STATUS_ILLEGAL_INSTRUCTION. Валится при отработке исключения, т.е. оно как бы обрабатывается, но вместо того, чтоб прыгнуть в finally вылезает еще один эксепшн. Что за мистика? — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#2
|
||||
|
||||
Ах да, вот еще в чем забава, если трейсить отладчиком, то О ЧУДО, оно иногда работает.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
Разобрался, проблема внутри дельфовой _HandleFinally
Код:
{$IFDEF CPU386} type PExcDescEntry = ^TExcDescEntry; TExcDescEntry = record vTable: Pointer; handler: Pointer; end; PExcDesc = ^TExcDesc; TExcDesc = packed record {$IFNDEF PC_MAPPED_EXCEPTIONS} jmp: JmpInstruction; {$ENDIF} case Integer of 0: (instructions: array [0..0] of Byte); 1{...}: (cnt: Integer; excTab: array [0..0{cnt-1}] of TExcDescEntry); end; {$ENDIF} — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 03.09.2012 в 14:12. |
#4
|
||||
|
||||
Вот солюшен, просто переделал на короткий переход и подравнял нопами
Код:
003A005B EB08 jmp $003a0065 ; короткий джамп 003A005D 90 nop 003A005E 90 nop 003A005F 90 nop 003A0060 E9DCFFFFFF jmp $003a0041 ; прыг в finally 003A0065 FF2519003500 jmp dword ptr [$00350019] ; собственно вызов дельфового "хандлера" — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |