8086中的七种寻址方式

Faron Faron     2022-08-09     592

关键词:

寻址方式

8086/8088有七种基本的寻址方式:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,相对基址变址寻址。

其中,后五种寻址方式(即直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址)属于存储器寻址,用于说明操作数或操作数地址所在存储单元的地址。这五种方式也就是确定存放操作数的存储单元有效地址EA的方法,这里所说的有效地址就是在前面一节讲存储器分段中所说的段内偏移地址。

除了这些基本的寻址方式以外,还有固定寻址和I/O端口寻址等,但不会在本节中介绍到。

 

基本寻址方式

下面重点说一下这七种基本寻址方式的特点:

1. 立即寻址方式

先解释一个概念,叫做立即数

操作数包含在指令中,它作为指令的一部分,跟在操作码后存放在代码段。这种操作数称为立即数。

立即寻址方式所提供的操作数紧跟在操作码后面,与操作码一起放在指令代码段中,不需要到其他地址单元中去取。立即数可以是8位,也可以是16位。这种寻址方式主要用于给寄存器或存储单元赋初值的场合。立即寻址方式是这七种寻址方式中速度最快的寻址方式。

举例:MOV AX, 1234H ; 给AX寄存器赋值为1234H

 

2. 寄存器寻址方式

寄存器寻址的特点是操作数在CPU内部的寄存器中,在指令中指定寄存器号。

对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI和SP等;

对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。

例如:MOV SI, AX

        MOV AL, DH

由于操作数在寄存器中,不需要通过访问存储器来取得操作数,所以采用寄存器寻址方式的指令执行速度较快。

 

3. 直接寻址方式

直接寻址的操作数在存储器中,指令直接包含有操作数的有效地址。由于操作数一般存放在数据段,所以操作数的地址由DS加上指令中给出的16位偏移得到。

假如DS内容是5000H,地址为51234H字存储单元中的内容时6789H,那么在执行“MOV AX, [1234H]”后寄存器AX的内容是6789H。

由于该指令所用的段寄存器为DS,所以该条指令还可以写为"MOV AX, DS:[1234H]"。

当然,除了DS段寄存器以外,还可以指定其他段寄存器。

例如:MOV ES:[5678H], BL ; 指定ES作为段寄存器

这种寻址方式常用于处理单个存储器变量的情况。它可以实现在64K字节的段内寻找操作数。直接寻址的操作数通常是程序使用的变量。

 

4. 寄存器间接寻址方式

寄存器间接寻址的操作数在存储器中,操作数有效地址在SI、DI、BX、BP这四个寄存器之一中。在一般情况下,如果有效地址在SI、DI和BX中,则以DS段寄存器的内容为段值;如果有效地址在BP中,则以SS段寄存器的内容为段值。

例如:MOV AX, [SI] ; 自动引用DS作为段寄存器

假设 (DS)= 5000H, (SI)= 1234H

那么存储的物理存储单元地址是51234H。再设该字存储单元的内容是6789H,那么在执行该指令后,(AX)= 6789H。

当然也可以指定段超越前缀,如:

MOV DL, CS:[BX]  ;引用的段寄存器是CS

如果有效地址在BP中,那么引用的段寄存器为SS。如:

MOV [BP], CX  ;此时引用的段寄存器是SS

这种寻址方式可以用于表格处理,在处理完表中的一项后,只要修改指针寄存器的内容就可以方便地处理表中的另一项。

注意同寄存器寻址方式的书写方式予以区别。

 

5. 寄存器相对寻址方式

操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器的(SI、DI)内容加上指令中给定的8位或16位位移量之和。

即 EA = (BX)或(BP)或(SI)或(DI) + 8位或16位位移量

在一般情况下,如果SI、DI或BX的内容作为有效地址的一部分,那么引用的段寄存器是DS。如:

MOV AX, [DI+1223H] ; 引用的段寄存器是DS

