一、立即寻址方式

操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。

立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如:

MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H
MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H

其中:B1、W1和D1分别是字节、字和双字单元。

以上指令中的第二操作数都是立即数,在汇编语言中,规定:立即数不能作为指令中的第二操作数。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。

立即数寻址方式通常用于对通用寄存器或内存单元赋初值。图是指令“MOV AX, 4576H”存储形式和执行示意图。

二、寄存器寻址方式

指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:
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等。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。

1、源操作数是寄存器寻址方式
如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。在第4章将会学到如何定义它们。

2、目的操作数是寄存器寻址方式
如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。

3、源和目的操作数都是寄存器寻址方式
如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。

由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,我们提倡在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。

七种寻址方式(直接寻址方式)
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。

在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。

例:假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?

解:根据直接寻址方式的寻址规则,把该指令的具体执行过程用下图来表示。

从图中,可看出执行该指令要分三部分:
 
由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;

访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存储单元的物理地址:21234H;

取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。

所以,在执行该指令后,BX的值就为5213H。

由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。

下面指令的目标操作数就是带有段前缀的直接寻址方式。

MOV ES:[1000H], AX

直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。

注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。

试比较下列指令中源操作数的寻址方式(VARW是内存字变量):
MOV AX, 1234H MOV AX, [1234H] ;前者是立即寻址,后者是直接寻址
MOV AX, VARW MOV AX, [VARW] ;两者是等效的,均为直接寻址

七种寻址方式(寄存器间接寻址方式)
操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。该寻址方式物理地址的计算方法如下:

寄存器间接寻址方式读取存储单元的原理如图所示。

在不使用段超越前缀的情况下,有下列规定:

若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。

例:假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?

解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值形成,即:

PA=(DS)*16+DI=1000H*16+2345H=12345H。

所以,该指令的执行效果是:把从物理地址为12345H开始的一个字的值传送给BX。

其执行过程如图所示。

七种寻址方式(寄存器相对寻址方式)
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、D

I)的内容和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。

在不使用段超越前缀的情况下,有下列规定:
 
    若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
 
    若有效地址用BP来指定,则其缺省的段寄存器为SS。
 
指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。

例:假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?

解:根据寄存器相对寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:
 
EA=(SI)+100H=2345H+100H=2445H
 
该操作数的物理地址应由DS和EA的值形成,即:
 
PA=(DS)*16+EA=1000H*16+2445H=12445H。

所以,该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。

其执行过程如图所示。

七种寻址方式(基址加变址寻址方式)
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。其有效地址的计算公式如公式所示。

在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。

例:假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?

解:根据基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)=2100H+0011H=2111H

该操作数的物理地址应由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2111H=12111H

所以,该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。

其执行过程如图所示。

七种寻址方式(相对基址加变址寻址方式)
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。

在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。

指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。

例:假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?

解:根据相对基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H

该操作数的物理地址应由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2310H=12310H

所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。其执行过程如图所示。

从相对基址加变址这种寻址方式来看,由于它的可变因素较多,看起来就显得复杂些,但正因为其可变因素多,它的灵活性也就很高。比如:
 
用D1[i]来访问一维数组D1的第i个元素,它的寻址有一个自由度,用D2[i][j]来访问二维数组D2的第i行、第j列的元素,其寻址有二个自由度。多一个可变的量,其寻址方式的灵活度也就相应提高了。

相对基址加变址寻址方式有多种等价的书写方式,下面的书写格式都是正确的,并且其寻址含义也是一致的。

MOV AX, [BX+SI+1000H] MOV AX, 1000H[BX+SI]
MOV AX, 1000H[BX][SI] MOV AX, 1000H[SI][BX]

但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。

相对基址加变址寻址方式是以上7种寻址方式中最复杂的一种寻址方式,它可变形为其它类型的存储器寻址方式。下表列举出该寻址方式与其它寻址方式之间的变形关系。

