【汇编】#6 80x86指令系统其二(串处理与控制转移与子函数)

文章目录

  • 一、串处理指令
    • 1. 与 REP 协作的 MOVS / STOS / LODS的指令
      • 1.1 重复前缀指令REP
      • 1.2 字符串传送指令(Move String Instruction)
      • 1.2 存串指令(Store String Instruction)
      • 1.3 取字符串指令(Load String Instruction)
    • 2. 与 REPE(REPNE)配合工作的CMPS 和 SCAS指令
      • 2.1 相等重复前缀指令 REPE/REPZ
      • 2.2 串比较指令 CMPS
      • 2.3 串搜索指令 SCAS
    • 3. 串输入输出指令 INS/OUTS
  • 二、转移指令
    • 1. 无条件转移指令JMP
    • 2. 条件转移指令
  • 三、循环指令
    • 1. 循环指令 LOOP
    • 2. (不)相等/(不)为零循环指令 LOOP(N)E/LOOP(BN)Z
  • 四、子程序
    • 1. 子程序调用CALL
      • 1.1 段内直接调用
      • 1.2 段内间接调用
      • 1.3 段间直接调用
      • 1.4 段间间接调用
    • 2. 返回指令RET


一、串处理指令

字符串操作指令的实质是对一片连续存储单元进行处理,这 片存储单元是由隐含指针DS:SIES:DI来指定的。

字符串操作指令可对内存单元按字节或字进行处理,并能根据操作对象的字节数使变址寄存器SI(和DI)增减1或2。具体规定如下:(DF控制方向)

  • 当DF=0时,变址寄存器SI(和DI)增加1或2;
  • 当DF=1时,变址寄存器SI(和DI)减少1或2。

1. 与 REP 协作的 MOVS / STOS / LODS的指令

1.1 重复前缀指令REP

重复前缀指令是重复其后的字符串操作指令,重复的次数由 CX来决定

其一般格式为:
REP MOVS / STOS / LODS
每一次循环CX=CX-1(不影响有关标志位),并执行其后的字符串操作指令,CX=0时,停止循环。

1.2 字符串传送指令(Move String Instruction)

功能:将以SI为指针的源串中的一个字节(或字)存储单元中 的数据传送至以DI为指针的目的地址中去,并自动修改指针,
使之指向下一个字节(或字)存储单元

REP MOVS:将数据段中的整串数据传送到附加段中。

  • (DS:[SI])→ES:[DI]。
  • 当DF=0时,(SI)和(DI)增量;当DF=1时,(SI)和(DI)减量。
  • 指令的格式:
    MOVS DST,SRC (需在操作数中表明数据格式)
    MOVSB (字节)
    MOVSW (字)
  • 执行 REP MOVS 之前,应先做好:
    • 源串首地址(末地址)→ SI
    • 目的串首地址(末地址)→ DI
    • 串长度 → CX
    • 建立方向标志

1.2 存串指令(Store String Instruction)

功能:将AL或AX中的数据送入ES:DI所指的目的串中的字节(或 字)存储单元中。

  • 字节操作:(AL)→[DI],字操作:(AX)→[DI]。
  • 修改指针DI,使之指向串中的下一个元素。
    当DF=0时,(DI)增量)。当DF=1时,(DI)减量。
  • 指令的格式:
    STOS DST (需在操作数中表明数据格式)
    STOSB (字节)
    STOSW (字)

1.3 取字符串指令(Load String Instruction)

功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入**AL(或AX)**中。

  • 字节操作:([SI])→AL,字操作:([SI])→AX。
  • 修改指针SI,使它指向串中的下一个元素。
    当DF=0时,(SI)增量。当DF=1时,(SI)减量。
  • 指令的格式:
    LODS SR(需在操作数中表明数据格式)
    LODSB (字节)
    LODSW (字)

2. 与 REPE(REPNE)配合工作的CMPS 和 SCAS指令

2.1 相等重复前缀指令 REPE/REPZ

一般格式为:
REPE/REPZ CMPS/SCAS

  • 判断条件:CX≠0 且 ZF=1;(CX=0或ZF=0则退出)若条件不成立,则结束重复操作,执行程序中的下一条指令;
  • 条件成立时,CX=CX-1(不影响有关标志位),并执行其后的字符串操作指令,在该指令执行完后,继续对循环条件进行判断。

存在相反指令REPNE/REPNZ,条件判断CX与上相同,ZF与上相反

2.2 串比较指令 CMPS

SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。

  • ([SI])-([DI])
  • 修改串指针,使之指向串中的下一个
    元素。当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。
  • 格式:
    • CMPSB 字节串比较
    • CMPSW 字串比较

2.3 串搜索指令 SCAS

AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存

  • 字节操作:(AL)-([DI]);字操作:(AX)-([DI])
  • 修改指针使之指向串中的下一个元素。当DF=0时,(DI)增量。当DF=1时,(DI)减量。
  • 格式:
    • SCASB 字节串搜索
    • SCASW 字串搜索

3. 串输入输出指令 INS/OUTS

INS:
将由DX寄存器指定的I/O端口中的字、字节传送到附加段中的目的串中,并根据DF和数据类型来改变目的变址寄存器的方向内容

格式:

  • INSB 字节串输入: ES:[DI] ←((DX)),
    DI←DI±1
  • INSW 字串输入: ES:[DI] ← ((DX)),
    DI←DI±2

OUTS:
将由源串中的字、字节传送到在DX寄存器指定的
I/O端口中,并根据DF和数据类型来改变源变址寄存器的
方向内容

格式:

  • OUTSB 字节串输出: ((DX))←DS:[SI]
    SI←SI±1
  • OUTSW 字串输出: ((DX))←DS:[SI]
    SI←SI±2

二、转移指令

转移指令分无条件转移指令有条件转移指令两大类。

  • 无条件转移指令包括:JMP、子程序的调用和返回指令、中断的调用和返回指令等。
  • 条件转移指令又分三大类:
    • 基于无符号数的条件转移指令
    • 基于有符号数的条件转移指令
    • 基于特殊算术标志位的条件转移指令

1. 无条件转移指令JMP

  • 段内直接短转移:JMP (SHORT) OPR
    (IP)← (IP)+ 8位位移量
  • 段内直接近转移:JMP (NEAR PTR) OPR
    (IP)← (IP)+ 16位位移量

位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移。向地址增大方向转移时,位移量为正;反之位移量为负。

  • 段内间接转移: JMP (WORD PTR) OPR
    (IP)← (EA)

将一个寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容

  • 段间直接远转移:JMP (FAR PTR) OPR
    (IP)← OPR 的段内偏移地址
    (CS)← OPR 所在段的段地址

将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值;程序跳转到新的代码段执行

  • 段间间接转移: JMP (DWORD PTR) OPR
    (IP)← (EA)
    (CS)← (EA+2)

用一个存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的字单元中的,低位字送IP寄存器,高位字送CS寄存器


2. 条件转移指令

条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位来决定是否需要转移,这就为实现多功能程序提供了必要的手段

  • 基本格式:

    • JXX LABEL条件满足,发生转移:IP←IP+位移量
      条件不满足,顺序执行指令
    • 操作数LABEL是采用短转移,称为相对寻址方式
  • 单个条件标志的设置情况转移
    在这里插入图片描述

  • 无符号数的条件转移指令
    在这里插入图片描述

  • 有符号数的条件转移指令
    在这里插入图片描述

  • 测试CX的值为0则转移指令

    • 条件转移指令中还有一条较特殊的指令,因为CX寄存器通常在程序中用做计数器,JCXZ指令就可以用来判断计数是否为0
    • 格式 :JCXZ LABEL CX=0,发生转移:IP←IP+位移量;CX≠0,顺序执行下一指令

三、循环指令

1. 循环指令 LOOP

如果(CX)≠0,转向“标号”所指向的指令,否则,终止循环,执行该指令下面的指令。

语句格式: LOOP 标号

使用LOOP指令可代替两条指令:
    DEC CX
    JNE 标号
转向的范围为-128~+127字节

2. (不)相等/(不)为零循环指令 LOOP(N)E/LOOP(BN)Z

  • 对于LOOPE/LOOPZ:
    • 语句格式: LOOPE/ LOOPZ 短标号
    • 每次循环(CX)=(CX)-1(不改变任何标志位)
      如果CX≠0且ZF=1,则程序转到循环
      体的第一条指令,否则,程序将执行该循
      环指令下面的指令。
  • 对于LOOP(N)E/LOOP(BN)Z:
    • 使用方法相同,判断条件中的ZF条件相反

四、子程序

子程序是完成特定功能的一段程序。如果某程序段在源程序内反复出现,就可把该程序段定义为子程序。这样可以缩短源程序长度、节省目标程序的存储空间,也可提高程序的可维护性和共享性。

1. 子程序调用CALL

类似但不同于JMP指令,CALL指令需要保存返回地址(调用函数时将下一指令的地址压栈)

  • 段内调用——入栈偏移地址IP:
    SP←SP-2,SS:SP←IP
  • 段间调用——入栈偏移地址IP和段地址CS:
    SP←SP-2,SS:SP←IP;
    SP←SP-2,SS:SP←CS。

