一.什么是函数??
例子:往寄存器中存值
比如以下四个指令就可以说成一个函数
二.调用一个函数
例子 如果我们调用上面四个指令集合那个函数。
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就行了
堆栈的结构是这样的