当前位置: 首页 > news >正文

【汇编】#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)

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


相关文章:

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

文章目录 操作码与操作数1. 8086处理器的与数据有关的寻址方式1.1 立即数寻址方式1.2 寄存器寻址方式 2. 有效(偏移)地址(effective address,EA)与缺省段寄存器选择tips:段跨越前缀2.1 直接寻址tips:直接寻址与立即寻址…...

【数据结构】单链表的层层实现!! !

关注小庄 顿顿解馋(●’◡’●) 上篇回顾 我们上篇学习了本质为数组的数据结构—顺序表,顺序表支持下标随机访问而且高速缓存命中率高,然而可能造成空间的浪费,同时增加数据时多次移动会造成效率低下,那有什么解决之法呢&#xff…...

丰田研究所(TRI)最新成果——可实现全身操控的软体机器人Punyo

文 | BFT机器人 人形机器人在近年的科技浪潮中迅速崛起,成为了各界瞩目的焦点,众多企业纷纷推出自家的机器人模型,但仔细观察,不难发现它们中的许多在操作方式上仍显得颇为相似。这些典型的人形机器人,以其机械臂和抓…...

【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别

文章目录 0. 前言1. 级联神经网络介绍2. MTCNN介绍2.1 MTCNN提出背景2.2 MTCNN结构 3. MTCNN PyTorch实战3.1 facenet_pytorch库中的MTCNN3.2 识别图像数据3.3 人脸识别3.4 关键点定位 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解&#xff…...

MFC中字符串string类型和CString类型互转方法

在Microsoft Foundation Classes (MFC)中,CString是一个非常方便的类,用于处理C风格的字符串。有时,你可能需要在MFC的CString和C标准库中的std::string之间进行转换。下面是如何在两者之间进行转换的方法: CString转std::string…...

Jmeter-使用http proxy代理录制脚本

Jmeter-使用http proxy代理录制脚本 第1步:打卡jmeter工具新增1个线程组 第2步:给线程组添加1个HTTP请求默认值 第3步:设置下HTTP请求默认值第4步:在工作台中新增1个----HTTP代理服务器 第5步:设置HTTP代理服务器 …...

C++训练营:new 运算符

大家好: 衷心希望各位点赞。 您的问题请留在评论区,我会及时回答。 一、new 运算符 new 运算符用于动态分配一片内存空间,并返回这片内存空间的首地址,可将该首地址存入一个指针变量中,主要有以下三种格式。 二、格…...

C# 用Trace.WriteLine输出调试信息无法查看

写程序就会遇见BUG,这时候在代码不同部位输出一些标记的信息对查找错误非常有必要,一般情况下我们都是使用Console.WriteLine()方法来打印信息到控制台窗口,但有时候使用Console.WriteLine()方法会存在不方便的情况,比如鄙人遇到的…...

【Echarts】柱状图上方显示数字以及自定义值,标题和副标题居中,鼠标上显示信息以及自定义信息

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…...

HTML 语义化:构建优质网页的关键

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Flutter入门学习——Flutter和Dart

因为工作的需要,也为了个人发展,现在的话,转战Flutter跨端开发了,虽然目前的项目只发了android端,但是那天尝试了一下Ios的打包流程,也能运行,只是IOS那边的打包稍微复杂一些。 差不多学习了一…...

C++中的内存管理方式

一、C内存管理方式简介 C语言中的内存管理方式在C中可以继续使用,但是在有些地方就无能为力,而且使用起来比较麻烦。因此C中引入了自己的内存管理方式,通过new和delete操作符进行动态内存管理。 二、new语法 new可以申请1个或多个空间&…...

macos m1 arm芯片 使用jpype报错 FileNotFoundError: [Errno 2] JVM DLL not found

startJVM(jpype.getDefaultJVMPath()) 报错 Traceback (most recent call last):File "/Users/thomas990p/PycharmProjects/tuya/volcano-biz-scripts/WenKongFa/FinalCode/java2python/CallJavaAPI.py", line 12, in <module>startJVM(jpype.getDefaultJVMPa…...

Hive中UNION ALL和UNION的区别

1.概述 Hive官方提供了一种联合查询的语法&#xff0c;原名为Union Syntax&#xff0c;用于联合两个表的记录进行查询&#xff0c;此处的联合和join是不同的&#xff0c;join是将两个表的字段拼接到一起&#xff0c;而union是将两个表的记录拼接在一起。 换言之&#xff0c; jo…...

selenium高级应用

常见控件应用 复杂的控件操作1.操作Ajax选项2.滑动滑块操作 WebDriver的特殊操作元素class值包含空格property、attribute、text的区别定位动态id 截图功能页面截图页面截图&#xff0c;返回截图的二进制数据页面截图&#xff0c;返回base64的字符串截取指定元素。先定位元素&a…...

微信小程序重新加载当前页面、刷新当前页面

重新加载页面 使用wx.reLanuch&#xff08;&#xff09;&#xff0c;url: 路径当前页面跳转, 页面所有数据重新初始化&#xff0c;已配置的数据不会保存 wx.reLaunch({url: /pages/orders/createOrder/createOrder, // 当前页面的路径}) reLanuch()的方法&#xff0c;会有一个…...

如何查找、恢复误清空的 Android 回收站?

“我的回收站里有一些照片。当我点击“恢复”时&#xff0c;没有任何反应。我可以将我的 Android 手机插入我的电脑。这样我就可以手动恢复它们。但我在 Android 上找不到 bin 文件夹。我还可以做些什么&#xff1f;” 随着 Android 手机上的文件数量不断增加&#xff0c;了解…...

Node.js作用

Node.js可以开发应用 开发服务器应用 开发工具类应用 开发桌面端应用...

Web爬虫入门:原理、实现与常见问题解决指南

引言&#xff1a; 在当今数据驱动的时代&#xff0c;网络上蕴藏着无尽的信息宝藏&#xff0c;而爬虫技术则是探索和利用这些宝藏的重要工具。爬虫&#xff0c;简单来说&#xff0c;就是一种自动化程序&#xff0c;它能够模拟人类浏览网页的行为&#xff0c;从中提取所需数据。…...

蓝桥杯练习题——归并排序

1.火柴排队 思路 1.求最小值的时候&#xff0c;可以直接按升序排序&#xff0c;这样得到的值就是最小值 2.求最小交换次数的时候&#xff0c;不能直接排序&#xff0c;因为只能交换相邻的数&#xff0c;只需要知道他们的相对大小&#xff0c;所以可以先用离散化&#xff0c;把…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...