1.1 段内直接调用

  • 格式:CALL DST
  • 实际步骤:
    • 将子程序的返回地址存入堆栈,以便子程序返回使用。即: (SP)←SP - 2;(SP)+1,(SP)←IP
    • 转移到子程序入口地址去继续执行子程序。指令中的DST在汇编格式指令作为子程序入口地址的符号地址(标号)。在8086机器语言中,它是一个16位的偏移量。即: (IP)←IP+ D16

在这里插入图片描述

1.2 段内间接调用

  • 格式:CALL DST
  • 主要区别是子程序的入口地址DST的寻址方式不同而已。它可以是寄存器操作数和各种寻址方式的存储器操作数,当然不允许是立即数和段寄存器操作数。
    • 例如:
      CALL BX ;BX的内容是子程序的偏移量
      CALL word ptr [BX] ;BX所指内存字单元的值是子程序的偏移量

1.3 段间直接调用

  • 格式:CALL DST
  • 执行操作:
    • SP←SP - 2;
    • (SP)+1,(SP)←CS ;
    • SP←SP - 2;
    • (SP)+1,(SP)←IP ;
    • IP ←偏移地址(指令的第2、3字节);
    • CS ←段地址(指令的第4、5字节);
      在这里插入图片描述

1.4 段间间接调用

  • 格式:CALL DST
  • 执行操作:
    • SP←SP - 2;
    • (SP)+1,(SP)←CS ;
    • SP←SP - 2;
    • (SP)+1,(SP)←IP ;
    • IP ←(EA);
    • CS ←(EA+2);
  • 主要区别是子程序的入口地址DST的寻址方式不同而已。它可以是寄存器操作数和各种寻址方式的存储器操作数,也即由各种寻址方式形成的有效地址EA和EA+1两个单元内容送入IP,EA+2和EA+3两个单元内容送入CS。
    • 例如:
      CALL DWORD PTR [BX];BX所指内存双字单元的值是子程序的偏移量和段值

2. 返回指令RET

  • 段内近返回:RET
    实际操作: (IP )← (SP)+1,(SP)
    (SP)← SP + 2
  • 段内带立即数近返回:RET EXP
    RET 可以带有一个立即数 , 堆栈指针 SP 将增加 , 即
    SP←SP+EXP。这个特点使得程序可以方便地废除若干执行CALL指令以前入栈参数。
  • 段间远返回:RET
    实际操作:(IP) ← (SP)+1,(SP)
    (SP)←(SP) + 2
    (CS)← (SP)+1,(SP)
    (SP)←(SP) + 2
  • 段间带立即数远返回:RET EXP(同段内带立即数返回)

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

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

相关文章

[华为OD]给定一个 N*M 矩阵,请先找出 M 个该矩阵中每列元素的最大值 100

题目: 给定一个 N*M 矩阵,请先找出 M 个该矩阵中每列元素的最大值,然后输出这 M 个值中的 最小值 补充说明: N 和 M 的取值范围均为:[0, 100] 示例 1 输入: [[1,2],[3,4]] 输出: 3 说…

【UE5】数字人基础

这里主要记录一下自己在实现数字人得过程中涉及导XSens惯性动捕,视频动捕,LiveLinkFace表捕,GRoom物理头发等。 一、导入骨骼网格体 骨骼网格体即模型要在模型雕刻阶段就要雕刻好表捕所需的表情体(blendshape),后面表捕的效果直…

机器学习:基于Sklearn框架,使用逻辑回归对由心脏病引发的死亡进行预测分析

前言 系列专栏:机器学习:高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学…

数据分析-----方法论

什么是数据分析方法 数据分析方法:将零散的想法和经验整理成有条理的、系统的思路,从而快速地解决问题。 案例: 用户活跃度下降 想法: APP出现问题?去年也下降了吗?是所有的人群都在下降吗&#xff1f…

vscode中新建vue项目

vscode中新建vue项目 进入项目文件夹,打开终端 输入命令vue create 项目名 如vue create test 选择y 选择vue3 进入项目,运行vue项目 输入命令cd test和npm run serve

Spark RDD

Spark RDD操作 Spark执行流程 在上一讲中,我们知道了什么是Spark,什么是RDD、Spark的核心构成组件,以及Spark案例程序。在这一讲中,我们将继续需要Spark作业的执行过程,以及编程模型RDD的各种花式操作,首…

蓝桥杯ctf2024 部分wp

数据分析 1. packet 密码破解 1. cc 逆向分析 1. 欢乐时光 XXTEA #include<stdio.h> #include<stdint.h> #define DELTA 0x9e3779b9 #define MX (((z>>5^y<<2)(y>>3^z<<4))^((sum^y)(key[(p&3)^e]^z))) void btea(unsigned int* v…

【Python 对接QQ的接口】简单用接口查询【等级/昵称/头像/Q龄/当天在线时长/下一个等级升级需多少天】

