【汇编】#3 8086与数据有关的寻址方式

文章目录

  • 操作码与操作数
    • 1. 8086处理器的与数据有关的寻址方式
      • 1.1 立即数寻址方式
      • 1.2 寄存器寻址方式
    • 2. 有效(偏移)地址(effective address,EA)与缺省段寄存器选择
      • tips:段跨越前缀
      • 2.1 直接寻址
        • tips:直接寻址与立即寻址的差别
      • 2.2 寄存器间接寻址方式
      • 2.3 寄存器相对寻址方式
      • 2.4 基址变址寻址方式
      • 2.5 相对基址变址寻址方式


操作码与操作数

指令由操作码操作数两部分组成。

  • 操作码 说明计算机要执行的操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分。
  • 操作数 是指令执行的参与者,即各种操作的对象。也就是指令执行操作过程中需要的操作数。有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数,通常称为一地址指令、二地址指令、三…
  • 基本格式如图
    在这里插入图片描述

80x86的大多数运算型指令采用二地址指令,少数采用三地址指令。

操作数是指令的一部分,存放在代码段中

计算机只能识别二进制代码,所以机器指令是用二进制代码组成的。为便于人们使用采用汇编语言来编写程序。汇编语言中采用助记符表示操作码,用符号表示操作数或操作数地址。它与机器指令一一对应

1. 8086处理器的与数据有关的寻址方式

寻址、寻址方式的概念

  • 寻址就是寻找操作数的地址(如何找到指令所需数据、
    指令执行结果存放到哪里?寄存器/存储器)。
  • 寻址方式就是指令中用于说明操作数所在地址的方法。

寻址方式又可分成两种:与数据有关的寻址方式、与转移地址有关的寻址方式


1.1 立即数寻址方式

操作数直接存放在指令中,紧跟在操作码之后,它作为指令的 一部分存放在代码段中,这种操作数称为立即数寻址。

MOV AX, 3064H 执行后(AX)=3064H

**tips:**立即数只能作为源操作数,一般用来初始化寄存器或变量;另外需要注意数据长度应和目的操作数范围内(不要将如16位数据传入8位寄存器)

1.2 寄存器寻址方式

操作数存储在寄存器中,指令中指定寄存器号,这种寻址方式称为寄存器寻址方式。

在该寻址方式下可以引用的寄存器有:

  • 8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL;
  • 16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;
  • 32位寄存器: EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP和段寄存器等;

MOV AX,BX
执行前,(AX)=3064H,(BX)=1234H
执行后:(AX)=1234H,(BX)=1234H

tips:

  • 指令中源操作数和目的操作数都是寄存器时,必须采用同样字长的寄存器,否则汇编时会出错;(即使是如MOV BX,AL这种操作也不可)
  • 两个操作数不能同为段寄存器
  • 目的操作数不能为代码段寄存器(CS)。

2. 有效(偏移)地址(effective address,EA)与缺省段寄存器选择

当寻址方式中操作数都在除代码段之外的存储区中(下面介绍的都是)。通过不同的寻址方式,需要先获得操作数地址,从而取得操作数。

操作数的物理地址等于段基址,再加上偏移地址而取得。其中段基地址可以从段寄
存器取得或者通过段寄存器计算得到
,那么得到物理地址的重点就在于如何获取偏移地址(有效地址)

有效地址(EA)由以下4种成分组成

  • 位移量(displacement):存放在指令中的一个8位或16位或32位的数,但它不是立即数,而是一个地址
  • 基址(base):存放在基址寄存器(如BX、BP)中的内容。它是有效地址中的基址部分,通常用于指向数据段中数
    组或字符串的首地址。
  • 变址(index):存放在变址寄存器(如SI、DI)中的内容。通常用来指向数组中某个元素或字符串的某个字符。
  • 比例因子(scale factor)是386以以后机型新增加的寻址方式中的一个术语,其值可以是1、2、4或8。
    有效地址(EA)可以用下列式子表示:EA=基址+(变址x比例因子)+位移量
  • 此外不允许使用AX、CX、DX 存放 EA

8086/8088只能使用16位寻址方式,有效地址只有3种成分组成,无比例因子

