目录

1. 基址寻址 EA = (BR) + A

2. 变址寻址 EA = (IX) + A

3. 相对寻址 EA = (PC) + A

4. 例题

5. 小结

6.  附加 堆栈寻址


1. 基址寻址 EA = (BR) + A

基址寄存器可以是 专用寄存器 和 通用寄存器 
区别:
使用专用寄存器的时候,不需要在指令中指出寄存器编号,而是将编号隐含的放在操作码中;只要进行基址寻址这个操作,就自动去寻找相应的专用寄存器;

使用通用寄存器的时候,因为通用寄存器除了要进行基址寻址任务外,还有很多其它任务。所以当某条指令用到它的时候需要给出它的一个编号,编号就填写到指令字的一个字段中。

基址寄存器是面向操作系统的,意思是 其内容只能由操作系统来修改,或者专门设置一个管理程序来修改。
在程序执行过程中,这个内容是不改的(基地址)。通过调整形式地址(偏移量)定位到程序中的不同指令。

使用通用寄存器作为基址寄存器时,用户可以决定由哪个寄存器作为基址寄存器,但是寄存器的内容仍由操作系统确定
这样做的优势是:有利于多道程序设计。(独特优点)

扩大寻址范围的原理是:基址寄存器的位数大于 形式地址A 的位数。(这个是偏移寻址的一个公共优点,后面不赘述。)

LDA 是数据传送类指令 (从一个地方到另一个地方)     
LDA  D  这条机器指令只有一个地址,说明隐含了一个地址,隐含的地址就是ACC (LDA中的 A含义)    
             该指令作用:(D) —> ACC

ADD  D+1 同样是隐含寻址,只给了其中一个操作数地址,另一个隐含在 ACC 中,即  ACC 中的内容和 D+1 当中的内容做加法最后再存回 ACC 中。

==>  实际上,就是完成了 a[0] + a[1] 运算。

蓝色的块放到右侧主存中,要存放的一部分是指令的机器码,一部分是数组对应的每一个元素要放到一串连续的位置中。

如果采用的是直接寻址, D 填的应该是主存中的一个实际位置。
在设计的时候,写的是一个伪代码,暂时不知道 D 应该填多少,代码放入主存后,可以通过查主存代码位置 确认 D 的内容。对应的,后面有 D 的地方也填入该地址,这就是直接寻址需要去做的一件事。
如果要将程序换个位置执行,则需要将 D 的内容改为新的位置,如果程序较多,则意味着要不断查主存状态再去填 D 的内容。

这就是为什么要基址寻址,把我们从繁杂的工作中解放出来。基址寻址的 有利于多道程序设计,表达的是 将程序放在不同的位置后,只需要修改一下基址寄存器即可(该过程由操作系统完成),就能把数据之间的那些地址自动映射过去。

2. 变址寻址 EA = (IX) + A

变址寄存器的内容可变,并不只是赋值,而是还提供一些自增或者自减的功能,这一功能在循环程序中用的很多。

基址寻址的特点更多的是,整个程序在内存中的浮动,变址寄存器就开始涉及到程序实现的细节。

LDA #0     // 把0 存放到 ACC 中                 #代表立即寻址 (形式地址就是操作数)
LDX #0     // 把0 存放到变址寄存器中
                                                        //上面两个都是隐含了一个操作数的指令
ADD X,D     
// 看起来是两个操作数,实际还是隐含寻址。
这个 ADD 使用的是变址寻址,所以需要先计算操作数的地址,变址寄存器当中的内容即(X),再加上形式地址 D,得到操作数的地址,这个地址中的内容 即((X) + D) ,才是操作数。
这个操作数和 ACC 中的操作数做一个加法 ((ACC) + ((X) + D))得到结果存回 ACC 中 。

D 是这个数组的首地址 (a[0]地址),变址寄存器存放的是 0 ,所以 ((X) + D) ==> a[0]  ,
又 ACC 起始存放 0 所以((ACC) + ((X) + D))= a[0] ;  也就是将  a[0] 放到 ACC 中。

INX   ==> IN 表示增加,执行这条机器指令就是将 X+1;

// 这两句主要实现循环的作用。
CPX  #10
BNE M     // 条件跳转指令

在需要处理的元素数量增加时,需要修改的只是 CPX #10 机器语言中的10,整个指令语句数量是没有变的。
这也是为什么变址寻址适合编制循环程序,并且还特别适合处理数组,因为数组元素是连续存放的。如果不连续,没办法通过加一减一操作来定位到新的元素。

3. 相对寻址 EA = (PC) + A

基址寻址更关注的是某一个程序应该放到主存中的哪一块,并且放到不同块的时候,程序可以正常运行的,
而相对寻址的浮动强调的是能够 用于转移指令。
(可以理解为 一个是全局的浮动,一个是内部的浮动)

4. 例题

指令长度是存储字长的两倍,所以需要访存两次才取完指令。
每次取完 PC 都会加1,所以取完指令 PC 会定位到下一个内存地址。

5. 小结


要清楚每一种寻址方式如何生存有效地址,如何定位到这条指令的操作数。
这里的访存次数是指指令执行期间的访存次数。

后面三种是偏移寻址,其基本形式是一样的。特点在于使用不同的寄存器的一些设定,不同的设定有各自的优势。

