8086CPU-汇编指令ret与call

一、
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继续从上次程序执行的位置继续执行

这种特性使得我们可以在执行一段程序期间执行子程序,但由于执行子程序可能会改变原程序的数据,所以在调用子程序时需要将原程序数据进行保存(用栈保存),并在子程序运行完毕时从栈中恢复原程序的数据(原程序在寄存器或内存中的值)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值