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

2024-02-12 16:20

本文主要是介绍【新书推荐】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汇编语言基础教程》。

这篇关于【新书推荐】7.6节 相对基址加变址寻址方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

java中4种API参数传递方式统一说明

《java中4种API参数传递方式统一说明》在Java中,我们可以使用不同的方式来传递参数给方法或函数,:本文主要介绍java中4种API参数传递方式的相关资料,文中通过代码介绍的非常详细,需要的... 目录1. 概述2. 参数传递方式分类2.1 Query Parameters(查询参数)2.2 Path

MybatisPlus中几种条件构造器运用方式

《MybatisPlus中几种条件构造器运用方式》QueryWrapper是Mybatis-Plus提供的一个用于构建SQL查询条件的工具类,提供了各种方法如eq、ne、gt、ge、lt、le、lik... 目录版本介绍QueryWrapperLambdaQueryWrapperUpdateWrapperL

idea设置快捷键风格方式

《idea设置快捷键风格方式》在IntelliJIDEA中设置快捷键风格,打开IDEA,进入设置页面,选择Keymap,从Keymaps下拉列表中选择或复制想要的快捷键风格,点击Apply和OK即可使... 目录idea设www.chinasem.cn置快捷键风格按照以下步骤进行总结idea设置快捷键pyth

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

java敏感词过滤的实现方式

《java敏感词过滤的实现方式》文章描述了如何搭建敏感词过滤系统来防御用户生成内容中的违规、广告或恶意言论,包括引入依赖、定义敏感词类、非敏感词类、替换词类和工具类等步骤,并指出资源文件应放在src/... 目录1.引入依赖2.定义自定义敏感词类3.定义自定义非敏感类4.定义自定义替换词类5.最后定义工具类

python项目环境切换的几种实现方式

《python项目环境切换的几种实现方式》本文主要介绍了python项目环境切换的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 如何在不同python项目中,安装不同的依赖2. 如何切换到不同项目的工作空间3.创建项目