Bootstrap

【汇编】汇编中的函数

前言:本文章将讲解什么是函数,以及汇编中函数的存在形式,使用到的工具是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执行即可,观察结果如下:

 

        成功。

总结:以上便是汇编中函数的存在形式,以及如何调用函数,一定要记住函数就是一系列指令的合集,为了完成某个会重复使用的特定功能。

至此,文章介绍,感谢收看。

;