文章日期&#xff1a;2024.04.28 使用工具&#xff1a;Python 类型&#xff1a;QQ接口 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xff09;&…

纯血鸿蒙APP实战开发——监听HiLog日志实现测试用例验证

介绍 日常中在进行测试用例验证时&#xff0c;会出现部分场景无法通过判断UI的变化来确认用例是否正常运行&#xff0c;我们可以通过监听日志的方式来巧妙的实现这种场景。本示例通过监听hilog日志的回调&#xff0c;判断指定日志是否打印&#xff0c;来确定测试用例的执行结果…

Linux 第十三章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

IDEA主题美化【保姆级】

前言 一款好的 IDEA 主题虽然不能提高我们的开发效率&#xff0c;但一个舒适简单的主题可以使开发人员更舒适的开发&#xff0c;时常换一换主题可以带来不一样的体验&#xff0c;程序员的快乐就这么简单。话不多说&#xff0c;先上我自己认为好看的主题设置。 最终效果图: 原…

7.Prism框架之对话框服务

文章目录 一. 目标二. 技能介绍① 什么是Dialog?② Prism中Dialog的实现方式③ Dialog使用案例一 (修改器)④ Dialog使用案例2(异常显示窗口) 一. 目标 1. 什么是Dialog?2. 传统的Dialog如何实现?3. Prism中Dialog实现方式4. 使用Dialog实现一个异常信息弹出框 二. 技能介…

白话机器学习1:分类问题中的评价指标

机器学习中的评价指标非常多&#xff0c;它们用来衡量模型的性能和预测能力。不同类型的机器学习任务可能需要不同的评价指标。以下是一些常见的评价指标&#xff0c;按照不同类型的机器学习任务分类&#xff1a; 对于分类问题&#xff1a; 准确率&#xff08;Accuracy&#…

百度竞价开户详解:步骤、优势与注意事项

随着互联网的普及&#xff0c;网络营销已成为企业不可或缺的一部分。其中&#xff0c;百度竞价作为一种高效的网络推广方式&#xff0c;受到了越来越多企业的青睐。本文将详细介绍百度竞价开户的流程、优势以及注意事项&#xff0c;帮助企业更好地利用这一工具提升品牌知名度和…

ubuntu安装Anaconda安装及conda使用

一. 安装anaconda3详细教程 1、下载镜像 清华大学开源软件镜像站下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下拉到最低端选择Linux&#xff0c;选择最新版&#xff08;32/64位&#xff09;下载。这里我下载的是版本Anaconda3-4.3.30-Linux…

Spire.PDF for .NET【文档操作】演示:创建 PDF/A 并插入图像的超链接

PDF/A 广泛用于 PDF 格式的长期归档。通过使用Spire.PDF&#xff0c;您可以直接创建PDF/A文件。本文主要介绍如何建立PDF/A文件&#xff1b;它还将演示如何在 C# 中添加图像和插入图像的超链接。 确保Spire.PDF for .NET&#xff08;版本 2.9.43 或更高版本&#xff09;已正确…

TikTok引流中海外云手机的实用功能分享

在当下&#xff0c;TikTok已成为全球范围内最受欢迎的社交媒体平台之一&#xff0c;拥有着庞大的用户群体和潜在的商业机会。为了在TikTok上实现更好的引流效果&#xff0c;利用海外云手机成为了一个明智的选择。接下来&#xff0c;我们将深入探讨海外云手机的功能以及它如何助…

神经网络的反向传播

梯度下降算法 &#x1f525;我们来看一下神经网络中的梯度下降算法&#x1f525; 梯度下降法是一种优化算法&#xff0c;用于寻找目标函数的最小值。梯度是一个向量&#xff0c;表示某一函数在该点处的方向导数沿着该方向取得最大值&#xff0c;即函数在该点处变化最快的方向…

IDEA 开发找到 java-web 发布到 tomcat 的路径

使用 IDEA 开发 java web 应用&#xff0c;有没有遇到需要找到 tomcat 路径的问题 为什么要找 tomcat 路径呢&#xff1f; 拿我的项目来举例&#xff0c;有统一的线上线下 logback.xml 配置&#xff0c;配置时业务、框架日志输出到 file&#xff0c;少量的启动日志输出到 con…

基于MATLAB野外观测站生态气象数据处理分析

朱老师(副教授)&#xff1a;来自国内重点高校&#xff0c;长期从事野外观测站生态气象监测与评估研究&#xff0c;发表SCl论文多篇&#xff0c;主持国家与地方科研项目多个,在生态环境数据处理与分析中具有丰富的实践项目经验。 以野外观测站高频时序生态气象数据为例&#xff…
最新文章