汇编语言程序设计 第2章:8086指令系统简介及寻址方式

本文主要是介绍汇编语言程序设计 第2章:8086指令系统简介及寻址方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 指针的分类及格式
    • 1.1 指令的分类
    • 1.2 指令格式
  • 2. 寻址方式
    • MOV指令简介
    • 2.1 立即寻址
    • 2.2 寄存器寻址
    • 2.3 直接寻址
    • 2.4 寄存器间接寻址
    • 2.5 寄存器相对寻址
    • 2.6 基址变址寻址
    • 2.7 相对基址变址寻址
  • 3. 数据传送指令
    • 3.1 通用数据传送指令
    • 3.2 地址传送指令(LEA、LDS、LES)
    • 3.3 堆栈操作指令(PUSH、POP)
    • 3.4 标志寄存器传送指令(LAHF、SAHF、PUSHF、POPF)
  • 总结

1. 指针的分类及格式

1.1 指令的分类

汇编语言中所使用的指令分成两类:

  1. 硬指令:与二进制的机器指令一一对应,由计算机来执行。硬指令(简称指令)分成6类。
    数据传送指令、算术运算指令、位操作指令、串处理指令、控制转移指令、处理机控制指令
  2. 伪指令:指一些固定格式的约定符号,用于只是汇编程序如何工作,不产生任何目标代码。

1.2 指令格式

8088/8086汇编语言的硬指令和伪指令的格式基本相同。

硬指令格式
[标号:] 操作符 [目的操作数] [,源操作数] [;注释]
伪指令格式
[名字] 定义符 [操作数] [;注释]

标号:指出了该条硬指令的起始地址,程序员可通过标号来引用所标识的硬指令。
名字:在伪指令中用来定义变量名、过程名等。
操作符和定义符:用于规定硬指令的操作性质和伪指令的伪操作功能。
注释:用来说明一段程序、一条或几条指令的功能,以便阅读。

标号和名字统称为标识符。关于标识符的规定:
长度不能超过31个字符,组成该字符串的字符可以是字母(A~ Z或a ~ z)、数字(0~9)、特殊符号(? . @ _ $)。其中数字不能做第一个字符,标识符中如果使用到 ”.”,则该字符必须是第一个字符。

2. 寻址方式

MOV指令简介

8088/8086汇编语言中提供了7种与数据相关的寻址方式。
以MOV指令为例介绍7种寻址方式。
MOV指令的格式:
MOV< Dest>,< Src>
Src表示源操作数,Dest表示目的操作数。
指令功能:将源操作数Src表示的内容传送到目的操作数Dest所指示的位置。

2.1 立即寻址

操作数本身作为指令的一部分直接出现在指令中,即为立即数,寻找该立即数的寻址方式称为立即寻址。

在这里插入图片描述
在这里插入图片描述
注意:立即数只能用作源操作数,不能用作目的操作数,且源操作数的长度与目的操作数的长度必须一致

2.2 寄存器寻址

当源操作数已经存储在某个寄存器中,或者要把目的操作数存入某个寄存器时,指令中就指出所要使用的寄存器名称,该操作数的寻址方式即为寄存器寻址方式。

在这里插入图片描述
在这里插入图片描述
该指令中源操作数和目的操作数的寻址方式都是寄存器寻址

2.3 直接寻址

操作数放在存储器的存储单元中,在指令中直接给出该操作数在存储器中的偏移地址,这种寻址方式称为直接寻址。该偏移地址也称有效地址EAEffective Address)

在这里插入图片描述
在这里插入图片描述

2.4 寄存器间接寻址

操作数放在存储器的存储单元中,其有效地址放在寄存器中,若该操作数在指令中以“[寄存器名称]”的形式出现,则该操作数的寻址方式称为寄存器间接寻址。
注意:
(1) 所用寄存器只能是BX、BP、SI、DI
(2) 当使用寄存器BX、SI、DI时,默认段寄存器是数据段寄存器DS
(3) 当使用寄存器是BP时,默认段寄存器是堆栈段寄存器SS。
(4) 寄存器间接寻址方式允许使用段跨越前缀。

在这里插入图片描述

2.5 寄存器相对寻址

操作数放在存储器的存储单元中,其有效地址是基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容与指令中给定的8位或16位位移量之和,该操作数的这种寻址方式称为寄存器相对寻址。
注意:
(1) 当使用寄存器BX、SI、DI时,默认的段寄存器是DS
(2) 当使用的寄存器是BP是,默认的段寄存器是SS;
(3) 寄存器相对寻址方式允许使用段跨越前缀。

在这里插入图片描述

2.6 基址变址寻址

操作数放在存储器的存储单元中,其有效地址是一个基址寄存器(BX、BP)与一个变址寄存器(SI、DI)的内容之和,该操作数的这种寻址方式称为基址变址寻址。
注意:
(1) 当基址寄存器BX的内容作为有效地址的一部分时,默认的段寄存器是DS
(2) 当基址寄存器BP的内容作为有效地址的一部分时,默认的段寄存器是SS;
(3) 基址变址寻址方式允许使用段跨越前缀。

