获取函数的大小

原文出处:http://bbs.bccn.net/thread-322155-1-5.html

 

unit Unit1;  

   

interface

   

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  

  Dialogs, StdCtrls;  

   

type

  TForm1 = class(TForm)  

    Button1: TButton;  

    Edit1: TEdit;  

    Memo1: TMemo;  

    procedure Button1Click(Sender: TObject);  

  private

    { Private declarations }

  public

    { Public declarations }

  end;  

type

    pFunction=function():Integer;  

var

  Form1: TForm1;  

  function code():Integer;  

  function codeEnd():Integer;  

   

implementation

   

{$R *.dfm}

function code():Integer;  

var

  i,j,k:Integer;  

begin

      i:=10;  

      j:=50;  

      k:=i+j;  

      result:=k;  

end;  

function codeEnd():Integer; begin

end;  

   

procedure TForm1.Button1Click(Sender: TObject);  

var

  func1,func2,func3:pFunction;  

  myCode:array of char;  

  codeSize:Integer;  

  i:Integer;  

begin

      ASM

         PUSH EAX;  

         PUSH EBX;  

         LEA EAX,codeEnd; {获取codeEnd函数的地址}

         LEA EBX,code;    {获取code函数的地址}

         SUB EAX,EBX;     {用codeEnd函数的地址减code函数的地址则可得出code函数的}

                          {大小,因为codeEnd函数刚好位于codeEnd函数的下面。}

         MOV codeSize,EAX;{把code函数的大小保存在变量codeSize中}

         POP EBX;  

         POP EAX;  

      END;  

      SetLength(myCode,codeSize);  

      ASM

         PUSH ESI;  

         PUSH EDI;  

         CLD;  

         LEA ESI,byte ptr[code];  

         MOV EDI,myCode;  

         MOV ECX,codeSize;  

         REP MOVSB;  

         POP EDI;  

         POP ESI;  

      END;  

      for i:=0 to HIGH(myCode)-1 do begin

          Memo1.Text:=Memo1.Text+Format('$%x',[Integer(myCode[i])]);  

      end;  

      func3:=pFunction(myCode);  

      i:=func3;  

      Edit1.Text:=IntToStr(i);  

end;  

   

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值