目录:https://blog.csdn.net/qq_43098197/article/details/12453240
转移指令: 可以修改 IP,或同时修改 CS 和 IP 的指令统称为转移指令。
8086CPU 的转移行为有以下几类:
- 只修改 IP,称为段内转移。
- 同时修改 CS:IP,称为段间转移。
转移指令对修改 IP 范围分类:
- 短转移:修改范围为 -128~127(8位)
- 近转移:修改范围为 -32768~32767(16位)
8-86CPU 的转移指令分类:
- 无条件转移指令
- 条件转移指令
- 循环指令
- 过程
- 中断
offset 操作符
作用: 获取标号的偏移地址。
jmp 指令
作用: 无条件转移指令,可以只修改 IP,也可以同时修改 CS:IP。
它的机器码并不包含目标地址,而是位移的位数 EB XX
,其中 XX 是偏移的位数,向前偏移为负数,使用补码表示,向后就是正数。
位移计算方式: 标号处 - jmp 指令后的第一个字节的地址。
指令分类:
-
段内短转移:
jmp short 标号
-
段内近转移:
jmp near ptr 标号
-
段间远转移:
jmp far ptr 标号
机器码:AA BB CC DD
,高地址CCDDH
是段地址,低地址AABBH
是偏移地址。
转移地址在寄存器中的指令: jmp 16位寄存器
(IP) = (16位寄存器)
转移地址在内存中的 jmp 指令:
- jmp word ptr 内存单元地址(段内转移)
- jmp dword ptr 内存单元地址(段间转移)
jcxz 指令
简介: 有条件转移指令,所有有条件转移指令都是短转移。
机器码不包含目标地址,而是位移。
格式: jcxz 标号
作用: 若 c x = 0 cx = 0 cx=0 ,则进行位移。
高级语言描述:
if(cx 寄存器的值 == 0) {
jmp short 标号; // 则进行位移
}
loop 指令
简介: 所有的循环指令都是短转移,机器码不包含目标地址,而是位移。
格式: loop 标号
作用: 先 cx–,若 c x ≠ 0 cx \neq 0 cx=0,则转移到标号处。
根据位移转移的意义
首先,它这个位置不是固定的,因为若包含地址,那么如果包含的这个地址它是无效的怎么办?或者说一开始有效,但某一时刻该地址是个无效地址怎么办?而位移,它是相对的,无论如何它都存在一个有效地址。
这是目前我对位移的意义的理解,或许不是很准确,仅供参考。
位移越界
若转移超过了指定范围,则编译时会报错,要自己注意。