• Delphi子过程参数传递


    默认调用方式Register,传递参数的顺序前三个为al,dl,cl / ax,dx,cx / eax,edx,ecx分别对应一个字节,两个字节,四个字节,当参数>3个时,多出的参数入栈,所以第四个参数的地址为[esp+8],第五个参数的地址为[esp+12],[esp+4]至[esp+0]这四个字是函数的返回地址。以上针对类以外的子过程,在类里面定义的过程参数传递有所改变,主要改变为eax保存了类的首地址即:self。

    代码
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

    type
    TForm1
    = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    function _AddFunc(pa,pb,pc,pd,pe:Integer):Integer;
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    function TForm1._AddFunc(pa, pb, pc, pd, pe: Integer): Integer;
    asm
    xor eax,eax
    add eax,edx
    add eax,ecx
    add eax,[esp
    +8]
    add eax,[esp
    +12]
    add eax,[esp
    +16]
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    iSum: Integer;
    begin
    iSum :
    = _AddFunc(10,20,30,40,50);
    ShowMessageFmt(
    'Integer Sum:%d',[iSum]);
    end;

    function addFunc(pa,pb,pc,pd: Byte):Byte;overload;assembler;
    asm
    add al,dl
    add al,cl
    add al,[esp
    +8]
    end;

    function addFunc(pa,pb,pc,pd: Word):Word;overload;assembler;
    asm
    add ax,dx
    add ax,cx
    add ax,[esp
    +8]
    end;

    function addFunc(pa,pb,pc,pd: Integer):Integer;overload;assembler;
    asm
    add eax,edx
    add eax,ecx
    add eax,[esp
    +8]
    end;

    function addFunc(pa,pb,pc,pd,pe: Integer):Integer;overload;assembler;
    asm
    add eax,edx
    add eax,ecx
    add eax,[esp
    +8]
    add eax,[esp
    +12]
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
    bSum: Byte;
    wSum: Word;
    iSum: Integer;
    begin
    bSum :
    = addFunc(1,2,3,4);
    wSum :
    = addFunc(3,4,5,6);
    iSum :
    = addFunc(10,20,30,40,50);
    ShowMessageFmt(
    'Byte Sum:%d',[bSum]);
    ShowMessageFmt(
    'Word Sum:%d',[wSum]);
    ShowMessageFmt(
    'Integer Sum:%d',[iSum]);
    end;

    function addFuncNew(pa,pb,pc,pd,pe: Integer):Integer;assembler;
    asm
    add eax,edx
    add eax,ecx
    add eax,[esp
    +8]
    add eax,[esp
    +12]
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    asm
    push ebp
    mov ebp,esp
    add esp,
    -16
    mov eax,
    10
    mov edx,
    20
    mov ecx,
    30
    push
    40 //esp := esp + 4
    push
    50 //esp := esp + 4
    call addFuncNew
    lea edx,[esp
    +4] //4,8 ok, 12:error
    call system.IntToStr
    mov eax,[esp
    +4]
    call showMessage
    add esp,
    16
    mov esp,ebp
    pop ebp
    end;

    end.
  • 相关阅读:
    mysql中的内置函数
    python之旅九【第九篇】socket
    docker的安装,升级,与删除(最新版)
    consul与docker的使用
    python之旅第八篇--异常
    python的图形模块PIL小记
    python之旅七【第七篇】面向对象之类成员
    python之旅六【第七篇】面向对象
    zabbix上监控docker
    zabbix在ubuntu16.04上的安装
  • 原文地址:https://www.cnblogs.com/Jekhn/p/1922145.html
Copyright © 2020-2023  润新知