第九章:转移指令的原理04
让编程改变世界
Change the world by program
根据位移进行转移的意义
前面我们讲到:
jmp short 标号
jmp near ptr 标号
jcxz 标号
loop 标号
等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。
在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离。
这样设计,方便了程序段在内存中的浮动装配。
例如:
[caption id="attachment_364" align="aligncenter" width="243"]
![根据位移进行转移的意义](http://blog.fishc.com/wp-content/uploads/2011/01/1.gif)
根据位移进行转移的意义[/caption]
这段程序装在内存中的不同位置都可正确执行,因为 loop s 在执行时只涉及到 s的位移( - 4,前移 4个字节,补码表示为FCH),而不是s的地址。
如果loop s的机器码中包含的是s的地址,则就对程序段在内存中的偏移地址有了严格的限制。
因为机器码中包含的是 s 的地址,如果 s 处的指令不在目的地址处,程序的执行就会出错。
而loop s的机器码中包含的是转移的位移,就不存在这个问题了。
因为,无论 s处的指令的实际地址是多少,loop指令的转移位移是不变的。
编译器对转移位移超界检测
注意,根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错。我们来测试一下!
注意:
我们在第2章中讲到的形如“jmp 2000:0100”的转移指令,是在 Debug 中使用的汇编指令,汇编编译器并不认识。
如果在源程序中使用,编译时也会报错。
实验八
分析一个奇怪的程序!(利用转移原理“玩”系统一下~)
实验九
根据材料编程(第一次——黑底白字下终于有了色彩!)
[buy]
获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/LSAQUKWZODLD']视频下载[/Downlink]
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步