Call和ret指令

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 内存单元地址

call 和 ret 的配合使用 --> 构造子程序

posted @ 2023-04-16 16:15  TFOREVERY  阅读(85)  评论(0编辑  收藏  举报