【新书推荐】7.6节 相对基址加变址寻址方式

本节内容:基址加变址寻址方式。

         ■基址加变址寻址方式:指令操作数为内操作数,操作数地址使用[基址寄存器+变址寄存器]表示。

7.6.1 基址加变址寻址方式

基址加变址寻址方式的操作数在存储器中,操作数的有效地址由基地址寄存器(BX,BP)之一与变址寄存器(SI,DI)之一相加得到,如图7-12所示。

通常BX、SI、DI引用DS,BP引用SS。

图7-12 基址加变址地址表达式

如果所得地址超出FFFFH,则取其64K(FFFFH)的模。

如图7-13所示:

                                                        图7-13 基址加变址寻址方式

假设DS=5000H,BX=3456H,DI=1234H

MOV AX,[BX+DI]语句中的[BX+DI]内存操作数的物理地址为5468AH,AX=5678H。

动手实验22:演示基址加变址寻址方式

如图7-14所示,在debug调试器内输入:

mov ax,5000H

mov ds,ax;将段值5000H赋给ds段寄存器。

Mov bx,3456H;

Mov di,1234H;

Mov ax,[bx+di];将数据段偏移地址[bx+di]处存储的值送入ax寄存器。

图7-14 演示基址加变址寻址方式

在其他段中使用基址加变址寻址方式:

MOV DS:[BP+SI],AL   ;将AL寄存器的值存入数据段[BP+SI]偏移地址处。

MOV AX,ES:[BX+SI]   ;将附加段ES内偏移地址[BX+SI]处的数值送入AX寄存器。

基址加变址寻址方式通常用于数组或表格处理。用基址寄存器存放数组首地址,而变址寄存器用来定位数组中的元素,或相反。由于两个寄存器都可以改变,所以能更加灵活地访问数组或表格中的元素。

提示

如下两种方式等价:

    MOV AX , [BX+DI]

    MOV AX,[BX][DI]    

7.7节 相对基址加变址寻址方式

         本节内容:相对基址加变址寻址方式。

         ■相对基址加变址寻址方式:指令操作数为内存操作数,操作数的地址采用[基址寄存器+变址寄存器+位移量]的方式表示。示例代码address.asm。

7.7.1 相对基址加变址寻址方式

相对基址加变址寻址方式的操作数在存储器中,操作数的有效地址由基地址寄存器(BX,BP)之一与变址寄存器(SI,DI)之一的内容及指令中给定的8位或16位位移量相加得到,如图7-15所示。

通常BX,SI,DI引用DS,BP引用SS。

图7-15 相对基址加变址地址表达式

在指令中给定的8位或16位位移量如果是有符号整数,则采用补码形式表示。如果是8位有符号整数,则带符号位扩展成16位。

如果所得地址超出FFFFH,则取其64K(FFFFH)的模。

如图7-16所示:

图7-16 相对基址加变址寻址方式

例:假设(DS)=5000H,(BX)=3456H,[DI]=1234H。

那么MOV AX,[BX+DI-2]  ;物理地址为54688H,(AX)=6789H。

动手实验23:演示相对基址加变址寻址方式

如图7-17所示,在debug调试器内输入:

mov ax,5000H

mov ds,ax;将段值5000H赋给ds段寄存器。

Mov word ptr [4688H],6789H;将6789H存入数据段偏移地址4688H处。

Mov bx,3456H;

Mov di,1234H;

Mov ax,[bx+di-2];将数据段偏移地址[bx+di-2]处存储的值送入ax寄存器。

图7-17 相对基址加变址寻址方式

举例

         如表7-1所示,我们在数据定义中定义了一张学生统计表table,表内记录了学生student0开始的若干个学生统计信息。分别统计该名学生的姓名(8个字节)、年龄(1个字节)、学号(1个字节)、身高(2个字节)和体重(2个字节)。如果把这张表存入计算机的线性内存,每名学生需要14个字节的内存空间,且连续存储,如图7-18所示。

