8086 汇编学习 Part 5

发布于:2024-05-07 ⋅ 阅读:(22) ⋅ 点赞:(0)
  • 流程转移

    背景

    一般情况下指令是顺序地逐条执行的,而在实际中,常需要改变程序的执行流程。

    转移指令

    • 可以控制 CPU 执行内存中某处代码的指令。
    • 可以修改 IP ,或同时修改 CS 和 IP 的指令。

    分类

    按转移行为分类
    • 段内转移 : 只修改 IP (例如 JMP AX)
    • 段间转移 : 同时修改 CS 和 IP (例如 JMP 1000 : 0)
    根据指令对 IP 修改的范围不同分类
    • 段内短转移 : IP 修改范围为 -128 ~ 127
    • 段内近转移 : IP 修改范围为 -32768 ~ 32767
    按转移指令分类
    • 无条件转移指令 (如:JMP)
    • 条件转移指令 ( 如 : JCXZ)
    • 循环指令 ( 如 : LOOP )
    • 过程
    • 中断

    OFFSET 操作符

    功能

    取标号的偏移地址

    格式

    OFFSET ( 标号 )

    JMP 指令

    功能

    无条件转移,可以只修改 JMP,也可以同时修改 CS 和 IP

    参数
    • 转移的目标地址
    • 转移的距离
      • 段间转移(远转移):JMP 2000 : 1000
      • 段内短转移 :JMP SHORT ( 标号 ) ;IP 的修改范围为 -128 ~ 127 ,8 位的位移
      • 段内近转移 :JMP NEAR PTR (标号) ;IP 的修改范围为 -32768 ~ 32767 ,16 位的位移
    根据位移进行转移

    常见指令中的立即数均在机器指令中有所体现
    执行 JMP SHORT 指令时,IP 寄存器指向下一条指令的地址,JMP SHORT 指令通过将偏移地址加到当前 IP 寄存器上,实现下一次执行的指令为所要跳转到的指令
    Assembly3
    JMP SHORT 的机器指令中,包含的是跳转到指令的相对位置(距离当前的偏移地址),而不是转移的目标位置

    两种段内转移
    1. 短转移( JMP SHORT 标号)
      功能 : ( I P ) = ( I P ) + 8 位位移 (IP) = (IP) + 8 位位移 (IP)=(IP)+8位位移
      原理
      1. 8 位位移 = 标号处的地址 − J M P 指令后的第一个字节的地址 8 位位移 = 标号处的地址 - JMP 指令后的第一个字节的地址 8位位移=标号处的地址JMP指令后的第一个字节的地址
      2. SHORT 指明此处的位移为 8 位位移。
      3. 8 位位移的范围为 -128 ~ 127,用补码表示。
      4. 8 位位移由编译程序在编译时算出。
    2. 近转移( JMP NEAR PTR 标号)
      功能: ( I P ) = ( I P ) + 16 位位移 (IP) = (IP) + 16位位移 (IP)=(IP)+16位位移
      原理
      1. 16 位位移 = 标号处的地址 − J M P 指令后的第一个字节的地址 16 位位移 = 标号处的地址 - JMP 指令后的第一个字节的地址 16位位移=标号处的地址JMP指令后的第一个字节的地址
      2. SHORT 指明此处的位移为 16 位位移。
      3. 16 位位移的范围为 -32769 ~ 32767,用补码表示。
      4. 16 位位移由编译程序在编译时算出。
    段间转移——远转移

    FAR PTR 指明了跳转到的目的地址,即包含了标号的段地址 CS 和偏移地址 IP 。
    JMP FAR PTR 的机器指令中,包含的是转移的目标位置。

    转移地址在寄存器中的 JMP 指令
    指令格式:JMP ( 16位寄存器 )
    功能 :IP = ( 16位寄存器 )
    JMP WORD PTR 内存单元地址 JMP DWORD PTR 内存单元地址
    段内转移 段间转移
    内存单元地址处开始存放着一个字,是转移的目的偏移地址 从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址

    其他转移指令

    JCXZ 指令
    指令格式 :JCXZ (标号)
    功能 :如果 (CX) = 0 ,则转移到标号处执行,否则不进行跳转,程序继续向下执行。
    本质 :
    • 当 (CX) = 0 时, ( IP ) = ( IP ) + 8 位位移
    • 8 位位移 = 标号处的地址 − J C X Z 指令后的第一字节的地址 8 位位移 = 标号处的地址 - JCXZ 指令后的第一字节的地址 8位位移=标号处的地址JCXZ指令后的第一字节的地址
    • 8 位位移的范围为 -128 ~ 127 ,用补码表示
    • 8 位位移由编译程序在编译时算出
    • JCXZ 是有条件转移指令
      • 所有的有条件转移指令都是短转移
      • 对 IP 的修改范围都为 -128 ~ 127
      • 在对应的机器码中包含的是转移的位移,而不是目的地址
    LOOP 指令
    指令格式:LOOP (标号)
    指令操作:
    1. ( CX ) = ( CX ) -1
    2. 当 ( CX ) = 0 时,则程序转移到标号处指令,否则程序向下执行。
    本质 :
    • ( C X ) ≠ 0 (CX) \not= 0 (CX)=0 时, ( IP ) = ( IP ) + 8 位位移
    • 8 位位移 = 标号处的地址 − L O O P 指令后的第一字节的地址 8 位位移 = 标号处的地址 - LOOP 指令后的第一字节的地址 8位位移=标号处的地址LOOP指令后的第一字节的地址
    • 8 位位移的范围为 -128 ~ 127 ,用补码表示
    • 8 位位移由编译程序在编译时算出

    根据位移进行“相对”转移的意义

    对 IP 的修改是根据转移目的地址和转移起始地址之间的位移来进行
    • JMP SHORT (标号)
    • JMP NEAR PTR (标号)
    • JCXZ (标号)
    • LOOP (标号)
    • 在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移。
      • 如果 LOOP s 的机器码中包含的是 s 的地址,则就对程序段在内存中的偏移地址有了严格的限制,易引发错误
      • 当机器码中包含的是转移的位移,无论 s 处的指令的实际地址是多少,LOOP 指令转移的相对位移是不变的。
    • 这样的设计,方便了程序段在内存中的浮动装配