1.函数:
函数就是一系列指令的集合,为了完成某个会重复使用的特定功能。
比如:MOV EAX,1 MOV ECX,1 就相当于一个函数(指令的集合)
2.函数的调用:
(1)使用JMP来执行函数
使用JMP执行函数的话,JMP跳转到相应的指令后指令指针不再返回到原来位置的下一位:
(2)使用CALL来执行函数
以四条指令向普通寄存器存储值为例:
CALL执行前:
CALL执行后(F8):
可以看到CALL指令把当前指令的下一条指令推入栈中,在执行完四条指令后,RETN回到了当前指令的下一条指令。执行顺序并没有改变。
3.参数、返回值
汇编中EAX通常用来存储函数的返回值的。
实现一个简单的加法函数:
方法如下:
(1)定义三条指令:
- 将ECX,EDX中的值相加;(参数)
- 将相加的值放到EAX中;
- 返回
(2)调用函数:
- 先向ECX,EDX中存入要加的两个数;
- 使用CALL调用对应方法;
F8逐步执行结果:
EAX中存储的就是相加的结果
3.堆栈传参
当参数过多,寄存器不够用可以使用堆栈传参:
以一个累加的函数为例:
(1)再CALL函数之前,先向堆栈中push5个数:
(2)执行前先将EAX中的值清零
(3)F7逐步执行结果: