[汇编学习笔记][第九章转移指令的原理]

第九章 转移指令的原理

分类

  • jmp转移行为

    • 段内转移
      • 短转移 IP修改范围-128~127
      • 近转移 IP修改范围-32768~32768
    • 段间转移
  • 几个其余转移

    • 无条件转移(如:jmp)
    • 条件转移
    • 循环指令(如:loop)
    • 过程
    • 中断

通过深入理解转移指令jmp来理解CPU执行转移指令的基本原理

9.1 操作符offset

操作符offset是伪指令,取得标号的偏移地址。

还可以在标号出现之前使用,反正标号最后由编译器统一处理

9.2 jmp指令

两种语法

  • 转移目的地址
  • 转移的距离

9.3 根据位移进行的jmp指令

jmp short 标号(转到标号处执行指令)
  • 标号会被编译器翻译为IP

  • CPU在执行jmp指令的时候并不需要转移的 目标地址

  • jmp short 标号指令所对应的机器码中,不包含转移的地址,而包含的是转移的位移

    这个位移是编译器根据标号计算出来的

  • 所以jmp short 标号的功能为:(IP)=(IP)+8位位移(-128~127)

    1. 8位位移=标号地址-jmp指令后的第一个字节的地址
    2. short表明为8位位移,负数用补码表示
  • 还有一种jmp near ptr 标号的功能为:(IP)=(IP)+16位位移

    1. 16位位移=标号地址-jmp指令后的第一个字节的地址
    2. near ptr 表示段内近转移

9.4 根据目的进行的jmp指令

  • jmp far ptr 标号

  • 标号会被编译器翻译为CS:IP

  • 在机器指令中也是用CS:IP来指定目标地址,而不是通过位移

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

  • jmp 16位reg
  • (IP)=(16位reg)

  • 与之对应的机器指令有什么含义?

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

  • jmp word ptr 内存单元地址(段内转移)

    使IP=[内存单元地址],因为IP是一个word,所以必须要jmp word,没有jmp byte

  • jmp dword ptr 内存单元地址(段间转移)

    内存单元存放两个字,高地址表示段地址,低地址表示偏移地址

    • CS=(内存单元)+2
    • IP+(内存单元)

9.7 jcxz指令

jcxz 指令为有条件转移指令,所有的有条件转移指定都是 短转移
对IP的修改范围位-128~127

  • 格式:jcxz 标号
  • 操作: 当(cx)=0 时,IP=(IP)+8位位移
  • 等于

    if((cx)==0)
        jmp short 标号

9.8 loop指令

loop 指令为循环指令,所有的循环指令都是短转移

  • 格式 loop 标号
  • 操作:

    • (cx)=(cx)-1
    • 如果(cx)!=0 ,(IP)=(IP)+8位位移
  • 等于

    (cx)--;
    if((cx)!=0)  jmp short 标号

9.9 根据位移进行转移的意义

有利于程序段在内存中的浮动装配,是的程序段加载到内存什么位置都没有问题

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

如果转移范围超界,编译的时候,编译器会报错。

原文地址:https://www.cnblogs.com/zy691357966/p/5480518.html