8086中的七种寻址方式

本文详细介绍了8086/8088处理器的七种基本寻址方式,包括立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址。每种方式都附有实例说明,便于理解。

寻址方式

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]

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

转载于:https://www.cnblogs.com/printN/p/5966310.html

<think>好的,我现在需要回答用户关于微机寻址方式的问题。首先,我需要确认自己对微机寻址方式的理解是否正确。寻址方式是指CPU在指令中如何确定操作数的位置或地址的方法。不同的寻址方式会影响指令的灵活性和执行效率。 接下来,我应该回忆一下常见的寻址方式有哪些。根据以前学过的知识,常见的包括立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、基址寻址、变址寻址、相对寻址、堆栈寻址等。不过,不同的教材或资料可能有不同的分类和命名方式,需要确认是否准确。 然后,我需要考虑用户可能的背景。用户可能对微机原理有一定的基础,但需要系统的总结。因此,回答需要结构清晰,每种寻址方式给出定义、特点和应用场景,并且用例子帮助理解。同时,用户提到要使用中文回答,所以需要用准确的中文术语。 还要注意用户之前的问题是关于Linux操作系统的特点,现在转向微机原理,可能用户在学习计算机组成或相关课程,需要详细但不过于复杂的解释。可能需要用简单的例子来说明每种寻址方式,比如具体的指令格式或操作数如何获取。 需要验证每种寻址方式的正确性,比如立即寻址的操作数直接在指令中,直接寻址的地址字段直接给出内存地址,寄存器寻址使用寄存器中的值等。是否有遗漏或混淆的地方?例如,基址寻址和变址寻址的区别,基址寻址使用基址寄存器加偏移,而变址寻址使用变址寄存器加基地址,可能容易混淆。 另外,是否需要包括隐含寻址方式?比如某些指令默认操作数在特定寄存器中,如8086中的乘法指令MUL可能隐含使用AX寄存器。这点可能需要提及,但有时候隐含寻址可能被归类为其他类型,或者单独列出。 还需考虑不同架构的微机可能有不同的寻址方式,比如x86和ARM的区别,但用户问题是一般性的微机寻址方式,所以应该以通用概念为主,可能以典型的8086为例来说明。 最后,组织回答的结构,可能分为几个主要类别,每类下列举具体的寻址方式,每种方式给出定义、例子和特点。确保语言简洁明了,符合用户要求的“结构清晰,帮助用户逐步解决问题”。</think>以下是微机(微型计算机)中常见的**寻址方式**分类及详解: --- ### 一、立即寻址(Immediate Addressing) - **定义**:操作数直接包含在指令中,无需访问内存或寄存器。 - **特点**: - 执行速度快(无额外内存访问)。 - 仅适用于常量或固定值。 - **示例**: ```assembly MOV AX, 1234H ; 将立即数1234H直接送入AX寄存器 ``` --- ### 二、直接寻址(Direct Addressing) - **定义**:指令中直接给出操作数的内存地址。 - **特点**: - 需访问内存,速度较慢。 - 地址固定,灵活性较低。 - **示例**: ```assembly MOV AL, [2000H] ; 将内存地址2000H处的内容送入AL寄存器 ``` --- ### 三、寄存器寻址(Register Addressing) - **定义**:操作数存放在CPU内部寄存器中。 - **特点**: - 速度最快(无需访问内存)。 - 寄存器数量有限,需合理分配。 - **示例**: ```assembly ADD BX, CX ; 将CX的值加到BX中 ``` --- ### 四、寄存器间接寻址(Register Indirect Addressing) - **定义**:寄存器中存储的是操作数的内存地址,而非操作数本身。 - **特点**: - 通过寄存器间接访问内存,灵活性高。 - 常用于数组或指针操作。 - **示例**: ```assembly MOV AX, [BX] ; 以BX内容为地址,从内存中取值送入AX ``` --- ### 五、基址寻址(Base Addressing) - **定义**:操作数地址 = 基址寄存器内容 + 偏移量(在指令中给出)。 - **特点**: - 基址寄存器通常指向数据段首地址。 - 适用于数据段的动态定位。 - **示例**(x86架构): ```assembly MOV DX, [BX+05H] ; 取BX+05H地址处的值到DX ``` --- ### 六、变址寻址(Indexed Addressing) - **定义**:操作数地址 = 变址寄存器内容 + 基地址(在指令中给出)。 - **特点**: - 变址寄存器(如SI、DI)用于遍历数组或字符串。 - 与基址寻址配合实现多维数组访问。 - **示例**: ```assembly MOV AL, [SI+100H] ; 取SI+100H地址处的值到AL ``` --- ### 七、相对寻址(Relative Addressing) - **定义**:操作数地址 = 程序计数器(PC)当前值 + 偏移量。 - **特点**: - 用于跳转指令(如JMP、CALL),实现地址无关代码。 - 支持代码重定位(动态加载时无需修改指令地址)。 - **示例**: ```assembly JMP +10H ; 跳转到当前PC值+10H的地址 ``` --- ### 八、堆栈寻址(Stack Addressing) - **定义**:通过堆栈指针(SP)访问操作数(后进先出)。 - **特点**: - 隐式使用SP寄存器,支持PUSH/POP操作。 - 用于函数调用、中断处理等场景。 - **示例**: ```assembly PUSH AX ; 将AX内容压入堆栈 POP BX ; 从堆栈弹出数据到BX ``` --- ### 九、隐含寻址(Implied Addressing) - **定义**:操作数隐含在指令中,无需显式指定。 - **特点**: - 指令短小,但功能受限。 - 常见于特定功能指令(如标志位操作)。 - **示例**: ```assembly STC ; 设置进位标志CF=1(隐含操作CF) ``` --- ### 总结 | **寻址方式** | **核心特点** | **典型应用** | |--------------------|------------------------------------------|---------------------------| | 立即寻址 | 操作数在指令中,速度快 | 加载常量 | | 直接寻址 | 地址直接给出,灵活性低 | 固定地址数据访问 | | 寄存器间接寻址 | 通过寄存器间接访问内存 | 指针操作、数组遍历 | | 基址/变址寻址 | 动态地址计算 | 数据结构(数组、字符串) | | 相对寻址 | 基于PC的跳转 | 条件分支、循环控制 | **微机寻址方式的核心作用**:通过灵活定位操作数,平衡指令效率与功能,支持复杂程序逻辑的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值