假设,(DS)= 5000H,(DI)= 3678H。

那么,存取的物理存储单元地址是5489BH。再假设该字存储单元的内容是55AAH,那么在执行该指令后,(AX)= 55AAH。

而当BP的内容作为有效地址一部分时,那么引用的段寄存器是SS,如:

MOV BX, [BP-4]  ; 引用的段寄存器是SS

当然也可以自行指定段寄存器,如:

MOV ES:[BX+5], AL ; 引用ES作为段寄存器

这种寻址方式同样可用于表格处理,表格的首地址可设置为指令中的位移量,利用修改基址或变址寄存器的内容来存取表格中的项值。

以下两种写法等价:

MOV AX, [SI+3]

MOV AX, 3[SI]

 

6. 基址变址寻址方式

操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容相加得到。

即:EA = (BX)或(BP) + (SI)或(DI)

在一般情况下,如果BP的内容作为有效地址的一部分,则以SS的内容作为段值,否则以DS的内容作为段值。

当所得的有效地址超过FFFFFH时,就取其64K的模。

例如: MOV AX, [BX+DI] ; 此时引用DS段寄存器

假设,(DS)= 5000H,(BX)= 1223H, (DI)= 54H

那么,存取的物理存储单元地址是51277H。再假设改字存储单元的内容是168H,那么在执行该指令后,(AX)= 168H

当然,还可以增加段超越前缀来指定段寄存器。

例如:

MOV AX, ES:[BX+SI]  ; 引用ES作为段寄存器
MOV DS:[BP+SI], AL  ; 引用DS作为段寄存器

这种寻址方式适用于数组或表格处理。用基址寄存器存放数组首地址,而用变址寄存器来定位数组中的各元素,或反之。

另外,以下两种表示方法是等价的:

MOV AX, [BX+DI]

MOV AX, [DI][BX]


7. 相对基址变址寻址方式

操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容及指令中给定的8位或16位位位移量相加得到。

即:EA = (BX)或(BP) + (SI)或(DI) + 8位或16位位移量

在一般情况下,如果BP作为有效地址的一部分,则以SS段寄存器的内容为段值,否则以DS段寄存器的内容为段值。

在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如果偏移量是8位,那么被带符号扩展成16位。当所得的有效地址超过FFFFH时,就取其64K的模。

举例:MOV AX, [BX+DI-2] ; 自动引用DS作为段寄存器

假设,(DS)= 5000H,(BX)= 1223H, (DI)= 54H
那么,存取的物理存储单元地址是51275H。再设该字存储单元的内容是7654H,那么在执行该指令后,(AX)= 7654H

以下四种表示方法均是等价的:

MOV AX, [BX+DI+1234H]

MOV AX, 1234H[BX+DI]

MOV AX, 1234H[BX][DI]

MOV AX, 1234H[DI][BX]

尽管相对基址变址这种寻址方式最复杂,但也是最灵活的。

214vue定义组件模板的七种方式(代码片段)

