当前位置: 代码迷 >> 综合 >> 八.汇编-转移指令的原理
  详细解决方案

八.汇编-转移指令的原理

热度:85   发布时间:2023-09-05 17:41:25.0

可以修改IP,或者同时修改CS和IP的指令统称为转移指令。或者说转移指令就是可以控制CPU执行内存中某处代码的指令。

8086CPU 转移行为可以有以下几类

  • 指修改IP,称段内转移,如 jmp ax
  • 同时修改CS 和IP ,称为段间转移,如。jmp 1000:0
  • 短转移的IP的修改范围 -128-127
  • 近转移IP的修改范围-32768-32767

8086CPU的转移指令分为

  • 无条件转移 jump
  • 条件转移
  • 循环指令 loop
  • 过程
  • 中断

1. 操作符 offset

a. 取得标号的偏移地址。

2. jmp 指令

a. jmp 无条件转移指令,可以只修改IP,也可以同时修改 CS 和IP。

3. 依据位移进行转移的jmp指令

a. jmp short 标号(转移到标号处执行指令)
这种格式是段内转移,对IP的修改范围是-128-127.

注意:CPU在执行jmp 指令的时候并不需要转移的目的地址。
b . 转移指令并没有告诉CPU 要转移的目的地址,却告诉了CPU要转移的位移,通过与当前的偏移地址来确定要转移的目的地址。所以在jmp short 标号 指令对应的机器码中并不需要饱含转移的目的地址,而包含的是转移的位移。
c. 这里所说的位移,就是编译器根据汇编指令中的标号来计算出来的。
下图为转移及算法方法示例图
八.汇编-转移指令的原理

d.jmp near ptr 标号,该指令格式实现的是段内转移。范围为 -32768-32767

4. 转移的目的地址在指令中的 jmp 指令

a. amp far ptr 标号,该指令实现的是段间转移,又称为远转移。

5.转移地址在寄存器中的jmp 指令

指令格式 jmp 16位 reg
功能: (IP)= (16位reg)

6. 转移地址在内存中的jmp 指令

a. 转移地址在内存中的 jmp 指令有两种格式

  1. jmp word ptr 内存单元地址: 功能上从内存单元地址处开始放着一个字,是转移的目的偏移地址,内存单元地址可用寻址方式的任一格式给出。
  2. jmp dword ptr 内存单元地址(段间转移):功能上从内存单元地址处存放着两个字,高地址处的字是转移的目的段地址,低地址处的是转移的偏移地址。(CS= 内存单元地址+2, IP = 内存单元地址)

7. jcxz 指令

a. jcxz 指令为有条件转移指令,所有的有条件转移指令都是短转移,在赌赢的机器码中饱含转移位移,而不是目的地址。对IP的修改范围为:-128-127。

8.loop 指令

a. loop 指令为循环指令,所有的循环指令都是短指令,对应的机器码中饱含转移的位移,而不是目的地址。对IP的修改范围为 -128-127。

9. 根据位移进行转移的意义

a.如果是以目的地址,如果目的地址处的对应指令不存在,程序的执行就会出错。而通过位移进行转移就不存在这个问题了,因为无论对应指令的实际地址是多少,loop指令的转移位移都不会变。(避免写死地址,而写死的目的地址不是对应的指令)

10. 编译器对转移位移超界的检测

a. 根据位移进行转移的指令,它们的转移范围受到了转移位移的限制。如果在源程序中转移范围的超界的问题,在编译的时候,编译器就会报错。

b. 编译器有超界的校验机制。

  相关解决方案