8086汇编之 CALL 和 RET指令

本文详细介绍了8086汇编中的CALL和RET指令,包括它们与栈的关系以及如何实现近转移和段间转移。CALL指令用于函数调用,根据不同的形式,可以进行近转移或远转移,而RET指令则用于从函数返回,它从栈中恢复IP或CS/IP以完成转移。在处理寄存器冲突时,通常通过将重要数据保存到堆栈中来解决。
摘要由CSDN通过智能技术生成

Ret 和 call 也是转移指令,但是他们跟jmp不同的是,这两个转移指令都跟栈有关系。

<1> ret

用栈中的数据修改IP的地址,从而实现近转移

( ip ) = ( (ss)*16+ sp )

( sp ) =( sp ) + 2

相当于pop ip

<2>retf

用栈中的数据来修改CS以及IP的值,实现段间转移

( ip ) = ( (ss)*16+ sp )

( sp ) =( sp ) + 2

( cs ) = ( (ss)*16+ sp )

( sp ) =( sp ) + 2

相当于

Pop ip

Pop cs

<3> call xxx(行号)

先把当前IP压栈,然后跳转,相当于实现近转移

( sp ) = ( sp ) – 2

( (ss)*16+ sp ) = ( ip )

( ip ) = ( ip ) + 16位位移

相当于:

Push ip

Jmp near ptr xxx(行号)

 

<4>call far ptr

把CS,IP压栈处理,然后实现跳转,相当于段间转移,远转移

( sp ) = ( sp ) – 2

( (ss)*16+ sp ) = ( cs )

( sp ) = ( sp ) – 2

( (ss)*16+ sp ) = ( ip )

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值