...定义为一个字符串。我想我们的观点会达成一致:字符串中的模板是非常难以理解的。除了广泛的浏览器支持之外,这种方法没有太多用处。Vue.component(‘my-checkbox‘,temp 查看详情

8086指令系统中的寻址方式

...址的方式就是立即寻址2.直接寻址(存储器寻址)  指令中的操作数是存储器操作数MOVAX,[3100H]该指令中,表示将内存里数据段中,偏移地址是3100H单元和3101H单元的内容复制一份到寄存器AX中。"[]"内用16位上述表示存放数据的偏... 查看详情

css实现水平垂直居中的七种方式(代码片段)

css实现水平垂直居中的七种方式一、使用grid布局二、使用flex布局三、使用定位+外边距四、使用定位+平移五、使用外边距+平移六、使用文本对齐+行高七、使用表格单元一、使用grid布局<!DOCTYPEhtml><htmllang=... 查看详情

vue定义组件模板的七种方式(一般用单文件组件更好)

...定义为一个字符串。我想我们的观点会达成一致:字符串中的模板是非常难以理解的。除了广泛的浏览器支持之外,这种方法没有太多 查看详情

mfc对话框控件访问的七种方式

voidCTestDlg::OnButtonAdd() //TODO:Addyourcontrolnotificationhandlercodehere //动态创建按钮/* if(FALSE==m_bIsCreate)//亦可以通过静态变量staticBOOLbIsCreate=FALSE; m_btn.Create("Lee",BS_DEFPUSHBUTTON|WS_VISIBLE|W 查看详情

实现高并发秒杀的七种方式(代码片段)

点击关注公众号,实用技术文章及时了解引言商品秒杀-超卖解决商品超卖方式一(改进版加锁)方式二(AOP版加锁)方式三(悲观锁一)方式四(悲观锁二)方式五(乐观锁)方式六... 查看详情

实现高并发秒杀的七种方式(代码片段)

点击关注公众号,实用技术文章及时了解引言商品秒杀-超卖解决商品超卖方式一(改进版加锁)方式二(AOP版加锁)方式三(悲观锁一)方式四(悲观锁二)方式五(乐观锁)方式六... 查看详情

8086cpu寻址方式

     8086CPU寻址方式灵活。有以下几种        idata表示常量      1.  [idata]用一个常量来表示地址,可用于直接定位内存单元,但是在MASM中要显实在的说 查看详情

java设计模式——单例模式的七种实现方式

饿汉式(静态常量)packagecom.yundi.atp.dp.singleton;/***@Author:yanp*@Description:饿汉式(静态常量)*线程安全,对象实例化的时候构建,可能造成内存浪费,没有懒加载的效果*@Date:2022/3/1212:06*& 查看详情

简述8086/8088各种寻址方式中,段寄存器和便宜地址的组合方式

寻址方式,就是指指令中给出的寻找操作数(包括数据操作数和地址操作数)的方法。根据操作数的种类,8086/8088指令系统的寻址方式分为两大类:数据寻址方式和地址寻址方式。指令寻址方式将在以后的章节中结合控制转移指令... 查看详情

c#.net页面跳转的七种方法

...行当前页。跳转向新的页面,原窗口被代替。浏览器中的URL为新路径。Response.Redirect 查看详情

事物的七种传播行为

事务传播行为类型事务传播行为类型说明PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务... 查看详情

8086 汇编中的基于索引寻址

】8086汇编中的基于索引寻址【英文标题】:Basedindexaddressinginassemblyfor8086【发布时间】:2014-02-1920:21:00【问题描述】:我对以下这行有点困惑:addax,[si+4]这是否取SI的值并将4H添加到它,然后将其添加到AX?例如,我们会说AX=1000和... 查看详情

单例模式的七种实现(代码片段)

...,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。还有就是我们经常使用的servlet就是单例多线程的。使用单例能够节省很... 查看详情

16位汇编--寻址方式

1、8086/8088的基本寻址方式可分为哪三类?它们说明了什么? 存储器立即寄存器3中寻址方式2、存储器寻址方式可分为哪几种?何为存储单元的有效地址? 3、请说明如下指令中源操作数的寻址方式,并作相互比较: MOVB... 查看详情

汇编小笔记

...单元),寄存器直接寻址,寄存器间接寻址,详细:8086七种寻址方式待续。 查看详情

spring事务的七种传播行为(代码片段)

Spring事务的七种传播行为事务传播行为类型说明PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。PROPAGATION_SUPPORTS支持当前事务,如果当前没... 查看详情

intelx86cpu寻址方式

...是指Intel从16位微处理器8086开始的整个CPU芯片系列,系列中的每种型号都保持与以前的各种型号的兼容。在x86系列中,8086和8088是16位处理器,从80386开始为32位处理器,80286则是该系列从8088到80386,是从16位到32位过渡的过程。80286... 查看详情