又因为物理地址((PA—Physical Address)=段地址(此处指有效地址)×16(即十六进制数后加一个0) + 偏移量

故为了得到物理地址我们还需要知道段地址,缺省选择规则如表

访存类型所用段及段寄存器缺省选择规则
指令代码段 CS寄存器用于取指
堆栈堆栈段 SS寄存器所有堆栈的进栈和出栈
局部数据数据段 DS寄存器一般数据
目的串附加数据段 ES寄存器串处理指令目的串

8086/8088允许程序员使用段跨越前缀来改变系统指定的默认段。但以下3种情况不允许使用段跨越前缀。

  • 指令必须在代码段CS中;
  • PUSH指令的源操作数和POP指令的目的操作数必须使用SS段;
  • 串处理指令的目的串必须使用附加段ES;

tips:段跨越前缀

当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。

汇编格式:段寄存器名:操作数地址。
冒号“ : ”之前的段寄存器名指明操作数所在的段。
eg: MOV AX,DS:[BP] /MOV CX,SS:[SI]
该例中,DS:、SS:均为跨段前缀,此时默认状态无效(BP默认段为SS)
操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。
上述2条指令的源操作数物理地址分别为:
PA1 =(DS)左移4位+[BP]
PA2 =(SS)左移4位+ [SI] (十六进制左移1位)
在这里插入图片描述

在不使用段超越前缀的情况下,有下列规定:

  • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存
    器为DS;
  • 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆
    栈段)。

2.1 直接寻址

操作数的有效地址只包含位移量一种成分,其值就存放在代码段中指令的操作码之后。位移量的值即操作数的有效地址。

eg:MOV AX ,[2000H]设(DS)=3000H。 执行后:(AX)=30000H+2000H

tips:直接寻址与立即寻址的差别

对于内存变量名(符号地址)其本身就表示其地址,所以对于如下
MOV AX, 1234H != MOV AX, [1234H] 前者是立即寻址,后者是直接寻址
MOV AX, VARW == MOV AX, [VARW] 两者是等效的,均为直接寻址


2.2 寄存器间接寻址方式

当操作数的有效地址只包含基址寄存器内容或者变址寄存器内容一种成分。因此有效地址就在某个寄存器中,而操作数则在存储器中。(16位寻址可用的寄存器:BX,BP,SI,DI)

汇编格式:目标寄存器名,[源寄存器名]

eg:MOV AX, [BX],在执行时,(DS)=2000H,(BX)=1000H,存储单元21000H的内容是50A0H。问执行指令后,AX的值此时存储50A0H
注意寄存器BX存储的值不是操作数的值,而是操作数的地址。
在这里插入图片描述


2.3 寄存器相对寻址方式

操作数的有效地址为基址寄存器或变址寄存器的内容和指令中指定的位偏移量之和。 (寄存器的规定同寄存器间接寻址)

汇编格式:目标寄存器名,X[寄存器R](X表示位移量,16位寻址:X是8位或16位二进制补码表示的有符号数)
功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA

在这里插入图片描述
eg:
MOV AX, COUNT[SI]MOV AX, [COUNT+SI]
假设 (DS)=3000H, (SI)=2000H, COUNT=3000H(符号地址),则: PA = (30000H+(2000))
假设(35000H)=1234H, 那么 (AX)=1234H(值 不是地址)


2.4 基址变址寻址方式

操作数有效地址是一个基址寄存器(如BX、BP)和一个变址寄存器(如SI、DI)的内容之和。 有效地址由两种成分组成。

