DJ 12-3 程序控制指令

news2024/11/25 4:53:35

目录

1. 无条件转移指令 JMP

(1)段内直接转移

(2)段内间接转移

(3)段间直接转移

(4)段间间接转移

2. 条件转移指令

3. 循环控制指令

(1)LOOP 指令

(2)LOOPZ/LOOPE 指令

(3)LOOPNZ/LOOPNE 指令

4. 过程调用和返回

(1)段内直接调用

(2)段内间接调用

(3)段间直接调用

(4)段间间接调用

(5)返回指令 RET

5. 中断指令

(1)中断指令 INT

(2)中断返回指令 IRET

6. 处理器控制指令


 

1. 无条件转移指令 JMP

功能:无条件地使程序转移到指定的目标地址,并从该地址开始执行新的程序段。

目标地址 = 段地址 + 偏移地址

  • 段内转移:CS不变,仅改变IP的值。
  • 段间转移:CS、IP寄存器的内容均发生改变。

转移指令对 FLAGS 状态标志位没有影响。

(1)段内直接转移

格式:JMP  Label

执行:Label + Disp → IP

写法:JMP XXXXH

Label:段内标号,又称符号地址,它表示转移的目的地。该标号在本程序所在代码段内。

举例

指令被汇编时,汇编程序会计算出 JMP 指令的下一条指令到 NEXT 所指示的目标地址之间的位移量,即相距多少个字节单元。指令的操作是将 IP 当前值加上计算出的地址位移量 Disp 形成新的 IP,并使 CS 保持不变,从而使程序按新地址继续运行,即实现了程序的转移。

(2)段内间接转移

格式:JMP  OPRD

执行:OPRD → IP

OPRD:是通用寄存器或存储器根据相应的寻址方式,获得的一个 16 位操作数来作为转移目标的偏移地址。

例题

(3)段间直接转移

格式:JMP  FAR PTR Label(FAR PTR 使 Label 成为远标号,PTR 属性修改)

执行:段地址 → CS、偏移地址 → IP

写法:JMP XXXXH:XXXXH

Label:段间标号,又称远标号,该标号在另一个代码段内。Label 直接给出汇编程序转移时需要的 16 位段地址和 16 位偏移地址,即标号所在的代码段及其位置的偏移地址。

(4)段间间接转移

格式:JMP  OPRD

执行:OPRD(高 16 位) → CS、OPRD(低 16 位) → IP

OPRD:是一个根据寻址方式得到的 32 位存储器操作数。

因为寄存器位宽只有 16 位,所以 OPRD 不可能是寄存器操作数。

例题

注意:寄存器间接寻址只允许使用 BX、BP、SI、DI 。

2. 条件转移指令

① 根据前一条指令执行后的标志位状态来决定是否转移。

② 若满足转移条件,则转移到指定的地址;否则顺序执行下一条指令。

③ 所有的条件转移都是直接寻址方式的短转移,即只能在以当前 IP 值(转移指令的下一条)为中心的 -128 ∽ 127 字节范围内转移。

由前面关于汇编的介绍可知,汇编时将会计算位移量 Disp 。而为了缩短指令长度,只用了 8 位来存储位移量,因此转移范围为 -128 ∽ 127 字节。

④ 条件转移不影响标志位。

单一条件

复合条件

3. 循环控制指令

① 循环的次数必须先送入CX寄存器中。

② 控制转向的目标地址是以当前 IP 值(循环控制指令的下一条)为中心的 -128 ~ 127 字节范围内标号所代表的偏移地址。

③ 循环控制指令不影响状态标志位,状态标志位主要由循环控制指令之前的指令改变。

(1)LOOP 指令

格式:LOOP Label

执行:① CX - 1 → CX ② 如下

  • 若 CX ≠ 0,则 Label → IP 。
  • 若 CX = 0,则退出循环、执行下一条指令。

LOOP Label 看似等价于:

① DEC CX

② JZ Label

但实质不一样,因为 LOOP 不会改变 FLAGS 。

例题

(2)LOOPZ/LOOPE 指令

格式:LOOPZ Label 或 LOOPE Label

执行:① CX - 1 → CX ② 如下

  • 若 CX ≠ 0、ZF = 1,则 Label → IP 。
  • 若 CX = 0 或 ZF = 0,则退出循环、执行下一条指令。

FLAGS 状态标志位(ZF 位)由循环控制指令之前的指令改变。

FLAGS 状态标志位(ZF 位)由重复前缀后的串操作指令改变。

(3)LOOPNZ/LOOPNE 指令

格式:LOOPNZ Label 或 LOOPNE Label

执行:① CX - 1 → CX ② 如下

  • 若 CX ≠ 0、ZF = 0,则 Label → IP 。
  • 若 CX = 0 或 ZF = 1,则退出循环、执行下一条指令。

4. 过程调用和返回

① 调用指令 CALL

  • 保存主程序断点地址,也是返回地址
  • 子程序入口地址 → IP 或 CS 和 IP

② 返回指令 RET

  • 主程序返回地址 → IP 或 CS 和 IP

