【汇编】#5 80x86指令系统其一(数据传送与算术)

文章目录

  • 一、数据传送指令
    • 1. 通用数据传送指令
      • 1.1 MOV传送指令
        • tips:MOV指令几条特殊规定
      • 1.2 XCHG交换指令
      • 1.3 进栈指令PUSH
      • 1.4 出栈指令POP
      • 1.5 所有寄存器进出栈指令PUSHA/POPA
        • tips:SP特别处理
    • 2. 累加器专用传送指令
      • 2.1 输入指令IN
      • 2.2 OUT输出指令
      • 2.3 IO端口与8086CPU通讯关系
      • 2.4 XLAT 换码指令
    • 3. 地址传送指令
      • 3.1 有效地址送寄存器指令LEA (Load Effective Address)
      • 3.2 指针送寄存器及相应段寄存器指令LDS和LES
      • 3.3 标志寄存器传送指令
  • 二、算术运算指令
    • 1. 加法指令
    • 2. 减法指令
    • 3. 乘法指令
    • 4. 除法指令
    • 5. 类型转换指令指令
    • 6. 十进制调整指令
      • 6.1 压缩的BCD码调整指令
      • 6.2 非压缩的BCD码调整指令


一、数据传送指令

数据传送指令负责把数据、地址或立即数传送到寄存器、存储器或端口号寄存器。它相对高级语言里的赋值语句。

  • 通用数据传送:MOV、XCHG、PUSH、POP

  • 累加器专用传送(输入输出):IN、OUT、XLAT

  • 地址传送:LEA、LDS、LES

  • 标志寄存器传送:LAHF、SAHF、PUSHF、POPF

1. 通用数据传送指令

1.1 MOV传送指令

把源操作数(第二操作数)的值传给目的操作数(第一操作数)该操作数的寻址方式可以是任意一种存储单元寻址方式

格式:MOV Reg/Mem,Reg/Mem/Imm

  • Reg—Register(寄存器)
  • Mem—Memory(存储器)
  • Imm—Immediate(立即数)
tips:MOV指令几条特殊规定
  1. 两个操作数的数据类型要相同,如:MOV BL,AXMOV AX,BL等都是不正确的;
  2. 两个操作数不能同时为段寄存器,如:MOV ES,DS等;
  3. 代码段寄存器CS不能为目的操作数,但可作为源操作数, 如:指令MOV CS, AX等不正确,但指令MOV AX,CS 等是正确的;
  4. 立即数不能直接传给段寄存器, 如:MOV DS,100H等;
  5. 立即数不能作为目的操作数,如:MOV 100H,AX等;
  6. 指令指针IP,不能作为MOV指令的操作数
  7. 两个操作数不能同时为存储单元,如:MOV VARA,VARB等,其中VARA和VARB是同数据类型的内存变量

1.2 XCHG交换指令

可以将一个字节或一个字的源操作数与目的操作数相交换。交换能在通用寄存器之间、通用寄存器与存储器之间进行。但段寄存器和立即数不能作为一个操作数

格式:XCHG OPD,OPS
eg:
(AL)=2AH,(DS)=1000H, (1204DH)=5BH,指令XCHG AL,[204DH]执行后,(AL)=5BH,(AL)=2AH


1.3 进栈指令PUSH

