千哥读书笔记:汇编语言(王爽第四版)第10章 call和ret指令

本章是介绍call和ret指令,它们都是转移指令,都修改IP,或者同时修改CS和IP。它们经常被共同用来实现子程序的设计,本章内容属于汇编语言中实现子程序的基础。 由于内容也很复杂,故一步一步进行解析。

一、ret和retf指令

这两个指令相对简单:

1、ret指令用栈中的数据,修改IP的内容,从而实现近转移

CPU执行ret指令时,相当于进行:pop IP。

而栈中的数据,则由((ss)*16+(sp))决定,即:

(IP)=((ss)*16+(sp)),并且指令指针寄存器sp要自加2,即:(sp)=(sp)+2。

当然,这些操作会由CPU在执行ret指令时自动完成。

2、retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移

CPU执行retf指令时,相当于进行:

pop IP

pop CS

同理,在CUP执行reft时,会进行下面4步操作:

1)(IP)=((ss)*16+(sp))

2)(sp)=(sp)+2

3)(CS)=((ss)*16+(sp))

4)(sp)=(sp)+2

也就是说,当IP指向栈底的sp、在CUP执行reft时,会将栈底的第一个字单元的内容,出栈后赋值给IP,然后将栈底的第二个字单元的内容,赋值给CS,从而改变CS和IP的内容。

所谓的“实现近转移”(ret指令)和“实现远转移”(retf指令),区别就在于,ret指令只修改IP,而retf指令既要修改IP,还要修改CS。

二、call指令

call指令相对复杂,从对栈单元内容进行操作(push和pop)的角度来看,实际上ret指令和reft指令是call指令的逆向操作;或者说,在调用子程序的时候,先会用call指令,然后用r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值