Call指令和Ret指令讲解01 – 零基础入门学习汇编语言48

第十章:Call指令和Ret指令讲解01

让编程改变世界

Change the world by program

引言

想想程序之间的加载返回过程。

call和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。

它们经常被共同用来实现自程序的设计。

这一章,我们讲解call和ret 指令的原理。

ret指令和retf指令

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

CPU执行ret指令时,进行下面两步操作:

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

(sp)=(sp)+2

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

CPU执行retf指令时,进行下面两步操作:

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

(sp)=(sp)+2

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

(sp)=(sp)+2

可以看出,如果我们用汇编语法来解释ret和retf指令,则:

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

pop IP

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

pop IP

pop CS

分析源码

ret指令(源代码下载)

程序中ret指令执行后,(IP)=0,CS:IP指向代码段的第一条指令。

retf指令(源代码下载)

程序中retf指令执行后,CS:IP指向代码段的第一条指令。

检测点10.1

call指令

call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:

将当前的 IP 或 CS和IP 压入栈中

转移(jmp)

call 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同。

下面的几个小节中 ,我们以给出转移目的地址的不同方法为主线,讲解call指令的主要应用格式。

依据位移进行转移的call指令

call 标号(将当前的 IP 压栈后,转到标号处执行指令)

CPU执行此种格式的call指令时,进行如下的操作:

(1) (sp) = (sp) – 2

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

(2) (IP) = (IP) + 16位位移

call  标号

16位位移=“标号”处的地址-call指令后的第一个字节的地址

16位位移的范围为 -32768~32767,用补码表示

16位位移由编译程序在编译时算出。

演示:

       

       

        -->

       

               

       

               

宽客网,量化投资,宽客俱乐部

        -->

       

       

从上面的描述中,可以看出,如果我们用汇编语法来解释此种格式的call指令。

CPU 执行指令“call 标号”时,相当于进行:

push IP

jmp near ptr 标号

检测点10.2

视频下载
技术, IT技术, 汇编语言, 视频教程


风险提示及免责条款

市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部