Call指令和Ret指令讲解01 - 零基础入门学习汇编语言48
2011-01-21 02:09
781 查看
第十章: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位位移由编译程序在编译时算出。
演示:
[kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2011/01/10_依据位移进行转移的call指令.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"][/kml_flashembed]
从上面的描述中,可以看出,如果我们用汇编语法来解释此种格式的call指令。
CPU 执行指令“call 标号”时,相当于进行:
push IPjmp near ptr 标号
检测点10.2
[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy][Downlink href='http://kuai.xunlei.com/d/LZOCVNFQQEFE']视频下载[/Downlink]
相关文章推荐
- Call指令和Ret指令讲解01 - 零基础入门学习汇编语言48
- Call指令和Ret指令讲解02 - 零基础入门学习汇编语言49
- Call指令和Ret指令讲解06 - 零基础入门学习汇编语言53
- Call指令和Ret指令讲解02 - 零基础入门学习汇编语言49
- Call指令和Ret指令讲解06 - 零基础入门学习汇编语言53
- Call指令和Ret指令讲解05 - 零基础入门学习汇编语言52
- Call指令和Ret指令讲解05 - 零基础入门学习汇编语言52
- Call指令和Ret指令讲解04 - 零基础入门学习汇编语言51
- Call指令和Ret指令讲解03 - 零基础入门学习汇编语言50
- Call指令和Ret指令讲解04 - 零基础入门学习汇编语言51
- Call指令和Ret指令讲解03 - 零基础入门学习汇编语言50
- 端口01 - 零基础入门学习汇编语言67
- 寄存器(CPU工作原理)01 - 零基础入门学习汇编语言06
- 端口01 - 零基础入门学习汇编语言67
- 内中断01 - 零基础入门学习汇编语言60
- int指令01 - 零基础入门学习汇编语言64
- 寄存器(CPU工作原理)01 - 零基础入门学习汇编语言06
- [BX]和loop指令01 - 零基础入门学习汇编语言23
- 内中断01 - 零基础入门学习汇编语言60
- 更灵活的定位内存地址的方法01 - 零基础入门学习汇编语言32