一、
ret指令:
通过栈中的数据(ss:sp)修改ip(cs:ip)的内容,实现近转移
ret指令
等价于
pop ip
(ip)=((ss)*16+(sp))
(sp)=(sp)+2
retf指令:
通过栈中的数据(ss:sp)修改cs和ip中的内容,实现远转移
retf指令
等价于
pop ip
pop cs
(ip)=((ss)*16+(sp))
(sp)=(sp)+2
(cs)=((ss)*16+(sp))
(sp)=(sp)+2
二、
call s指令:
将当前ip(cs:ip)的值压入栈(ss:sp)中并转到标号处执行指令(段内转移)
call s指令
等价于
push ip
jmp near ptr s
(sp)=(sp)-2
((ss)*16+sp)=(ip)
(ip)=(ip)+16位位移
16位位移=call s指令的下一处地址与标号s处的地址的差值
call far ptr s指令:
将当前cs和ip的值压入栈(ss:sp)中并转到标号处执行指令(段间转移)
机器码保存标号处的段地址与偏移地址
call far ptr s指令
等价于
push cs
push ip
jmp far ptr s
(sp)=(sp)-2
((ss)*16+sp)=(ip)
(sp)=(sp)-2
((ss)*16+sp)=(cs)
(cs)=s段地址
(ip)=s偏移地址
三、
ret指令与call指令结合
call:保存当前程序执行当前位置指针(cs:ip),使得cpu去执行标号s处程序
ret:从栈中获取上一个程序暂停时位置指针,使得cpu继续从上次程序执行的位置继续执行
这种特性使得我们可以在执行一段程序期间执行子程序,但由于执行子程序可能会改变原程序的数据,所以在调用子程序时需要将原程序数据进行保存(用栈保存),并在子程序运行完毕时从栈中恢复原程序的数据(原程序在寄存器或内存中的值)