第九章:转移指令的原理04
让编程改变世界
Change the world by program
根据位移进行转移的意义
前面我们讲到:
jmp short 标号
jmp near ptr 标号
jcxz 标号
loop 标号
等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。
在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离。
这样设计,方便了程序段在内存中的浮动装配。
例如:
[caption id="attachment_364" align="aligncenter" width="243"]

根据位移进行转移的意义[/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]