文章目录

  • 指令格式
  • 指令中的(目标 / 源)操作数来源
  • 一、立即数寻址
  • 二、寄存器寻址
  • 三、存储器寻址
    • 3.1 直接寻址
    • 3.2 寄存器间接寻址
    • 3.3 基址寻址 (寄存器相对寻址?)
    • 3.4 变址寻址(寄存器相对寻址?)
    • 3.5 基址变址寻址
    • 3.6 带位移的基址加变址寻址方式
    • 3.7 小结
  • ---------------------------------------------------------------------------------
  • 寻址方式中容易出现的错误
  • 另类写法
  • 练习题
    • 第1题
    • 第2题

指令格式

指令中的(目标 / 源)操作数来源

立即数:四位十六进制,如1234H
寄存器:操作手在寄存器中
存储器:操作数有“[ ]”

七种叫法:

  1. 立即寻址方式
  2. 寄存器寻址方式
  3. 直接寻址方式
  4. 寄存器间接寻址方式
  5. 寄存器相对寻址方式
  6. 基址加变址寻址方式
  7. 相对基址加变址寻址方式

一、立即数寻址

把一个数直接在指令里面给出来,然后把这个数赋值给目标操作数。如:把 1234H 这个数赋值给DX【数据寄存器】

但是,一般这种寻址方式我们只会在赋初值的时候才会用。


二、寄存器寻址

就是我们不直接在指令里面给出源操作数,而是把这个源操作数放在一个寄存器里面,通过寄存器来赋值。

例如:把通用寄存器 BX 里面存放的数据赋值给 AX。(源寄存器和目标寄存器的大小一定要相同)


三、存储器寻址

3.1 直接寻址

直接寻址的意思是,我们直接在指令里面给出源操作数的偏移地址,例如:

这里,我们就给出了源操作数的偏移地址是 3000H,那么段地址去哪了?

在没有特殊声明时,默认数据都在数据段 DS,如果数据是在其他段,例如附加段 ES,那么需要通过段超越的方式:

下图所示过程执行的是指令: MOV AL , [2000H]

直接寻址看起来简单易懂,但是有一个大问题:假设我们要计算1+2+⋯+100,假设 1 位于存储器的第100个单元,如果采用直接寻址的方式,我们首先:要写出第一个地址,赋值、再写第二个地址,赋值、再相加、继续写地址,赋值、、、、这样一来,这个简单的问题都快需要几百行指令了,这显然十分麻烦,因此也有了下面的寄存器间接寻址。


3.2 寄存器间接寻址

这里是通过把偏移地址放在寄存器中的寻址方式。用于存放数据在内存中的偏移地址的,只能有 4 个通用寄存器:BX, BP, SI, DI。

BX:基址寄存器
BP:基址指针
SI:源变址寄存器
DI:目的变址寄存器

如果存放偏移地址的是寄存器:BX, SI, DI, 那么默认的段就是数据段 DS;
如果存放偏移地址的是寄存器:BP,那么默认的段就是堆栈段 SS

例子:

这就说明数据的偏移地址存放在 BX 里面,由于没有使用段超越,所以段默认是数据段 DS。但是这个例子里面取完数据赋值是有讲究的:

因为我们知道:16位 CPU 它这个内存单元一个就是 8位的,我们通过 [BX] 所访问到的就是一个存储单元,也就是说,我们只取出了1个数,这个数是 8 位的。但是想要赋值的寄存器 AX 是 16位的,因此这时,我们还需要再往下多取一个8位二进制数,作为高位,存放在 AH。

下图所示的过程执行的是指令: MOV AX , [ BX]


3.3 基址寻址 (寄存器相对寻址?)

采用基址寻址时,我们的偏移地址是这样表示的:[基址寄存器] + 偏移量

这里,偏移量是一个常数,而能够存放基址的,只有 BP 和 BX。

  • 在使用 BX【基址寄存器】 时,默认的段就是数据段DS;
  • 在使用 BP 【基址指针】时,默认的段就是堆栈段 SS

例子:

下图所示过程展示的是指令:MOV AL , [ BX + 5]


3.4 变址寻址(寄存器相对寻址?)

上面我们采用的偏移地址表示是 [基址寄存器] + 偏移量,而在变址寻址中,我们偏移地址的表示就是:[变址寄存器] + 偏移量。

在16位变址寻址中,变址寄存器只能是SI 、 DI,且它们都是默认段是 DS

变址寻址主要的目的是为了一维数组的操作,因为我们知道,要想访问一维数组,需要有表头,还要有数组内数据和表头的距离。那么我们常常用那个常数偏移量代表表头,有寄存器的变化代表数组内元素距表头的距离。

例子:


3.5 基址变址寻址

类似的,在这种寻址方式下,我们的偏移地址就表示成:[基址寄存器] + [变址寄存器]

基址+变址的目的是为了用于二重循环和对二维数组的操作。例如:

说明:在这种寻址模式下,哪个段主要取决于基址寄存器

下图展示的是指令: MOV AX , [ BX + SI ]


3.6 带位移的基址加变址寻址方式

一样地,这里偏移地址的表示方式是:[基址寄存器]+[变址寄存器]+偏移量]
例如:


3.7 小结