在这里插入图片描述
MOV BX, [BX+SI] or MOV AX, [BX] [SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。执行后,BX的值是1234H


2.5 相对基址变址寻址方式

操作数有效地址是一个基址寄存器(如BX、BP)的值与一个变址寄存器(如SI、DI)的值和指令中的偏移量之和。(16位寻址位:移量为8位/16位) 有效地址由三种成分组成。

在这里插入图片描述
eg:
MOV AX, [BX+SI+200H] or MOV AX, BX [SI+200H] or MOV AX, BX SI 200H
在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,(AX)=10000H+(2100H+0010H+10H)

这种寻址方式通常用于二维数组的寻址


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

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

相关文章

Android14之解决报错:No module named sepolgen(一百九十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

1.1 课程架构介绍:STM32H5信息安全特性概览

1.1 课程架构介绍:STM32H5信息安全特性概览 1. 概述 开发者在打造嵌入式系统时,安全和性能是产品开发设计的考量重点。为实现这一目标,ST推出了STM32H5系列,该系列作为微控制器新标杆面向工业应用市场,将为用户带来更…

(每日持续更新)jdk api之StreamTokenizer基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

Linux -- 线程概念和控制

一 什么是线程 1.1 线程的引出 我们开始理解一下Linux中的线程。我们以前说过,一个进程被创建出来,要有自己对应的进程PCB的,也就是 task_struct,也要有自己的地址空间、页表,经过页表映射到物理内存中。所以在进程角…

Docker:构建镜像,运行springboot项目、服务器开启虚拟内存

文章目录 构建镜像,运行项目开启虚拟内存构建,运行 构建镜像,运行项目 开启虚拟内存 我们自己购买服务器一般内存就2g,是不够用的,所以要开启虚拟内存。 创建目录 mkdir /file创建虚拟内存 dd if/dev/zero of/fi…

java数据结构与算法刷题-----LeetCode46. 全排列

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 暴力回溯2. 分区法回溯 1. 暴力回溯 解题思路:时…

ASP.NET-Server.HtmlEncode

目录 背景: 1.转义特殊字符: 2.防止跨站脚本攻击(XSS): 3.确保输出安全性: 4.保留原始文本形式: 5.与用户输入交互安全: 实例说明: 不用Server.HtmlEncode 效果展示: 用Server.HtmlEnc…

蜘蛛矩阵系统:一个人如何运营上百个账号,方法在这里!

实体店若想在线上吸引客源,绝不能仅仅满足于拍摄几段短视频。现今的市场竞争已经迫使许多商家采用更先进的策略蜘蛛矩阵系统来进行获客。想象一下,你的竞争对手正在运用这一系统,他们开通有一百个账号,每天可以发布一百条的视频&a…

vue3 表单数据发生改变时,切换路由给我提示

一、需求说明 1、当表单数据未发生改变时,save和discard按钮不可点击,路由切换时无提示(如下图所示) 2、当表单数据发生改变时,save和discard按钮可点击,路由切换时出现提示(如下图所示&#x…

【C语言_C语言语句_复习篇】

目录 一、C语言的语句有哪些 1.1 空语句 1.2 表达式语句 1.3 函数调用语句 1.4 复合语句 1.5 控制语句 二、分支语句(两种) 1.1 if语句 1.1.1 普通分支语句(if、if_else) 1.1.2 嵌套if语句 1.1.3 else嵌套if两种写法的比较 1.1.4 else悬空问题 1.1.…

西贝柳斯Sibelius2024免费专业的乐谱制作软件

西贝柳斯Sibelius是一款专业的乐谱制作软件,广泛应用于音乐教育、电影配乐、管弦乐团、合唱团等领域。以下是对Sibelius软件的详细介绍: sibelius2024版本下载如下: https://wm.makeding.com/iclk/?zoneid47077 一、功能 Sibelius具有强大…

Promise搞不懂,看这篇就明白了

Promise搞不懂,看这篇就明白了 Promise 是异步编程的一种解决方案,实质上Pomise是个对象,用来封装异步操作,可以更加优雅的书写复杂的异步任务。 具体来看他是怎么工作的: Promise语法格式 new Promise(function (re…

学习SSM的记录(八)-- SSM整合项目《任务列表案例》

前端程序搭建和运行 项目预览 接口分析 1.学习计划分页查询 需求:查询对应数据页数据 uri:schedule/{pageSize}/{currentPage} 请求方式:get 响应数据:json {"code":200,"flag":true,"data"…

基于java+springboot+vue实现的高校社团管理系统(文末源码+Lw+ppt)23-419

摘 要 系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对高校社团的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”…

【C++算法模板】字典树,超详细注释带例题讲解

文章目录 0)概述1)数据结构2)插入操作3)查询操作4)完整代码1. 字符数组2. 字符串 视频链接:F06 字典树(Trie) 0)概述 是快速插入和查询字符串的多叉树结构,根节点编号为0&#xff0…

Redis:使用redis-dump导出、导入、还原数据实例

redis的备份和还原,借助了第三方的工具,redis-dump 1、安装必要环境 yum -y install zlib-devel openssl-devel2、安装redis-dump 安装ruby: ruby下载地址:https://www.ruby-lang.org/zh_cn/downloads/ 我下载的是 2.5.0 版本…

Linux系统下基于VSCode和Cmake进行C++开发

目录 简介一、GCC编译器1.1创建cpp文件1.2编译过程1.3g重要编译参数 二、GDB调试器三、IDE-VScode3.1 VSCode常用快捷键3.2 swap测试 四、CMake4.1CMake介绍4.2 CMake语法特性介绍4.3 CMake重要指令和常用变量4.4 CMake编译流程4.5CMake代码实践 五、使用VSCode进行完整项目开发…

Gateway网关在url参数带有特殊字符的情况下转发失败(响应400)

本文主要分享了,SpringCloud Gateway网关在url参数带有空格或者特殊字符的情况下,转发失败导致响应错误码400的解决方案。 响应400错误码的2种场景: 1.参数带空格,Gateway会误认为该空格是切割符,如?phone 135****6…

B/S基于云计算的云HIS智慧医院管理系统源码带电子病历编辑器

目录 一、系统概述 二、开发环境 三、系统功能 1、门诊部分 2、住院部分 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 云HIS系统:病案首页 云his系统源码 SaaS应用 功能易扩 统一对外接口管理 现如今,大数据、云计算、移动…

深入浅出计算机网络 day.2 概论⑥ 计算机网络体系结构

上帝疯狂杜撰世界悲情的命题 将凉薄和荒芜尽写 —— 24.3.13 内容概述 1.常见的三种计算机网络体系结构 2.计算机网路体系结构分层的必要性 3.计算机网络体系结构分层思想举例 4.计算机网络体系结构中的专用术语 一、常见的三种计算机网络体系结构 1.OSI参考模型 …