将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2(栈向低地址增长,且由于小端对齐,先高8位数据进栈,然后低8位数据进栈

格式:PUSH Reg/Mem/Seg

在这里插入图片描述


1.4 出栈指令POP

将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。 (先低8位数据出栈,然后高8位数据出栈 )

格式:POP Reg/Mem/Seg
过程逆向PUSH即可


1.5 所有寄存器进出栈指令PUSHA/POPA

  • PUSHA:16位通用寄存器依次进栈,次序为AX、CX、DX、BX(不是ABCD!!),指令执行前的SP、BP、SI、DI。
    指令执行后(SP)-16→(SP),SP仍指向栈顶。
  • POPA:16位通用寄存器依次出栈,次序为DI、SI、BP、SP,指令执行前的BX、DX、CX、AX。
    指令执行后(SP)+16→(SP) ,SP仍指向栈顶

格式:PUSHA/POPA

tips:SP特别处理

SP出栈只是修改了指针,使其后的BX能够出栈,而堆栈中原先由PUSHA指令存入的SP的原始内容被丢弃,并未真正送到SP寄存器中。


2. 累加器专用传送指令

仅限于使用累加器AX或AL传送信息

2.1 输入指令IN

输入指令用来从指定的外设寄存器取信息送入累加器

Func:从端口中读入一个字节或字(取决于寄存器),并保存在寄存器AL或AX中。如果某输入设备的端口地址0~255范围之内,那么,可在指令IN中直接给出,否则,要把该端口地址先存入寄存器DX中,然后在指令中由DX来给出其端口地址

格式:

  • 长格式IN AL, PORT (字节)/IN AX, PORT (字)
  • 短格式IN AL, DX (字节)/IN AX, DX (字)

eg:
IN DX,2F8H不可,需要先MOV DX,2F8H再 进行IN指令

  • IN AL,DX;从端口2F8H读入一个字节到AL中
  • IN AX,DX;把端口2F8H、2F9H按“高高低低”组成
    的字读入AX

2.2 OUT输出指令

把累加器的内容送往指定的外设存储器

将寄存器AL或AX的内容输出到指定端口。如果某输出设备的端口地址在0~255范围之内,那么,可在指令OUT中直接给出,否则,要把该端口地址先存入寄存器DX中,然后在指令中由DX来给出其端口地址。

类似IN指令


2.3 IO端口与8086CPU通讯关系

所有I/O端口与CPU之间的通信都由IN和OUT指令来完成。外部设备最多有65536个I/O端口,端口号为0000~0FFFFH。

  • 前256个端口(00~0FFH)可以直接在指令中指定,这就是所谓的长格式
  • 当端口号≥256时,只能使用短格式,此时必须先将端口号放到DX寄存器中(端口号为0000~0FFFFH),然后再用IN和OUT指令来传送信
    息。
  • 注意:这里的端口号或DX的内容均为地址,而传送的是端口中的信息,在使用短格式时,DX内容才是端口号本身

2.4 XLAT 换码指令

XLAT指令有两个隐含操作数BX和AL

Function:把BX的值作为内存字节数组首地址、下标为AL的数组元素的值传送给AL。

格式:XLAT OPRXLAT

eg:
若(BX)=0040H
MOV AL,3
XLAT则指令执行后AL的值为33H
在这里插入图片描述

tips:可用来查表或访问数组,但表和数组的长度不能超过256.


3. 地址传送指令

3.1 有效地址送寄存器指令LEA (Load Effective Address)

Function: 将源操作数的有效地址送到指定的寄存器中。

格式:LEA REG,OPS

tips

  • 源操作数必须是一个内存操作数
  • 目的操作数必须是一个16位的通用寄存器。这条指令通常用来建立串操作指令所须的寄存器指针。
  • OPS不允许是直接地址。如lea bx,[2000h]。但可以使用符号地址,如 lea bx,varx 。

3.2 指针送寄存器及相应段寄存器指令LDS和LES

LDS_Function:

  • 完成一个地址指针的传送。地址指针包括段地址部分和偏移量部分。指令将段地址(EA+2)送入DS,偏移量部分(EA)送入一个16位的基址寄存器或变址寄存器

LES_Function:

  • 将地址指针的段地址部分送入ES外,与LDS类似

格式为: LDS/LES REG,OPS

tips:

  • 源操作数是一个内存操作数
  • 目的操作数是一般基址寄存器或变址寄存器。(其它16位寄存器也可以,但不能是段寄存器)例如:LDS SI,[BX] ;将把BX所指的32位地址指针的段地址部分送入DS,偏移量部分送入SI。
  • 本组指令不影响标志位。

3.3 标志寄存器传送指令

  • 标志送AH指令: LAHF;操作:(AH)<—(FLAGS的低字节)
  • AH送标志寄存器指令:SAHF;操作: (FLAGS的低字节)<—(AH)
  • 标志进栈指令:PUSHF;操作: (SP)<—(SP) - 2、((SP)+1, (SP))<—(FLAGS)
  • 标志出栈指令:POPF;操作: (FLAGS)<—((SP)+1,(SP))、(SP)<—(SP)+ 2

二、算术运算指令

该组指令的操作数可以是8位、16位。当存储单元是该类指令的操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。

  • 加法指令 ADD、ADC、INC
  • 减法指令 SUB、SBB、DEC、NEG、CMP
  • 乘法指令 MUL、IMUL
  • 除法指令 DIV、IDIV
  • 类型转换指令: CBW CWD
  • 十进制调整指令 DAA、DAS、 AAA、AAS、AAM、AAD

1. 加法指令

  • ADD_Function: 将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变

  • ADC_Function:将目的操作数加源操作数再加低位进位,结果送目的地址

  • INC_Function:将目的操作数加1,结果送目的地址(INC指令不影响CF标志)

格式:

  • ADD DST,SRC
  • 带进位加法指令ADC DST,SRC
  • 加1指令:INC OPR

2. 减法指令

  • SUB_Function:目的操作数减去源操作数,结果存于目的地址,源地址的内容不变

  • SBB_Function:目的操作数减源操作数再减低位借位CF,结果送目的地址

  • DEC_Function:将目的操作数减1,结果送目的地址(不影响CF标志)

  • NEG_Function:将目的操作数的每一位取反(包括符号位)后加1,结果送目的地址。(允许存储器或寄存器操作数,不允许段寄存器)

  • CMP_Function:目的操作数减源操作数,结果只影响标志位,不送入目的地址

格式:

  • SUB DST,SRC
  • 带借位减法指令 SBB DST,SRC
  • 减1指令 DEC OPR
  • 求补指令: NEG OPR
  • 比较指令:CMP OPR1, OPR2

tips
对于字节操作时,数据-128和字操作时数据-32768的情况,求补后不变,OF=1


3. 乘法指令

Function: 若是字节数据相乘,(AL寄存器)与SRC相乘得到字数据存入AX中;若是数据相乘,则(AX)与SRC相乘得到双字数据高字存入DX、低字存入AX中SRC不允许是立即数

格式:

  • 无符号数乘法指令:MUL SRC
  • 带符号数乘法指令:IMUL SRC

tip:对OF和CF标志的影响:

  • MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1。(用来检查字节相乘的结果是字节还是字,或字相乘的结果是字还是双字)
  • IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1。

4. 除法指令

寄存器使用与乘法相同

格式:

  • 无符号数除法指令: DIV SRC
  • 带符号数除法指令: IDIV SRC

tips:

  • 对DIV指令,在除数为0,或者在字节除时商超过8位,或者在字除时商超过16位时发生除法溢出。
  • 对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,或者在字除时商不在-32768~32767范围内,发生除法溢出。
  • SRC不允许是立即数

5. 类型转换指令指令

  • 字节扩展为字指令 CBW AL -> AX
    执行操作: 若(AL)的最高有效位为0,则(AH)= 00H若(AL)的最高有效位为1,则(AH)= FFH
  • 字扩展成双字指令CWD AX -> (DX,AX)
    执行操作:若(AX)的最高有效位为0,则(DX)= 0000H若(AX)的最高有效位为1,则(DX)= FFFFH

6. 十进制调整指令

6.1 压缩的BCD码调整指令

  • 加法的十进制调整指令DAA
    格式:DAA
    • 如果AL寄存器中低4位大于9或辅助进位AF=1,则AL=AL+6且AF=1;
    • 如果AL>=0A0H或CF=1,则AL=AL+60H且CF=1。
    • 该指令对SF、ZF、PF均有影响。
  • 减法的十进制调整指令DAS
    格式:DAS
    • 如果AF=1或AL寄存器中低4位大于9,则AL=AL-6且AF=1;
    • 如果AL>=0A0H或CF=1,则AL=AL-60H且CF=1。
    • SF、ZF、PF均受影响。

6.2 非压缩的BCD码调整指令

  • 加法的非压缩的BCD调整指令AAA
    格式:AAA

    • 如果AL的低4位大于9或AF=1,则AL=AL+6,AH=AH+1,AF=CF=1, 且AL高4位清零。
      否则CF=AF=0,AL高4位清零。
  • 减法的非压缩的BCD调整指令AAS
    格式:AAS

    • 如果AL的低4位大于9或AF=1,则AL=AL-6,AH=AH-1,AF=CF=1,AL高4位清零。
      否则CF=AF=0, AL高4位清零。
    • 其他标志位OF、PF、SF、ZF不确定。

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

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

相关文章

【Linux-网络编程】

Linux-网络编程 ■ 网络结构■ C/S结构■ B/S结构 ■ 网络模型■ OSI七层模型■ TCP/IP四层模型 ■ TCP■ TCP通信流程■ TCP三次握手■ TCP四次挥手 ■ 套接字&#xff1a;socket 主机IP 主机上的进程&#xff08;端口号&#xff09;■ TCP传输文件 ■ 网络结构 ■ C/S结构…

高亮页面任意元素,轻松完成用户引导 | 开源日报 No.201

kamranahmedse/driver.js Stars: 20.1k License: MIT driver.js 是一个轻量级、无依赖的纯 JavaScript 引擎&#xff0c;用于引导用户在页面上聚焦。该项目解决了如何在网页上引导用户关注核心要素的问题。 简单易用&#xff1a;没有任何外部依赖轻量级&#xff1a;仅有 5kb …

中间件 | RPC - [Dubbo]

INDEX 1 Dubbo 与 web 容器的关系2 注册发现流程3 服务配置3.1 注册方式 & 订阅方式3.2 服务导出3.3 配置参数 4 底层技术4.1 Dubbo 的 spi 机制4.2 Dubbo 的线程池4.3 Dubbo 的负载均衡策略4.3 Dubbo 的协议 1 Dubbo 与 web 容器的关系 dubbo 本质上是一个 RPC 框架&…

SpringCloud Stream 消息驱动

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第九篇&#xff0c;即介绍 Stream 消息驱动。 二、消息驱动概念 2.1 消息驱动是什么 官方定义 Spring …

学习通刷视频刷题脚本及安装使用过程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装插件二、复制脚本文件链接三、启动脚本四、登录学习通&#xff08;切记一倍速就行不然被封哦&#xff09;五、最好先把答题关掉先刷视频 前言 解决学习…

AI技术崛起:数据可视化之路更近

在当今AI技术蓬勃发展的时代&#xff0c;数据可视化作为信息传达的重要手段&#xff0c;其门槛逐渐降低。然而&#xff0c;这并不意味着我们可以忽视学习数据可视化的重要性。即使不需要深入专业技术&#xff0c;对数据可视化的基础知识的了解也是至关重要的。那么&#xff0c;…

02-Java变量和运算符

1. 基本数据类型转换&#xff08;Conversion&#xff09; 在Java程序中&#xff0c;不同的基本数据类型的值经常需要进行相互转换。Java语言所提供的七种数值类型之间可以相互转换&#xff0c;基本数据类型转换有两种转换方式&#xff1a;自动类型转换和强制类型转换。boolean…

Dubbo 的配置总线:抓住 URL,就理解了半个 Dubbo

概述 在互联网领域&#xff0c;每个信息资源都有统一的且在网上唯一的地址&#xff0c;该地址就叫 URL&#xff08;Uniform Resource Locator&#xff0c;统一资源定位符&#xff09;&#xff0c;它是互联网的统一资源定位标志&#xff0c;也就是指网络地址。 URL 本质上就是…

【C++从练气到飞升】03---构造函数和析构函数

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、类的6个默认成员函数 二、构造函数 1. 构造函数的概念 2. 构造函数的定义 3. 构造函数的特性 三、析构函…

MySQL MHA故障切换

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1&#xff09;什么是 MHA 2&#xff09;MHA 的组成 3&#xff09;MHA 的优势 4&#xff09;MHA 现状 1.3、案例环境 1&#xff09;本案例环境 ​编辑 2&#xff09;案例需求 3&#xff09;案例实现思路…

01——LenNet网络结构,图片识别

目录 1、model.py文件 &#xff08;预训练的模型&#xff09; 2、train.py文件&#xff08;会产生训练好的.th文件&#xff09; 3、predict.py文件&#xff08;预测文件&#xff09; 4、结果展示&#xff1a; 1、model.py文件 &#xff08;预训练的模型&#xff09; impor…

一道题学会如何使用哈希表

给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a; 输入&#xff1a;nums [1,2,3], …

视频素材哪里有?这几个高清无水印素材库看看

关于短视频素材&#xff0c;我知道大家都在找那种能让人一看就心旷神怡的地方&#xff0c;尤其是我们自媒体人&#xff0c;更是离不开这些优质的短视频素材来吸引观众的眼球。别着急&#xff0c;今天我就给大家安利几个网站&#xff0c;保证让你找到满意的短视频素材。 1&…

黑马微服务p30踩坑

报错详情 : orderservice开不起来 : 发生报错 : 然后检查了以下端口啥的 &#xff0c;配置啥的都是没有问题的 ; 解决办法 : 1 . 修改nacos1,2,3中的端口&#xff0c;将conf 中 cluster.conf中 的 127.0.0.1 全部改成自己本机的真实ipv4地址; 本机真实ipv4地址查看 :…

C#求水仙花数

目录 1.何谓水仙花数 2.求三位数的水仙花数 3.在遍历中使用Math.DivRem方法再求水仙花数 1.何谓水仙花数 水仙花数&#xff08;Narcissistic number&#xff09;是指一个 n 位正整数&#xff0c;它的每个位上的数字的 n 次幂之和等于它本身。例如&#xff0c;153 是一个 3 …

C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解)

