前言:本文章将讲解什么是函数,以及汇编中函数的存在形式,使用到的工具是DTDEBUG。
1、什么是函数?
在汇编中,函数就是一系列指令的合集,为了完成某个会重复使用的特定功能。
下面这四行指令就算是一个函数了:
该函数的功能就是往寄存器里赋值。
2、如何调用函数?
什么是调用函数?
首先需要保证,调用函数就该有返回操作,也就是说,我们执行完函数中的指令之后,应该返回到原来调用该函数的指令地址的下一条继续执行。所以有如下两种方法实现函数返回:
<1>使用jmp指令实现函数返回
我们可以在EIP对应的地址写入jmp指令,跳转到函数执行地,然后执行完函数中的指令之后,再次使用jmp调回来,如下:
通过两条jmp指令,我们就可以实现简单的函数调用和返回了,但是不推荐使用JMP指令。
原因:假设,我们在下面还有一个地方需要调用这个函数呢?因为我们也说了,函数就是为了完成某个会重复使用的功能,所以如果发生如下情况,jmp就不好使了。
所以不推荐使用JMP指令调用函数。
<2>使用call指令调用函数
通过上面的操作,即使再加一个call调用,遇到ret还是返回到当前call指令的下一步继续执行,所以call指令+ret指令简直就是完美的函数调用指令。
3、封装任意两数相加的函数
我大致讲一下通用寄存器大多数的用途:
目前本教程不讨论这些,关于寄存器以后会继续发文章。
所以我将使用ecx,edx作为函数参数,将两数之和存入eax中,如下:
这就是函数的内容,没有想象的那么复杂吧。
调用函数:
一个call指令就够了。
函数传参:
假设我们要做的是计算1+2,那么在调用函数前将1存入ecx,2存入edx就行了,如下:
下面单步步过F8执行即可,观察结果如下:
成功。
总结:以上便是汇编中函数的存在形式,以及如何调用函数,一定要记住函数就是一系列指令的合集,为了完成某个会重复使用的特定功能。
至此,文章介绍,感谢收看。