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:
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;


  ,如需转载请自行联系原作者
相关文章
|
1月前
|
存储 安全 C语言
逆向汇编常见参数
逆向汇编常见参数
|
4月前
|
存储 安全 数据安全/隐私保护
Windows 32 汇编笔记(一):基础知识
Windows 32 汇编笔记(一):基础知识
|
3月前
|
存储 编译器 Linux
Windows 32 汇编笔记(二):使用 MASM
Windows 32 汇编笔记(二):使用 MASM
|
4月前
|
存储 机器学习/深度学习 芯片
8086 汇编笔记(十二):int 指令 & 端口 & 直接定址表
8086 汇编笔记(十二):int 指令 & 端口 & 直接定址表
|
4月前
|
存储 索引
8086 汇编笔记(十一):内中断
8086 汇编笔记(十一):内中断
8086 汇编笔记(十):标志寄存器
8086 汇编笔记(十):标志寄存器
8086 汇编笔记(九):call 指令 和 ret 指令
8086 汇编笔记(九):call 指令 和 ret 指令
|
4月前
|
编译器
8086 汇编笔记(八):转移指令的原理
8086 汇编笔记(八):转移指令的原理
|
4月前
|
存储 数据处理
8086 汇编笔记(七):数据处理的两个基本问题
8086 汇编笔记(七):数据处理的两个基本问题
|
4月前
|
编译器
8086 汇编笔记(六):更灵活的定位内存地址的方法
8086 汇编笔记(六):更灵活的定位内存地址的方法