C进阶&#xff1a;详解多态&#xff08;多态、虚函数、抽象类以及虚函数原理详解&#xff09; 结束了继承的介绍&#xff1a;C进阶&#xff1a;详细讲解继承 那紧接着的肯定就是多态啦 文章目录 1.多态的概念2.多态的定义和实现2.1多态的构成条件2.2虚函数2.2.1虚函数的概念2…

Ant Design Pro complete版本的下载及运行

前言 complete 版本提供了很多基础、美观的页面和组件&#xff0c;对于前端不太熟练的小白十分友好&#xff0c;可以直接套用或者修改提供的代码完成自己的页面开发&#xff0c;简直不要太爽。故记录一些下载的步骤。 环境 E:\code>npm -v 9.8.1E:\code>node -v v18.1…

RabbitMQ学习总结-延迟消息

1.死信交换机 一致不被消费的信息/过期的信息/被标记nack/reject的信息&#xff0c;这些消息都可以进入死信交换机&#xff0c;但是首先要配置的有私信交换机。私信交换机可以再RabbitMQ的客户端上选定配置-dead-letter-exchange。 2.延迟消息 像我们买车票&#xff0c;外卖…

Python | 机器学习中的模型验证曲线

模型验证是数据科学项目的重要组成部分&#xff0c;因为我们希望选择一个不仅在训练数据集上表现良好&#xff0c;而且在测试数据集上具有良好准确性的模型。模型验证帮助我们找到一个具有低方差的模型。 什么是验证曲线 验证曲线是一种重要的诊断工具&#xff0c;它显示了机…

基于Java+SpringMVC+vue+element宠物管理系统设计实现

基于JavaSpringMVCvueelement宠物管理系统设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…