天天看點

Delphi與彙編筆記(3)------關于參數的傳遞

呵呵,說一下關于參數的傳遞問題. 

    在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中參數的傳遞方式又如何呢? 

   在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調試視窗看裡面的彙編代碼。) DelphiCode:

繼續閱讀