![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 При выполнении кода 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 вылезает еще один эксепшн. Что за мистика?  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Ах да, вот еще в чем забава, если трейсить отладчиком, то О ЧУДО, оно иногда работает. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#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}Последний раз редактировалось 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] ; собственно вызов дельфового "хандлера"  |