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

24 篇文章 0 订阅
19 篇文章 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. 编译器有超界的校验机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值