接下来我们使用合适的寻址方式来获取table表中的学习信息。

         Table表的起始地址:mov bx,offset table;使用bx基址寄存器。

         学生student0的地址:mov si,offset student0。

学生student1的地址:mov di,offset student1。

学生student0的姓名位于表table内的偏移地址[SI]处,或者表示为偏移地址[bx]。

         学生student0的年龄位于表table内的偏移地址8处,或者表示为偏移地址[bx+8]。

学生student1的姓名位于表table内的偏移地址[di]处,表示为偏移地址[bx+di]。

         学生student1的年龄位于表table内的偏移地址[di +8]处,表示为偏移地址[bx+di+8]。

         如果继续使用变址寄存器SI,则表示如下:

         add si,14;将SI的值加上14个字节,指向学生student1。

学生student1的姓名位于表table内的偏移地址[si]处,表示为偏移地址[bx+ si]。

         学生student1的年龄位于表table内的偏移地址[si +8]处,表示为偏移地址[bx+ si +8]。

表7-1 相对基址加变址寻址方式

图7-18 内存中的学生统计表

尽管这种相对基址加变址寻址方式最复杂,但是也最灵活,其他6种寻址方式都是其变形。

提示

如下四种方式等价:

    MOV AX , [BX+DI+1234H]

    MOV AX , 1234H[BX+DI]

    MOV AX,1234H[BX][DI] 

    MOV AX,1234H[DI][BX]    

动手实验24:寻址方式

编写下面的示例代码address.asm源程序,完成编译链接,生成address.exe可执行程序,并在debug调试器中单步跟踪执行。仔细观察不同寻址方式计算的偏移地址。

示例代码2

;程序名:address

;功能:寻址方式

;============================

assume cs:code,ds:data                             

                                    

X = 1234H                  ;X EQU 1234H          

data segment                             

val1 db 1

val2 dw ?

val3 db 1,2,3,4,5,6,7,8,9,0,1,2,3

val4 dd 12345678h                             

data ends                            

code segment                            

start:                                   

         mov ax,data     ;将段标号data送入ax          

         mov ds,ax         ;ds=ax               

         ;立即寻址方式                          

         mov ax,X                             ;ax=1234H

         mov word ptr val1,3456h;将3456H写入val1偏移地址处,val1=56h,val2=0034h

         ;寄存器寻址方式

         mov cx,ax         ;cx=ax

         ;直接寻址方式

         mov al,byte ptr ds:[val1] ;将val1偏移地址处一个字节的值送入al,al=56h

         mov al,val1                          ;等同于上一条语句的简化形式

         ;寄存器间接寻址方式

         mov si,offset val3              ;将val3偏移地址送入si,si=3

         lea si,word ptr ds:[val3]   ;将val3偏移地址送入si,si=3

         add si,1    ;si=4

         mov bx,word ptr ds:[si]    ;将si偏移地址处一个字的值送入bx=0302h      

         ;寄存器相对寻址方式

         mov bx,offset val1   ;将val1偏移地址送入bx,bx=0

         mov ax,ds:[bx+3]      ;将数据段bx+3偏移地址处一个字的值送入ax,ax=0201h

         ;基址加变址寻址方式

         mov si,1                      ;si=1

         mov bx,offset val3   ;将val3偏移地址送入bx,bx=3

         mov ax,[bx+si]           ;将[bx+si]=4偏移地址处的一个字的值送入ax,ax=0302h

         ;相对基址加变址寻址方式

         mov ax,[bx+si+1]      ;将[bx+si+1]=5偏移地址处的一个字的值送入ax,ax=0403h

         ;

         lea si,val4                            ;将val4偏移地址送入si,si=10H

         mov si,offset val4             ;将val4偏移地址送入si,si=10H

         mov al,byte ptr val4        ;将val4偏移地址处一个字节的值送入al,al=78h

         mov al,byte ptr ds:[si]      ;将si偏移地址处一个字节的值送入al,al=78h

         ;将val4偏移地址处5678H送入di,1234H送入ds

         lds di,val4                             ;ds=1234h,di=5678h

         ;切换回原数据段

         mov ax,data

         mov ds,ax

         ;

         mov al,0                     ;4C号功能入口参数

         mov ah,4ch                ;调用DOS 4C号功能,退出程序

         mov ax,4c00h           ;与前两条语句等价

         int 21h                                 

