当前位置: 网学 > 编程文档 > 汇编语言 > 正文

高级语言反汇编程序的函数调用过程

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式

Jim Chan

摘要:本文说明高级语言编译成汇编语言后,高级语言中函数调用的汇编程序过程。

正文:高级语言编译成汇编程序以后,在高级语言中的函数调用的汇编程序过程如下:

1.将函数参数入栈,第一个参数在栈顶,最后一个参数在栈底。

2.执行CALL指令,调用该函数,进入该函数代码空间。
a.执行CALL指令,将CALL指令下一行代码的地址入栈。
b.进入函数代码空间后,将基址指针EBP入栈,然后让基址指针EBP指向当前堆栈栈顶,并使用它访问存在堆栈中的函数输入参数及堆栈中的其他数据。
c.堆栈指针ESP减少一个值,如44H,向上移动一个距离,留出一个空间给该函数作为临时存储区。
{
   // 以上准备工作做好后,函数正式被执行,如下所示。
   d.将其他指针或寄存器中的值入栈,以便在函数中使用这些寄存器。
   e.执行代码。
   f.执行return()返回执行结果,将要返回的值存入EAX中。
   g.步骤2.d中的指针出栈。
}
h.将EBP的值传给堆栈指针ESP,使ESP复原为2.c之前的值。此时进入函数时EBP的值在栈顶。
i.基址指针EBP出栈,复原为2.b之前的EBP的值。
j.执行RET指令,“调用函数”的地址出栈,本函数返回到CALL指令的下一行。

3.函数返回到CALL指令下一行,将堆栈指针加一个数值,以使堆栈指针恢复到以上步骤1执行之前的值。该数值是上面第一步入栈参数的总长度。

注意:
1.堆栈指针ESP指向栈顶的新入栈数据的最低位。
2.MOV指令中偏移指针指向被“MOV”的数据的最低位。如下面指令是将ebp+8到ebp+11四个字节的内容传到eax寄存器中。
00402048   mov         eax,dword ptr [ebp+8]

一个例子如下:

高级语言代码中的函数调用如下:

117:      bR = t1(p);

汇编代码如下:

00401FB8   mov         ecx,dword ptr [ebp-8]   ;将参数放入ecx寄存器
00401FBB   push        ecx                     ;参数入栈
00401FBC   call        @ILT+10(t1) (0040100f)  ;函数调用,下一行地址00401FC1入栈
00401FC1   add         esp,4                   ;函数返回,堆栈指针加4,复原为00401FB8时的值
00401FC4   mov         dword ptr [ebp-10h],eax ;从eax中取出高级语言中的函数返回值,放入bR变量中

其中t1函数如下:

125:  BOOL t1(void* p)
126:  {
00402030   push        ebp                    ;ebp入栈
00402031   mov         ebp,esp                ;ebp指向此时堆栈的栈顶
00402033   sub         esp,44
  • 上一篇资讯: 用汇编破解cmos密码
  • 下一篇资讯: 如何产生一个BMP文件
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号