8086 汇编学习 Part 5

news/2024/10/16 4:31:16

流程转移

背景

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

转移指令

  • 可以控制 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 指令转移的相对位移是不变的。
  • 这样的设计,方便了程序段在内存中的浮动装配

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/26364.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

群晖内网穿透+域名访问+PLEX APP直接访问

本文主要记录自身PLEX通过APP访问的记录,也算是一个教程。 另感谢各教程贡献者,详见参考。 本教程重点在内网穿透的域名访问内网资源。适用人员 针对无公网IP,同时PLEX安装在群晖或其它NAS上的,希望在外网使用pelx 应用访问家中资源的人(其它系统也类似,原理相同) 前期准…

用蒙特卡罗方法求p

实验任务: 基于蒙特卡罗思想用MPI程序实现对p值的并行求解 实验目的: 掌握蒙特卡罗算法并行化的实现方法 实现方法: 根据蒙特卡罗方法的思想,我们以坐标原点为圆心作一个直径为1的单位圆,再作一个正方形与圆相切,在这个正方形内随机产生count点,判断是否落在国内,将落在…

Vue入门到关门之计算属性与监听属性

一、计算属性 1、什么是计算属性 计算属性是基于其它属性计算得出的属性,就像Python中的property,可以把方法/函数伪装成属性,在模板中可以像普通属性一样使用,但它们是基于响应式依赖进行缓存的。这意味着只有在依赖的响应式数据发生改变时,计算属性才会重新计算,否则会…

使用ChatGPT自动构建知识图谱

1.概述 本文将探讨利用OpenAI的gpt-3.5-turbo从原始文本构建知识图谱,通过LLM和RAG技术实现文本生成、问答和特定领域知识的高效提取,以获得有价值的洞察。在开始前,我们需要明确一些关键概念。 2.内容 2.1 什么是知识图谱? 知识图谱是一种语义网络,它表示和连接现实世界中…

Vue入门到关门之生命周期钩子

一、生命周期钩子函数 1、什么是生命周期? 在软件开发中,"生命周期"通常指的是一个对象从创建到销毁的整个过程。在前端开发中,特别是在使用诸如Vue.js、React等框架的情况下,"生命周期"常常指的是组件或实例在其存在期间经历的一系列阶段。 在Vue.js中…

Vue入门到关门之Vue介绍与使用

一、vue框架介绍 1、什么是Vue? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链…

Vue入门到关门之指令系统

一、引入 在 Vue.js 中,指令(Directives)是一种特殊的标记,用于向 Vue 实例提供特殊的行为。指令以 v- 开头,例如 v-if、v-for 等。指令的本质就是语法糖,标志位。在编译阶段 render 函数里,会把指令编译成 JavaScript 代码。 注意:指令都是放在标签上的二、指令 1、文…

CentOS7 磁盘挂载操作

我们在使用 CentOS7 时,一般最好把数据都存放在额外挂载的磁盘上,优点就是防止系统磁盘爆满,以及防止数据丢失。 目前使用的 Linux 操作系统,也绝大部分与 CentOS7 的操作命令一样,包括一些国产 Linux 系统。 因此本篇博客以 CentOS7 为例,通过 vm 虚拟机,介绍如何通过命…