code ends                                    

end start                            

         编译后加载debug调试器后的反汇编代码如图7-19所示:

图7-19 address.asm反汇编代码

         示例代码2给出了7种不同的寻址方式的示例。Debug调试器单步跟踪时,请读者仔细核对注释中给出的偏移地址是否正确。只有给出正确的地址,才可以正确的读写内存。我们可以简单将计算机的工作原理理解为查数、查表、查地址。随着学习的深入,请读者慢慢理解。

同时需要注意lea指令和mov指令的区别,lea指令取地址,而mov指令取值。Lds指令为复合指令,将四个字节的源操作数中的高字送入ds,低字送入di。我们随后将在下一章详细讲解8086计算机指令。  

练习

1、8086的基本寻址方式分为哪三类?

2、8086存储器寻址方式可分为哪几种?

3、请说明如下指令中源操作数的寻址方式:

MOV BX,[1234H]

MOV BX,1234

MOV DX,BX

MOV DX,[BX]

MOV DX,[BX+1234H]

MOV DX,[BX+DI]

MOV DX,[BX+DI+1234H]

4、如何选择恰当的选择寻址方式?

5、为什么目标操作数不能采用立即寻址方式?

6、哪些存储器寻址方式可能导致有效地址超出64KB的范围?8086是如何处理的?

本文摘自编程达人系列教材《X86汇编语言基础教程》。

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

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

相关文章

day 20(补2.5)

fread 函数: 今日练习 C语言面试题5道~ 1. static 有什么用途?(请至少说明两种) 1) 限制变量的作用域 2) 设置变量的存储域 2. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始…

幻兽帕鲁服务器原来的存档不想玩了,怎么清档?如何重来?

如果需要备份原存档的话,就先把存档导出来备份。或者手动去服务器文件里找到游戏存档文件夹,保存下载。 如无需备份原存档,则可以直接使用幻兽帕鲁应用模板,来重装服务器的操作系统。 方法很简单: 详细教程地…

mysql经典4张表问题

1.数据库表结构关联图 2.问题: 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数3.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩4、查询名字中含有"风"字的学生信息5、查询课程名称为"数学"&…

网络协议与攻击模拟_17HTTPS 协议

HTTPShttpssl/tls 1、加密算法 2、PKI(公钥基础设施) 3、证书 4、部署HTTPS服务器 部署CA证书服务器 5、分析HTTPS流量 分析TLS的交互过程 一、HTTPS协议 在http的通道上增加了安全性,传输过程通过加密和身份认证来确保传输安全性 1、TLS …

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱3(附带项目源码)

效果演示 文章目录 效果演示系列目录前言丢弃物品源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存…

netstat命令

netstat 是一个计算机网络命令行工具,用于显示网络连接、路由表和网络接口等网络相关信息。netstat 命令可以在各种操作系统上使用,包括 Windows、Linux 和 macOS 等。 在使用 netstat 命令时,可以提供不同的选项来显示不同类型的网络信息。…

助力智能化农田作物除草,基于轻量级YOLOv8n开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中,关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了,结合智能化的设备可以实现只能除草等操作,玉米作物场景下的杂草检测我们则少有涉及,这里本文的主要目的就是想要基于最新的YOLOv8下最轻量级…

微信问一问·流量赚钱专栏

微信问一问流量赚钱专栏 1493读者,104内容 看专栏解百惑,赚到钱 问一问免费涨粉利器 独家更新 100 篇「问一问」经验贴。带你入门,解惑,提效,涨粉,赚小钱 零成本单日公众号涨粉 1000 ,专栏成…

《Java 简易速速上手小册》第9章:Java 开发工具和框架 (2024 最新版)

