
























我们在前面已经学习了编写有多个段的程序,但是目前学习的内容中没有可以用于在不同段之间转移的指令。下面我们学习如何在不同的段之间“跳一跳”~
offset是用于获得某标号处在内存中的偏移地址的伪指令,使用格式:
offset 标号它可以帮助我们在编程时快速调用标号的地址(否则我们需要手动数某处代码在内存中的位置,那就太麻烦了)。
所有转移指令原理相同,都是通过修改CS:IP的值实现转移(关于CS:IP详见8086CPU工作原理)。
jmp是无条件转移指令。所谓“无条件”是指跳转前不进行判断,直接转移。jmp有多种使用格式,下面分别进行说明:
jmp short 标号
jmp near ptr 标号以上二指令用于跳转到标号处(需要注意的是,本用法对应的机器码中不通过直接指定地址来进行跳转,而是通过跳转目标与当前地址的偏移差进行跳转,偏移差在编译时就已计算完成,方便兼容)。其中jmp short用于进行8位位移(即支持位移到当前指令前后范围为-128~127),jmp near ptr用于进行16位位移(即支持位移到当前指令前后范围为-32768~32767)。本指令仅修改IP的值。
jmp far ptr 标号上面的指令用于段间转移,会同时改变CS:IP的值。当目标位置与当前位置不在同段中可用本指令。
上述指令中的目标位置均在编程时指定,若转移目标的地址存放在寄存器中或内存中时,应使用下面的指令:
jmp 16位寄存器名该指令可以转移到16位寄存器中存放的地址,仅修改IP的值。
jmp word ptr 内存单元地址
jmp dword ptr 内存单元地址上面两条指令的目标地址存放在内存单元中,其中jmp word ptr用于段内转移,只修改IP的值;jmp dword ptr用于段间转移,会同时修改CS:IP的值,其中目标地址后的第一个字存放目标段地址,第二个字存放目标偏移地址。
前面的jmp指令为无条件转移指令,接下来介绍的jcxz指令为有条件转移指令。格式:
jcxz 标号jcxz为短转移指令,仅支持自身位置上下128位内的转移。jcxz会判断cx的值是否为0,若为0则转移,不为零则向下执行。
关于loop,我在之前的理解一下[bx]和loop指令中介绍过了,不再详细说明,这里再补充一下,loop也为短转移指令(同jcxz)。
转移指令在编译时的原理
我们已经知道,jmp short、jcxz等指令只支持8位位移。编译器在编译这些指令时会直接计算好偏移地址增加量,故而在debug中看不到真实地址名。同理,jmp near ptr、jmp word ptr只支持16位位移,编译器也会计算好偏移量。只有对于段间转移地址,编译器会将目标地址写入代码。
因此,当段间转移指令中的目标地址超范围时,编译器会直接报错。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。