call 和 ret 指令都是转移指令,都是修改IP,或者同时修改 CS 和 IP
ret指令
利用栈中的数据,修改IP的内容,从而实现近转移
格式 ret(即可)
注意,在使用ret指令后,sp的值会改变,相当于说 pop 掉了一个数据,IP的值是直接被栈中的数据覆盖的。(指向哪,就拿哪的数据)
相当于 pop ip
retf
利用栈中的数据,修改CS和IP的内容,从而实现远转移
格式 retf(即可)
注意,使用retf指令时,第一个从栈中出来的数据是给IP的,第二个是给CS的,相当于pop两次数据
相当于 pop ip 和 pop cs
call指令
(1)将当前的ip 或者 cs和ip 压入栈中
(2)转移(jmp)
call指令不能实现短转移,其实现转移的方法和jmp指令原理相同(即都是依靠位移转移)
格式:
(1)call 标号 --> 将当前的语句的下一条指令的ip压入栈后,转移到标号处执行指令
(2)call far ptr 标号 --> 实现段间转移 --> 先将cs压入栈,再将当前的语句的下一条指令的ip压入栈,然后 cs = 标号的段地址,ip = 标号的偏移地址(jmp far ptr 标号)
(3)call 16位寄存器 --> 将当前的语句的下一条指令的ip 压入栈,后ip = 寄存器里所存的值(jmp 16位寄存器)
(4)call word ptr 内存单元地址 --> 将当前的语句的下一条指令的ip压入栈中,后jmp word ptr 内存单元地址
(6)call dword ptr 内存单元地址 --> 先将当前cs压入栈中,然后将当前的语句的下一条指令的ip压入栈中,后jmp dword ptr 内存单元地址