文章目录 9.1 Maven 和 Gradle - 构建与依赖管理的神兵利器9.1.1 基础知识9.1.2 重点案例:使用 Maven 构建 Spring Boot 应用9.1.3 拓展案例 1:使用 Gradle 构建多模块项目9.1.4 拓展案例 2:利用 Gradle Wrapper 确保构建的一致性 9.2 Spring…

【数据结构】哈希表的开散列和闭散列模拟

哈希思想 在顺序和树状结构中,元素的存储与其存储位置之间是没有对应关系,因此在查找一个元素时,必须要经过多次的比较。 顺序查找的时间复杂度为0(N),树的查找时间复杂度为log(N)。 我们最希望的搜索方式:通过元素的…

计算x的平方根x含负数和复数cmath.sqrt(x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算x的平方根 x含负数和复数 cmath.sqrt(x) cmath.sqrt(-4)输出的结果是? import cmath import math a 4 print("【显示】a ",a) print("【执行】math.sqrt(a)&…

InstantBox:开箱即用的临时 Linux 环境

在云计算和虚拟化技术日益成熟的今天,我们有时需要一个快速、简单、临时的 Linux 环境来进行各种任务。这就是 InstantBox 的用武之地。 什么是 InstantBox? InstantBox 是一个开源项目,它可以快速启动临时的 Linux 系统,并提供…

HeidiSQL安装配置(基于小皮面板(phpstudy))连接MySQL

下载资源 对于这款图形化工具,博主建议通过小皮面板(phpstudy)来下载即可,也是防止你下载到钓鱼软件,小皮面板(phpstudy)如果你不懂是什么,请看下面链接这篇博客 第二篇:…

Vision Transformer Pytorch 实现代码学习记录

目前运营的社交平台账号: CSDN 【雪天鱼】: 雪天鱼-CSDN博客哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.com 可能后续有更新,也可能没有更新,谨慎参考 V1.0 24-02-13 ViT 代码的基本训练, 预测推理脚本运行 1 学习目标 能用官方的 ViT…

React18原理: 核心包结构与两大工作循环

React核心包结构 1 ) react react基础包,只提供定义 react组件(ReactElement)的必要函数一般来说需要和渲染器(react-dom,react-native)一同使用在编写react应用的代码时, 大部分都是调用此包的api比如, 我们定义组件的时候,就是它提供的class Demo ext…

Stream Query Denoising for Vectorized HD Map Construction

参考代码:截止2024.02未开源 动机与出发点 这篇文章是在StreamMapNet的基础上做的,为了在局部地图感知任务上提升时序上的感知稳定性,参考DN-DETR中的去噪方案,为局部地图感知提出一种针对局部地图元素的加噪声方案以及去噪逻辑。…

在线JSON解析格式化工具

在线JSON解析格式化工具 - BTool在线工具软件,为开发者提供方便。JSON在线可视化工具:提供JSON视图,JSON格式化视图,JSON可视化,JSON美化,JSON美化视图,JSON在线美化,JSON结构化,JSON格式化,JSON中文Unicode等等。以清晰美观的结构化视图来展示json,可伸缩折叠展示,…

精品jsp+ssm人事办公管理系统OA考勤考核出入库

《[含文档PPT源码等]精品jspssm基于java的办公管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 使用技术: 开发语言:Java 框架:ssm 技术:JSP JDK版本&…

【Vue】Vue基础入门

📝个人主页:五敷有你 🔥系列专栏:Vue ⛺️稳重求进,晒太阳 Vue概念 是一个用于构建用户界面的渐进式框架优点:大大提高开发效率缺点:需要理解记忆规则 创建Vue实例 步骤: …

微信发送一条消息经历哪些过程。企业微信以及钉钉的IM架构对比

0.前言 微信和钉钉是经常会与到两个IM通讯软件,今天从技术角度对他们两个进行分析。这样也方便对于构建IM系统有更好的了解和认识。如果目标是想构建一个IM即时通信的app或者说想了解一下一条消息的收发会经历什么过程可以详细了解一下。 我们可以想想一下微信发送…