6.  附加 堆栈寻址

堆栈寻址并不是特别重要,更多是为了知识结构的完整性。
堆栈寻址可以将所有操作数都隐含表示。

入栈和出栈操作要会写.                   ( X是操作数寄存器 )

实际上这个堆栈只要用一堆具有存储功能的单元就能完成,所以也可以用存储器划分出一段专门的区域来做堆栈。一般来说,由于寄存器比较贵,更多的时候使用存储器来实现堆栈。
寄存器实现的堆栈叫做硬堆栈,从主存划分一块区域实现的堆栈叫做软堆栈。两者都需要有一个寄存器来存放堆栈指针。

组原4_指令偏移寻址相关推荐

  1. 计算机组成原理(7)指令系统——偏移寻址、堆栈寻址、CISC和RISC

    上一回主要讲了寻址方式:指令寻址和数据寻址 指令寻址分为定长指令字结构(分为四地址指令.三地址指令等,操作码的长度固定,指令长度固定,就是后面的地址长度进行变化)和变长指令字结构 同时也可分为定长操作 ...

  2. 4.2.3偏移寻址(19)

    偏移寻址:有效地址的产生需要进行运算 基址寻址 基址寄存器的内容加上形式地址A,形成操作数的有效位 可以用基址寄存器存放偏移量,也可以采用通用寄存器 如果使用基址寄存器,不需要指明 如果使用通用寄存器 ...

  3. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03【EC20模组基础串口指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03[EC20模组基础串口指令说明] 一.准备工作 二.硬件环境的搭建 三.基础AT指令的说明和测试 STM32F103学 ...

  4. 飞龙的程序员书单 - 组原、OS、网络

    组原 深入理解计算机系统 简单介绍一下,这本书包括组成原理和操作系统两大部分知识.第二.三章学完之后,逆向就算是入门了.国内的教材很少有拿汇编和C语言对比教学的书籍,这样的教学方法很实用.因为现在汇编 ...

  5. html2canvas图片位移_html2canvas html截图插件图片放大清晰度处理方案,支撑恣意放大倍数,处理原插件图片偏移题目...

    html2canvas html截图插件图片放大清晰度处理方案,支撑恣意放大倍数,处理原插件图片偏移题目 Author:youzebin (2016.12.6) 插件下载地点:https://gith ...

  6. 【组原】机器字长、指令字长、存储字长、存储单元、存储字 的区分

    机器字长: 计算机能直接处理的二进制数据的位数. (机器字长一般等于内部寄存器的大小,它决定了计算机的运算精度.) 指令字长: 一个指令字中包含的二进制代码的位数. 存储字长: 一个存储单元包含的二进 ...

  7. 组原学习笔记三:存储器

    本章知识框架: 目录 一.概述 1. 存储器分类 2. 存储器的层次结构 二.主存储器 1. 概述 1.1 主存的组成 1.2 主存中存储单元地址分配 1.3 主存的技术指标 2. 半导体存储芯片 2 ...

  8. 【组原】广州大学计算机组成原理考试部分题+复习资料(2020-2021)

    文章目录 选择题: 简单题 分析题:(2道) 写在前面:靠着记忆力记录一下2天前刚考完的计算机组成试题,部分题已经不记得了:写到博客记录一下: 选项和考试也是不一样的,考完就忘记了. 记录时间为:20 ...

  9. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03EC20模组基础串口指令说明

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.准备工作 1.软 ...

最新文章

  1. 【译文】怎样让一天有36个小时
  2. javascript数组降维_Javascript实现的数组降维——维度不同,怎么谈恋爱
  3. 程序猿工作效率的影响因素和管理者怎样推断
  4. python入门练习题-Python入门36道经典练习题
  5. 博客园上看到边边的时钟,觉得很好看!推荐
  6. 37.递推:Pell数列
  7. 频谱泄露 振动 matlab,关于MATLAB FFT频谱泄露和加窗
  8. swoole 协程channel乱测
  9. Oracle优化笔记
  10. 学英语---(2)脱口而出100句经典英语口语
  11. 【kafka】 kafka 2.3 版本 生产者和消费者事务 案例
  12. wpf关闭窗口弹出是否确认关闭的提示
  13. MySQLdb操作mysql数据库的两个细节
  14. 机器学习算法总结之Bagging与随机森林
  15. html中引入css样式表的三种方式,css引用的几种方式是什么?
  16. numpy—np.repeat、np.roll
  17. 「长乐集训 2017 Day1」区间 线段树
  18. SQL Server之增删改查
  19. 银联支付,实现代码对接
  20. SQL 配置管理器找不到了

热门文章

  1. 学习编程可以从事哪些行业
  2. 来来来,一起来pick宏基因组binning分析工具
  3. no such file or directory, open '/Users/anna/package.json'的解决
  4. NVIDIA Jetson TK1 rosrun rviz segmentation fault的解决方法
  5. android开发中中按钮 变成红边白底,PS人像换红底为白底等的处理
  6. AD软件PCB转PADS
  7. 期权希腊值之delta【python复现】
  8. zblogphp登录和注册_基于PHP的登录和注册的功能的实现
  9. 微信小程序之个人中心静态页面
  10. 几何画板演示空间几何体三视图的步骤