飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3757|回复: 3

Delphi与汇编笔记(3)------关于参数的传递

[复制链接]
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-5-1 23:45:15 | 显示全部楼层 |阅读模式
    然后再来说一下关于 在Delphi中函数调用时候参数的传递
        在C,C++等语言中函数的参数的进栈顺序是从右向左进行,比如一个函数 int Func1(int x,y),所以其入栈方式就是:
        Push  Y
        Push  X
    或者
        mov  (esp+4),Y //由于在调用函数之前会先把调用函数之后的指令地址地址入栈保存便于程序在执行完之后能够跳到正确的地方执行,入栈之后ESP减去4个字节所以,此时的栈顶指针应该增加4个字节
        mov  (esp),  X//然后入栈参数X
    然后是Call Func1,由此可见,需要使用存储器.
    关于C中的我就介绍这样多吧,呵呵,也不晓得讲的对不对,都忘记完了.

       那么在Delphi中参数的传递方式又如何呢?
       
    原文请看我的博客:
    http://blog.csdn.net/suiyunonghen/archive/2007/11/30/1909904.aspx
       在Delphi中,Delphi默认的参数传递方式是通过寄存器进行传递的.其中EAX,ECX,EDX三个寄存器用来传递参数.
       参数1------> EAX
       参数2------> EDX
       参数3------> ECX

    返回类型:
    Char,Byte                                     al 寄存器
    SmallInt , Word                               ax 寄存器
    Integer,LongWord,AnsiString,Pointer,class     eax 寄存器
    Real48                                        eax 寄存器中是栈内返回值的指针
    Int64                                         edx:eax 寄存器对
    Single,Double,Extended,Comp                   栈首寄存器ST(0) //呵呵,这个东西还没有搞明白

    下面我们来介绍几个简单的小例子:(呵呵,高手飘过)
        1.得到最大数字,一个很简单的程序
        function  Max(x,y: integer): integer;
        asm
           //前面已经说了,EAX是第一个参数,EDX是第二个参数,则可知道
           //EAX中存放的就是X的值,EDX中存放的则是Y的值,现在开始:
           cmp  EAX,EDX  //比较
           Jb   @Beleve  //小于
           ret           //否则直接返回
         @Beleve:
           mov  EAX,EDX  //EAX<EDX,所以把EDX的值放到EAX中返回   
        end;
       
       2:求和
       function sum(x,y: integer): integer;
       asm
         add  eax,edx
       end;

      3:得到第某个数字第index位上的数字是0还是1
      //这里并没有使用到Eax和Edx作为参数进行值处理,因为不好控制其分配(反正我是一下没弄清楚,呵呵,如果有兴趣的可以使用Ctrl+Alt+C打开Cpu View的Cpu调试窗口看里面的汇编代码。)
      function GetBit(index: Byte;Num: integer): byte;
      var
       msg: string;
      begin
        msg := '数字位数超界!';
        asm
          mov cl,index
          mov eax,Num
          cmp cl,32 //比较是否超过32
          ja  @ExitMsg //超过32跳到显示消息
          @cmp1:
          cmp cl,1 //是否小于1
          jae  @ValueRet//大于等于1跳到@ValueRet

          @ExitMsg:
          push eax //Eax压占保存,因为后面的Showmessage需要使用Eax传递的参数
          PUSH Msg  //将消息MSG压栈
          Pop  eax     //弹出参数到EAX中,呵呵其实直接 Mov eax,Msg效果一样
          call showmessage //调用函数显示消息
          Pop  Eax  //恢复Eax中的值
          mov  al,0
          jmp  @Compolete  //跳到完成
          @ValueRet:
          sub cl,1   //计算机中真正计位从0开始,所以减1
          shr eax,cl //右移Index
          And eax,1 //得到该位上的值
          @Compolete:
            mov @result,al
        end;
      end;

    [ 本帖最后由 suiyunonghen 于 2008-5-4 19:41 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-6-9 16:20
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    发表于 2008-6-18 08:18:46 | 显示全部楼层
    希望有更多其他精品.
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2008-6-27 11:13:23 | 显示全部楼层
    呵呵,努力把Delphi版搞起来。
    PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2021-10-2 23:26
  • 签到天数: 46 天

    [LV.5]常住居民I

    发表于 2008-7-7 01:59:20 | 显示全部楼层
    现在正在学习!期望能高牛起来!/:012 /:012 /:012
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表