---------------------------------------------------------------------------------

寻址方式中容易出现的错误

另类写法


练习题

第1题


第2题

3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址相关推荐

  1. arm汇编指令——分析问题的利器

    文章目录 arm汇编指令为什么重要 1. 主导问题 2. arm汇编指令分类介绍 通用寄存器 状态寄存器 数据转移指令 寻址格式 运算指令 比较指令 跳转指令 3. 反汇编接口 4. 反汇编分析举例 ...

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

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

  3. ARM汇编指令(ARM寻址方式、汇编指令、伪指令

    1.寻址方式 所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法. 1)立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出的. 只要取出指令也就是取 ...

  4. 80x86汇编指令详解

    80x86指令系统,指令按功能可分为以下七个部分. (1) 数据传送指令. (2) 算术运算指令. (3) 逻辑运算指令. (4) 串操作指令. (5) 控制转移指令. (6) 处理器控制指令. (7 ...

  5. 汇编指令push,mov,call,pop,leave,ret建立与释放栈的过程

    栈内的数据 栈在汇编层面是辅助实现函数调用的,每个函数调用过程在栈中被抽象成一帧 ,在老式的32位CPU架构IA32中还有固定寄存器指向当前帧底部(下图中的0x100000f4,0x100000d8) ...

  6. 【汇编语言】通用寄存器和基础汇编指令

    文章目录 前言 1. 通用寄存器 2. 字在寄存器中的存储 2.1 两个单位 2.2 基础的汇编指令 2.2.1 MOV指令 2.2.2 ADD指令 2.2.3 传送运算规范 3. 相关练习题 前言 ...

  7. ARM处理器9种基本寻址方式,和单片机微机原理寻址方式截然不同,(例如没有直接地址寻址,只能间接指针寻址或者寄存器变址寻址,立即数寻址,不是所有立即数都可直接寻址)不可套用理解。需独立学习

    基本寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,ARM处理器有9 种基本寻址方式. 1.寄存器寻址 操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器 ...

  8. 【汇编语言】理解8086CPU中,不同类型的寄存器和汇编指令规则的联系(会继续更新)

    0 前言 你是否因为汇编指令繁杂的规则而苦恼呢?作者本人也很烦,因为往往教材中只告诉我们规则,却不告诉我们为什么,没有原因就直接记忆,负担太大,后期灵活运用也增添阻力,因此,我经过自己的思考去为你解释 ...

  9. ARM汇编指令立即数规范和判断

    转载 :https://blog.csdn.net/yunfenglw/article/details/41621103 在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必须 ...

  10. 寻址方式 寄存器寻址方式 立即数寻址方式 存储器寻址方式: 直接寻址方式,寄存器间接寻址方式,变址和基址寻址方式,基址变址寻址方式 串操作寻址方式 I/O端口寻址方式

    寻找操作数地址的方法 共有八种: 寄存器寻址方式 立即数寻址方式 存储器寻址方式:( 直接寻址方式,寄存器间接寻址方式,变址和基址寻址方式,基址变址寻址方式) 串操作寻址方式 I/O端口寻址方式 80 ...

最新文章

  1. 深刻剖析与实战BCELoss详解(主)和BCEWithLogitsLoss(次)以及与普通CrossEntropyLoss的区别(次)
  2. sersync+rsync数据同步
  3. springmvc教程(4)
  4. mysql保存中文异常Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column'
  5. JavaWeb完整项目要用到的专业技能
  6. SAP CRM和C4C message category配置
  7. 函数中的指针分配的内存怎么释放
  8. java同步方法的特点_java多线程有哪些优点?同步实例代码展示
  9. php 数组相乘,PHP如何计算数组中所有值的乘积?(代码示例)
  10. 多个客户端如何同时连接到服务器上的一个端口(例如80)? [重复]
  11. 创建Struts 2简单应用的流程
  12. 六面美团后,我有一个重要的发现...
  13. cydia多开微信_苹果ios怎么多开微信分身?
  14. 联想新电脑桌面没有计算机,联想电脑没有wifi图标不见了怎么办
  15. 电子发票撤销 java_已确认的发票如何撤销
  16. YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(下)
  17. java 调用弗雷_JAVA API(一)String类和StringBuffer类
  18. 打开Office软件时的错误-----隐含模块中的编译错误:autoexecnew
  19. HTML 标签的 coords 属性
  20. web课程设计:HTML非遗文化网页设计题材【京剧文化】HTML+CSS(大美中国 14页 带bootstarp)

热门文章

  1. 数据库查询三个以上名字重复的数据
  2. 任正非《以客户为中心》
  3. 家庭计算机上网必须用到的设备,家庭网络中常见的几种网络设备介绍
  4. 防火墙结构之双重宿主主机结构
  5. iptables 实现主机防火墙(四表五链)
  6. PageHelper.startPage分页失效问题,亲测已解决
  7. 步道乐跑(最新版本)
  8. python解析excel公式_读取Excel单元格值,而不是计算它的公式-openpyx
  9. 计算机二进制原理动画,伏羲创建的八卦图有多牛?计算机之父:二进制的原理从中发现...
  10. 关于两仪、三才、四象、五行、六合、七星、八卦、九宫、十方、中医的现代科学猜想全解