[考题]BASM不用call调用函数
procedure TForm1.FormCreate(Sender: TObject);asm mov eax,offset @@buf+8 call ShowMessage ret@@buf: db $ff,$ff,$ff,$ff,3,0,0,0,'abc',0end;
procedure ExceptProc{ExceptionRecord,SEH,Context,DispatcherContext};assembler;asm MOV EAX , [ESP+12] MOV EAX.TContext.Eip , Offset @@ExceptDone MOV EAX , 1 RET $10; @@ExceptDone: XOR EAX , EAX MOV ESP , FS:[EAX+$14] POP FS:[EAX] POP EAX POPADend;//P As TProcedure /Function xxx : integer/Boolean/MoreFunction ExceptDoProcedure(P : Pointer) : integer;assembler;asm PUSH EAX //被执行函数 PUSHAD //保护现场 XOR EAX , EAX PUSH Offset ExceptProc //异常处理函数 PUSH FS:[EAX] //SEH结构 MOV FS:[EAX] , ESP MOV FS:[EAX+$14] , ESP MOV DS:[EAX] , EAX; //产生异常,触发SEH执行,进而转入P中执行end;//调用时Function DoIt : integer;begin ShowMessage('OK'); Result := $100end;procedure TForm1.FormCreate(Sender: TObject);begin Tag := ExceptDoProcedure(@DoIt); Caption := IntToHex(Tag , 8);end;