在这里插入图片描述

2.7 相对基址变址寻址

操作数放在存储器的存储单元中,其有效地址是以下三个量之和:一个基址寄存器(BX、BP)的内容、一个变址寄存器(SI、DI)的内容、一个8位或16位位移量,该操作数的这种寻址方式称为相对基址变址寻址。
注意:
(1) 当基址寄存器BX的内容作为有效地址的一部分时,默认的段寄存器是DS
(2) 当基址寄存器BP的内容作为有效地址的一部分时,默认的段寄存器是SS;
(3) 相对基址变址寻址方式允许使用段跨越前缀。

在这里插入图片描述

3. 数据传送指令

数据传送指令有5种,本章只介绍4种,其余在第10章介绍。

3.1 通用数据传送指令

(MOV、XCHG)

  1. MOV指令
    指令格式:MOV ,
    指令功能:将源操作数Src所表示的内容传送到目的操作数Dest所表示的位置。

MOV指令可分成三种形式:
(1) MOV 存储器单元/寄存器,立即数
功能:立即数赋给存储器单元或寄存器。
例如:MOV AL,‘E’
MOV Value,1234H
(2) MOV 寄存器,寄存器
功能:把寄存器中的内容赋给寄存器
例如:MOV AX,BX
MOV DS,AX
(3) MOV 寄存器,存储器单元
MOV 存储器单元,寄存器
功能:把存储器单元中的内容赋给寄存器或把寄存器的内容赋给存储器单元。
例如:MOV BX,Value
MOV Num,AX

关于MOV指令的规定(5点):
① 代码段寄存器CS、立即数不能做目的操作数;
② 源操作数和目的操作数不能同时为存储器操作数,如果一个操作数在存储器中,则另一个操作数要么是立即数,要么在寄存器中;
③ 不允许两个段寄存器之间直接传递数据;
④ 不允许为段寄存器送立即数;
⑤ 源操作数和目的操作数的类型必须相同。
以上这些规定,对于其他指令也适用。

  1. XCHG指令
    指令格式:XCHG ,
    指令功能:源操作数与目的操作数互换
    例3.14 XCHG AX,BX
    指令执行前:(AX)=1234H,
    (BX)=4567H
    指令执行后:(AX)=4567H,(BX)=1234H
    注意:
    ① 不允许使用立即寻址方式;
    ② 两个操作数必须有一个在寄存器中;
    ③ 不允许使用段寄存器;
    ④ 允许字或字节操作 。

3.2 地址传送指令(LEA、LDS、LES)

  1. LEA指令
    指令格式:LEA < Dest>,< Src>
    指令功能:把源操作数的有效地址送到指定寄存器中。
    注意:其中Dest必须是16位的寄存器(且不能是段寄存器),Src必须放在存储器单元中。
    在这里插入图片描述
  2. LDS指令
    指令格式:LDS < Dest>,< Src>
    指令功能:将由Src指定的存储单元中的字类型的数据传送到Dest所指定的16位寄存器中,并将下一个字单元中的数据传送到DS中。即:(Src)Dest,(Src+2)DS
    注意:Dest必须是16位的寄存器(且不能是段寄存器),Src必须放在存储器单元中。
    在这里插入图片描述
  3. LES指令
    指令格式:LES < Dest >,< Src>
    指令功能:将由Src指定的存储单元中的字类型的数据传送到Dest指定的16位寄存器中,并将下一个字单元中的数据传送到ES中。即:(Src)Dest,(Src+2)ES。
    注意:Dest必须是16位的寄存器(且不能是段寄存器),Src必须放在存储器单元中。

3.3 堆栈操作指令(PUSH、POP)

  1. PUSH指令
    指令格式:PUSH
    指令功能:将源操作数压入堆栈中。
    注意:源操作数的寻址方式可以是立即寻址方式以外的任何一种寻址方式 。
    在这里插入图片描述
  2. POP指令
    指令格式:POP
    指令功能:栈顶元素弹出送给目的操作数。
    注意:目的作数的寻址方式可以是除立即寻址方式以外的任何一种寻址方式,且目的操作数不能是CS。
    在这里插入图片描述

3.4 标志寄存器传送指令(LAHF、SAHF、PUSHF、POPF)

  1. LAHF
    指令格式:LAHF
    指令功能:取FLAGS低8位(SF、ZF、AF、PF、CF)到AH中。
  2. SAHF
    指令格式:SAHF
    指令功能:取AH内容送入FLAGS低8位。
  3. PUSHF
    指令格式:PUSHF
    指令功能:将FLAGS的内容压入堆栈。
  4. POPF
    指令格式:POPF
    指令功能:将栈顶内容弹出送入FLAGS。
    此指令为PUSHF指令的逆过程。

总结

在这里插入图片描述
在这里插入图片描述

这篇关于汇编语言程序设计 第2章:8086指令系统简介及寻址方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/808700

相关文章

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流