汇编语言程序设计(九)转移指令的原理
目录
8086CPU转移指令分类
- 无条件转移指令,如jmp
- 条件转移指令
- 循环指令,如loop,本质也是转移指令
- 过程,类似函数
- 中断,这是个很重要的概念
offset操作符
- offset是个伪指令,作用是取得标号的偏移地址,如下例子,相当于将标号start代表的偏移地址给了ax寄存器。
![]()
jmp指令,无条件转移
- jmp无条件转移指令,可以只修改ip,也可以同时修改cs和ip
![]()
jmp short 标号,段内短转移
- 转移到标号处执行指令,实现段内短转移,其对IP修改范围为-128~127,即向前最多越过128个字节执行指令,向后转移最多越过127个字节。值得注意的是,在机器码中并不会出现标号代表的偏移地址,原理不再赘述(见下图),会用就行。
![]()
jmp near ptr 标号,段内近转移
- jmp short 标号是实现段内短转移,后者是只能转移8位地址,即256个(-128127),前者则是可以实现16位地址的转移(-3276832767),即功能完全一样,只是能够转移的距离更长了。
jmp far ptr 标号,段间转移,又叫远转移
- far ptr指明用标号的段地址和偏移地址来修改CS和IP,实现段间跳转
jmp 16位寄存器
- 16位寄存器中的数据用于修改IP,即通过修改偏移地址实现指令跳转
转移地址放在内存中的jmp指令
- jmp指令中转移地址可以通过标号给出,或放在寄存器中,当然也可以放在内存中。
jmp word ptr 内存单元地址,段内转移
- 从内存单元处取一个字的数据,作为目的偏移地址,其中内存单元地址可以用任意一种寻址方式给出。
jmp dword ptr 内存单元地址,段间转移
- 内存单元处取出两个字,第一个字的数据作为目的段地址,第二个字的数据作为目的偏移地址。
有条件转移指令jcxz与loop
jcxz指令,有条件转移
- jcxz和loop都是有条件转移指令,有条件转移指令都是段转移,在对应的机器码中包含转移的位移而不是目的地址,对偏移地址IP的修改范围是-128~127。
- 指令格式: jcxz 标号,转移条件由寄存器cx给出,如果(cx) = 0,则跳转到标号处执行。当(cx)不等于0时,程序继续向下执行,不跳转。
loop指令,段转移指令
- 对IP修改范围为-128~127,指令格式loop 标号,转移条件也是由寄存器cx给出,跟jcxz不同的是只有当cx中内容不为0时loop才正常跳转。每次跳转之后cx中的值自减1。
根据位移进行转移的意义
- jmp short 标号,jmp near ptr 标号,jcxz 标号,loop标号,这几种汇编指令对IP的修改时根据转移目的地址和转移起始地址之间的位移来进行的,即对应的机器码中不包含转移目的地址,而包含的是到目的地址的位移距离。



浙公网安备 33010602011771号