七种寻址方式(立即寻址、寄存器寻址)相关推荐

  1. 【单片机原理及接口技术】【理解】七种寻址方式

    文章目录 七种寻址方式 1.寄存器寻址 2.直接寻址(操作数是片内RAM) 3.立即数寻址 4.寄存器间接寻址(两把抽屉两把钥匙,出门只带1把就行) 5.变址寻址(基址寄存器 + 变址寄存器间接寻址) ...

  2. 七种寻址方式(32位地址的寻址方式)

    在32位微机系统中,除了支持前面的七种寻址方式外,又提供了一种更灵活.方便,但也更复杂的内存寻址方式,从而使内存地址的寻址范围得到了进一步扩大. 在用16位寄存器来访问存储单元时,只能使用基地址寄存器 ...

  3. 汇编语言的七种寻址方式

    汇编语言的七种寻址方式 寻址方式即指令中指明的操作数存放位置的表达方式. (一)操作数存放位置 指令中进行操作数的数据存放在三种位置:指令.寄存器.存储器 1.1 立即数--存放在指令中 被操作数据直 ...

  4. 【汇编语言】8086汇编,快速搞定各种寻址方式:立即数寻址 / 寄存器寻址 / 存储器寻址

    0 前言 众所周知,对于8086汇编语言,有几大寻址方式,不过我觉得这个好墨迹,会用就可以了,为什么命名这么多,这次只说本质,不说命名,至于命名,还是得知道,毕竟是大部分人公认的,不能反抗这点哦,但是 ...

  5. 关于8086七种寻址方式的练习

    选自老师课后习题,如有错误,敬请谅解 CSDN看不了的点这里 先区分几个概念 操作码 操作数 说明计算机要执行哪种操作,如传送.运算.移位.跳转等操作,它是指令中不可缺少的组成部分. 操作数是指令执行 ...

  6. 微机原理七种寻址方式

    共7种寻址方式: 1. 立即寻址方式 立即数包含在指令中,作为指令的一部分. 如 MOV AX 1234H 2. 寄存器寻址方式 操作数在CPU内部的寄存器中,指令指定寄存器号 16位操作数,寄存器可 ...

  7. <汇编>七种寻址方式

    1.立即寻址 注意点: (1)常用于给寄存器或内存操作数寻址. (2)只能用于源操作数,不能用于目标操作数.MOV 12H, AX(错误) 3种书写方式: (1)可以用不同进制表示,须加上后缀 16- ...

  8. 七种寻址方式(相对基址加变址寻址方式)

    操作数在存储器中,其有效地址是一个基址寄存器(BX.BP)的值.一个变址寄存器(SI.DI)的值和指令中的8位/16位偏移量之和.其有效地址的计算公式如公式所示.  在不使用段超越前缀的情况下,规定: ...

  9. 【单片机原理与应用】mcs-51的七种寻址方式

    (寻址方式:所谓寻址方式就是CPU执行那一条指令时如何找到该指令所要求操作数的方式) 寄存器寻址 操作数放在寄存器中,在指令中直接以寄存器的名字来表示操作数的地址.例如MOV A, RO,即将R0寄存 ...

  10. 七种寻址方式(寄存器相对寻址方式)

    操作数在存储器中,其有效地址是一个基址寄存器(BX.BP)或变址寄存器(SI.D I)的内容和指令中的8位/16位偏移量之和.其有效地址的计算公式如公式所示. 在不使用段超越前缀的情况下,有下列规定: ...

最新文章

  1. access订单明细表怎么做_成本明细表
  2. 第四范式先知(Sage)率先通过欧盟GDPR认证
  3. poj3296--Rinse(三分)
  4. Sqlite3 for Linux 可视化工具
  5. 深度学习用于视频检测_视频如何用于检测您的个性?
  6. 【C++ Primer学习笔记】第2章:变量和基本类型
  7. stm32不使用外部晶振管脚怎么处理_外部晶体振荡器被旁路的原理和原因
  8. python导入requests库一直报错原因总结_python导入requests库一直报错原因总结 (文件名与库名冲突)...
  9. CMSimple内容管理系统
  10. [转]JDK动态代理
  11. 想学人工智能从哪入手?
  12. Seaborn学习(一)------- 构建结构化多绘图网格(FacetGrid()、map())详解
  13. redhat7 安装 docker
  14. 【IoT】产品设计:用实际案例,手把手教你写MRD(市场需求文档)
  15. 案例分析:从误删除数据库血案看数据库系统的安全设计
  16. iPhone手机Mac地址查看
  17. 哔哩哔哩(B站)品牌投放,优质潜力up主如何找?
  18. go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案
  19. 易安卓十六进制数转为十进制数_十六进制转换成十进制的具体算法?
  20. Java锁--共享锁和ReentrantReadWriteLock

热门文章

  1. win10远程桌面出错
  2. 头脑极度开放:前额皮层大战杏仁核
  3. word2vec查询中文词向量同义词
  4. java水彩画效果滤镜,把动物照片转成水彩画效果的PS滤镜教程
  5. SQL 查询 skip locked的使用
  6. 两个表格内容怎么合并
  7. python单词查询_Python实现单词查询文件查找
  8. 高并发衡量指标及解决方案
  9. python怎么写代码求年华收益率_如何计算年化收益率?
  10. 《电脑音乐制作实战指南:伴奏、录歌、MTV全攻略》——2.2 能知旋律但不知歌名,使用哼唱搜索来找歌...