首页 > 编程语言 >8086 汇编学习 Part 5

8086 汇编学习 Part 5

时间:2024-04-30 22:22:06浏览次数:24  
标签:汇编 8086 IP JMP 地址 Part 指令 转移 位移

流程转移

背景

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

转移指令

  • 可以控制 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 标号)
    功能 : \((IP) = (IP) + 8 位位移\)
    原理
    1. \(8 位位移 = 标号处的地址 - JMP 指令后的第一个字节的地址\)。
    2. SHORT 指明此处的位移为 8 位位移。
    3. 8 位位移的范围为 -128 ~ 127,用补码表示。
    4. 8 位位移由编译程序在编译时算出。
  2. 近转移( JMP NEAR PTR 标号)
    功能:\((IP) = (IP) + 16位位移\)
    原理
    1. \(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 位位移 = 标号处的地址 - JCXZ 指令后的第一字节的地址\)
  • 8 位位移的范围为 -128 ~ 127 ,用补码表示
  • 8 位位移由编译程序在编译时算出
  • JCXZ 是有条件转移指令
    • 所有的有条件转移指令都是短转移
    • 对 IP 的修改范围都为 -128 ~ 127
    • 在对应的机器码中包含的是转移的位移,而不是目的地址

LOOP 指令

指令格式:LOOP (标号)
指令操作:
  1. ( CX ) = ( CX ) -1
  2. 当 ( CX ) = 0 时,则程序转移到标号处指令,否则程序向下执行。
本质 :
  • 当 \((CX) \not= 0\) 时, ( IP ) = ( IP ) + 8 位位移
  • \(8 位位移 = 标号处的地址 - LOOP 指令后的第一字节的地址\)
  • 8 位位移的范围为 -128 ~ 127 ,用补码表示
  • 8 位位移由编译程序在编译时算出

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

对 IP 的修改是根据转移目的地址和转移起始地址之间的位移来进行

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

标签:汇编,8086,IP,JMP,地址,Part,指令,转移,位移
From: https://www.cnblogs.com/AlwaysBeShine/p/18168787

相关文章

  • 统一场理论公式推导和笔记——part4
    三十二,核力场的定义方程所有的场都可以通过引力场变化而得到。核力场和电磁场一样也可以用引力场的变化来表示。==》这个就非常关键了,万有引力场【简称引力场】,回忆下定义:o点在空间点p处产生的引力场A【数量为a】:a=常数乘以Δn/Δs,A=-gkΔn(R/r)/Ωr² =-gkΔnR/Ω......
  • 41天【代码随想录算法训练营34期】第九章 动态规划part03 (● 343. 整数拆分 ● 96.
    343.整数拆分classSolution:defintegerBreak(self,n:int)->int:dp=[0]*(n+1)dp[2]=1foriinrange(3,n+1):forjinrange(1,i//2+1):dp[i]=max(dp[i],(i-j)*j,dp[i-j]*j)......
  • 39天【代码随想录算法训练营34期】第九章 动态规划part02(● 62.不同路径 ● 63. 不同
    62.不同路径classSolution:defuniquePaths(self,m:int,n:int)->int:table=[[0]*n]*mforxinrange(n):table[0][x]=1foryinrange(m):table[y][0]=1foryinrange(1,m):......
  • SystemVerilog -- 6.4 Interface ~ Clocking Block Part II
    SystemVerilogClockingBlockPartII时钟模块允许在指定的时钟事件对输入进行采样并驱动输出。如果提到时钟模块的输入skew,则该模块中的所有输入信号都将在时钟事件之前以skew时间单位进行采样。如果提到时钟模块的输出skew,则该模块中的输出信号都将在相应的时钟事件之后以ske......
  • 8086 汇编学习 Part 4
    寻址方式形式名称特点意义示例[idata]直接寻址用一个常量/立即数来表示地址用于直接定位一个内存单元MOVAX,[200][BX]寄存器间接寻址用一个变量来表示内存地址用于间接定位一个内存单元MOVAX,[BX][BX+idata]寄存器相对寻址用一个变量和常量......
  • 38天【代码随想录算法训练营34期】第九章 动态规划part01 (● 理论基础 ● 509. 斐波
    理论基础斐波那契数classSolution:deffib(self,n:int)->int:ifn==0:return0ifn==1:return1returnself.fib(n-1)+self.fib(n-2)爬楼梯classSolution:defclimbStairs(self,n:int)->i......
  • Windows平台NASM汇编与C混合调用
    Windows平台NASM汇编与C混合调用tonyblackwhite之前介绍了Windows平台下,用微软宏汇编MASM与C混合调用的方法。MASM是微软独有的,Linux没法用,我喜欢学一个能够应用于两种平台的,所以还是更钟情于开源的可跨平台的NASM汇编。tonyblackwhite:Win平台最简单的方式实现C程序调用汇编函......
  • 汇编基础
    CPU结构和指令集CPU是名称为中央处理单元,简称处理器,主要的作用是从内存中读取指令,然后解码和执行。CPU架构就是CPU内部设计的结构,是一堆硬件组成,用于实现指令集所规定的操作指令集包含了一系列的操作码(opcode),以及特定的CPU执行的基本命令。如果想要设计CPU,就得先解决使用什么样......
  • 手机写操作系统之 用32位汇编指令
    手机写操作系统之用32位汇编指令编写程序kernelloader跳转到32位的kernel.asm程序kernelloader.asm,源码如下:[BITS16]jmpmaingdt_entriesequ3;共有三个段描述符:null,oscode32,osdata32peequ1......
  • java反汇编命令手册
    1.栈和局部变量操作1.1将常量压入栈的指令指令功能描述aconst_null将null对象引用压入栈iconst_m1将将int类型常量-1压入栈iconst_0将int类型常量0压入栈iconst_1将int类型常量1压入栈iconst_2将int类型常量2压入栈iconst_3将int类型常量3压入......