函数-实现五个数相加(堆栈传参)

一.什么是函数??

 例子:往寄存器中存值

比如以下四个指令就可以说成一个函数

 二.调用一个函数

 

 例子 如果我们调用上面四个指令集合那个函数。

jmp方法:jmp 00418403

   缺点 :一般不用jmp因为 调用完这个函数 程序还要接着执行,多次调用的时候容易出问题 。

call方法:call 00418403(一般用此命令) 完事ret一下就好了 调用完成

三.参数和返回值

例子:编写一个函数,能够得到任意2个数相加的值

第一步 ADD ECX,EDX(ECX+EDX完事结果放ECX里面)(写在4183FD)

第二步 MOV EAX ,ECX (虽然寄存器都是通用的,但是往往他们有特殊的含义,而EAX是存放返回值的 所以要MOV一下 把结果放到EAX中)

第三步 写一个RET 

使用函数:

MOV ECX,1 

MOV EDX,2

CALL 4183FD 

例子:如果参数很多,有十个参数该怎么办?放寄存器里放不下 了,咋办呢?

学一个方法就叫堆栈传参

堆栈就是给当前程序使用的 操作系统已经分配好了

 思路就是把参数存到堆栈中,在函数里面就可以去堆栈里面将数取出来
写法:(因为十个数太多 暂时就用5个数相加)

第一步:堆栈传参数,先PUSH压栈 再CALL调用函数

第二步:具体函数编写 

 解释一下 为什么是ESP+4   ESP+8...

因为call执行完之后是会把它下一个地址压到堆栈中 但是所以这时候不能直接取ESP,这个时候的ESP是call指令下一行的地址。

所以如何取到堆栈中的参数呢?直接ESP+4就行了

堆栈的结构是这样的

 

 

原文地址:https://www.cnblogs.com/cat47/p/12274940.html