Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Прочие языки программирования > Assembler
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.09.2012, 12:57
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию 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  
Старый 03.09.2012, 12:59
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ах да, вот еще в чем забава, если трейсить отладчиком, то О ЧУДО, оно иногда работает.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 03.09.2012, 14:00
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Разобрался, проблема внутри дельфовой _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  
Старый 04.09.2012, 09:25
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Вот солюшен, просто переделал на короткий переход и подравнял нопами
Код:
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, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter