函数调用格式为:
Call 子程序目的地址
Ret
(1)call
CPU执行call指令时,进行两步操作:
将当前的ip或cs和ip入栈
转移
Call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令类似
(2)Ret指令使用栈中的数据,修改IP内容,实现近转移
(IP)=((ss)*16+(sp))
(SP)=(sp)+2
Retf指令使用栈中的数据,修改CS和IP的内容,实现远转移
下面我们用一个程序简单演示一下函数调用前后的堆栈调用过程:
代码为:
程序编译连接之后用debug进行跟踪分析
执行完前三条代码之后,用d命令查看堆栈中内容,前三条代码执行完之后,ss:sp指向发生改变
继续执行call s指令,此时应该是当前的ip值入栈,并将ip值修改为标号处的偏移地址
Call指令读入后,(IP)=000EH,堆栈中的值也发生改变,CPU指令缓冲器中的代码为:E80500,(IP)=(IP)+0005=0013H
继续执行,ret指令读入,机器代码为C3,相当于进行pop IP,把堆栈中的000E返回继续执行mov ax,4c00h