过程调用和返回与中断的区别:过程调用和返回直接得到子程序入口地址,而中断需要通过查询中断向量表来得到中断服务程序入口地址。

(1)段内直接调用

格式:CALL PROC

执行:如下

  • ① SP - 2 → SP
  • ② IP 高 8 位 → SP + 1
  • ③ IP 低 8 位 → SP
  • ④ PROC → IP

写法:CALL XXXXH

PROC:是一个近过程的符号地址,表示指令调用的过程是在当前代码段内。指令在汇编后会得到 CALL 指令的下一条指令与被调用过程的入口地址之间相差的 16 位相对偏移量。

(2)段内间接调用

格式:CALL OPRD

执行:如下

  • ① SP - 2 → SP
  • ② IP 高 8 位 → SP + 1
  • ③ IP 低 8 位 → SP
  • ④ OPRD→ IP

OPRD:是 16 位寄存器或两个存储器单元的内容。这个内容代表的是一个近过程的入口地址。若操作数 OPRD 是一个 16 位通用寄存器,则将寄存器的内容送 IP;若是存储单元,则将存储器的两个单元的内容送 IP。

(3)段间直接调用

格式:CALL FAR PTR PROC(FAR PTR 指明 PROC 是远过程,需要取 CS 和 IP)

执行:如下

  • ① SP - 2 → SP,CS →([SP + 1],[SP])
  • ② SP - 2 → SP,IP →([SP + 1],[SP])
  • ③ 段地址 → CS,偏移地址 → IP

用指令中给出的段地址取代 CS 的内容,偏移地址取代 IP 的内容。

PROC:是一个远过程的符号地址,表示指令调用的过程在另外的代码段内。

(4)段间间接调用

格式:CALL OPRD

执行:如下

  • ① SP - 2 → SP,CS →([SP + 1],[SP])
  • ② SP - 2 → SP,IP →([SP + 1],[SP])
  • ③ OPRD(高 16 位) → CS,OPRD(低 16 位) → IP

OPRD:是一个根据寻址方式而得到的 32 位存储器操作数。

(5)返回指令 RET

格式:RET

执行:

对于段内:([SP + 1],[SP])→ IP,SP + 2 → SP

对于段间:如下

  • ① ([SP + 1],[SP])→ IP,SP + 2 → SP
  • ② ([SP + 1],[SP])→ CS,SP + 2 → SP

RET 指令一般位于子程序的最后一条,不影响 FLAGS 状态标志位。

 

 

5. 中断指令

(1)中断指令 INT

中断指令用于产生软件中断,以执行一段特殊的中断处理过程。

格式:INT n

n 是中断向量码/中断类型码,取指范围为 0 ~ 255 。

中断向量地址 = n × 4

CPU 根据中断向量地址读取内存,取出中断服务子程序的入口地址。

  • 中断向量高 16 位 → CS
  • 中断向量低 16 位 → IP

操作:

TF 置为 0,即禁止单步跟踪;IF 置为 0,即关闭中断。

没有把它们放在第一步是为了防止它们修改原来的 FLAGS 。

 

 

(2)中断返回指令 IRET

中断返回指令位于中断服务子程序的最后一条,用于返回被中断的程序。  

格式:IRET

操作:

6. 处理器控制指令

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

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

相关文章

R语言中不同类型的聚类方法比较

聚类方法用于识别从营销,生物医学和地理空间等领域收集的多变量数据集中的相似对象。我们围绕聚类技术进行一些咨询,帮助客户解决独特的业务问题。它们是不同类型的聚类方法,包括: 划分方法分层聚类模糊聚类基于密度的聚类基于模…

Qt Creator 的 Shadow build(影子构建)

目录 一、什么是影子构建 二、如何取消影子构建 一、什么是影子构建 做wpf项目时,项目里面会有bin文件夹,里面有debug和release文件夹,生成的exe就在debug或release里面,但第一次做qt时,发现项目文件夹里面只有源码文…

2022 JuiceFS 社区用户调研结果出炉

为了使 JuiceFS 的发展更贴合用户的真实需求,我们在三周前向社区发出了一份调研问卷。此次调研面向已经将 JuiceFS 应用于生产环境的用户,了解其在应用 JuiceFS 前和使用中的体验与评价。 参与此次调研的用户,大型企业占比最高,有…

李炎恢ECMAScript6 / ES6+(一)

01. ECMAScript6 简介和历史 学习要点: 1.ES6 简介 2.ECMAScript 历史 3.学习和创建 Demo 本节课我们来开始了解 ECMAScript6(简称 ES6),着重了解它的标准和历史。 一.ES6 简介 ECMAScript6 简称 ES6,是 JavaScript 语言的下一…

Vue3项目引入 vue-quill 编辑器组件并封装使用

这是一款支持Vue3的富文本编辑器 GitHub地址:https://github.com/vueup/vue-quill/ VueQuill官网:https://vueup.github.io/vue-quill/ // 查看 vueup/vue-quill 版本 npm view vueup/vue-quill versions --json// 导入 vueup/vue-quill 依赖包 npm i v…

试编写算法(用C语言)打印值为x的结点的所有祖先,假设值为x的结点不多于一个。(递归实现和非递归实现)

&#xff08;一&#xff09;递归实现&#xff1a; 完整代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std;#define MaxSize 100 typedef int ElemType; typedef struct BiNode {ElemType data;BiNode* lchil…

基于springboot摄影跟拍预定管理系统设计与实现的源码+文档

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。…

最新版k8s 1.25版本安装

简介 Kubernetes&#xff08;k8s&#xff09;是自动化容器操作的开源平台。这些容器操作包括&#xff1a;部署、调度和节点集群间扩展。 具体功能&#xff1a; 自动化容器部署和复制。实时弹性收缩容器规模。容器编排成组&#xff0c;并提供容器间的负载均衡。 总而言之&…

PHP基于thinkphp的教材管理系统#毕业设计

教材是每个学生和学校都必须具备的教学资源之一,它是知识的载体,是学生汲取知识的土壤,好的教材可以做到事半功倍的效果。但是通常情况下教材都是批量进行购买和发放的,为了能够更好的对教材信息进行管理,我们通过PHP语言,thinkphp框架开发了本次的教材管理系统 教材管理系统,…

谷粒学苑_第十一天

要开始做前台部分(用户环境) 之前我们用的后台前端框架是vue-admin-template 这次的前台框架是用的NUXT 轮播图实现 显示课程和老师 redis缓存 NUXT 服务端渲染技术 解压guli_site 在这里我们使用的是成品,页面也基本写好 然后下载依赖: 开始运行: npm rum dev后面…

[附源码]Python计算机毕业设计Django高校车辆管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

力扣(LeetCode)123. 买卖股票的最佳时机 III(C++)

前后缀分解 维护前缀和数组&#xff0c;保存 111~iii 天&#xff0c;买卖一次的最大利润。维护后缀和数组&#xff0c;保存 iii~nnn 天买卖一次的最大利润。枚举所有分界点 iii &#xff0c;买卖两次的最大利润 iii 的前缀和 i\ i i 的后缀和 111~iii 天买卖一次的最大利润 i\…

Mock测试

1、什么是mock测试 Mock 测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的数据/场景&#xff0c;用一个Mock对象来创建以便测试的测试方法。 2、Mock测试常见场景 &#xff08;1&#xff09;无法控制第三方系统接口的返回&#xff0c;返回的数据不满足要…

Tomcat的安装、在idea中的使用以及创建Web项目

目录Tomcat的安装Tomcat运行Tomcat在idea中的使用创建Web项目最后Tomcat的安装 Tomcat的官网: https://tomcat.apache.org/ 从官网上可以下载对应的版本进行使用。 下载windows64位&#xff0c;版本自行选择。 下载好之后找到压缩包进行解压&#xff0c;注意目录不要有中文且…

MFC文件操作

MFC提供了一个文件操作的基类CFile&#xff0c;这个类提供了一个没有缓存的二进制格式的磁盘输入输出功能。通过他的派生类可以间接的支持文本、文件、内存文件等。 打开文件 通过对CFile类的初始化&#xff0c;即可完成文件的打开 CFile类的其中一个构造函数&#xff1a; …

【论文精读】A Survey on Deep Learning for Named Entity Recognition

A Survey on Deep Learning for Named Entity Recognition前言Abstract1. INTRODUCTION2. BACKGROUND2.1 What is NER?2.2 NER Resources: Datasets and Tools2.3 NER Evaluation Metrics2.3.1 Exact-Match Evaluation2.3.2 Relaxed-Match Evaluation2.4 Traditional Approach…

Docker学习教程

学前准备 &#x1f47f; Linux 基础 &#x1f47f; SpringBoot 基础 文章目录[toc]1. Docker 概述1.1 docker 为什么出现1.2 Docker 容器和虚拟机的不同1.3 Docker 能做什么2. Docker 安装2.1 Docker 的组成3. Docker 命令3-1 安装Nginx3-2 安装mysql3-3 安装java &#xff0c…

八、【React拓展】错误边界

理解 错误边界(Error boundary)&#xff1a;用来捕获后代组件错误&#xff0c;渲染出备用页面 如果你的组件内写了包含子组件&#xff0c;一个子组件内部发生了错误就会导致整个页面挂掉&#xff08;报错&#xff09;&#xff0c;限制这种错误影响其他组件&#xff08;就是限制…

10-18-hive-元数据及其他方式与hive交互

10-hive-元数据及其他方式访问hive&#xff1a; 使用元数据服务的方式访问 Hive (类似将hive提供了一个服务端) 1&#xff09;在hive-site.xml 文件中添加如下配置信息 <!-- 指定存储元数据要连接的地址 --> <property> <name>hive.metastore.uris</nam…

简易的shell实现

这篇文章的内容主要是利用进程的创建&#xff0c;等待&#xff0c;终止&#xff0c;替换。这些知识来实现一个自己的简易shell。 文章目录1. 大致思路2. 基本实现3. 额外拓展3.1 让文件带上颜色3.2 内建命令3.3 添加环境变量1. 大致思路 我们用了这么长的shell&#xff0c;它…