指令寻址方式与数据寻址方式

【README】

1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐;

2. cpu访存寄存器耗费 10ns,访问缓存(高速缓冲寄存器)耗费20ns,访问主存200ns;访问磁盘1ms;一般情况下,CPU内部执行指令最长耗时是在访问内存(外设除外),所以本文列出了寻址方式是否访存的情况;


【1】指令寻址

  • 方式1: 顺序寻址 , PC+1 -> PC ;PC程序计数器寄存器用于存储要执行的下一条指令的地址;
  • 方式2:跳跃寻址, 如 JMP 7;无条件跳转到7号地址的指令;

【2】数据寻址

【2.1】 指令格式

操作码

寻址特征

形式地址A

形式地址 A:机器指令中操作数的形式地址;

有效地址EA:操作数的真实地址; effective address;

约定: 指令字长=存储字长=机器字长;

【2.2】数据寻址方式(10种)

【2.2.1】立即寻址

形式地址A就是操作数;(无需访存)

【2.2.2】直接寻址

形式地址A就是有效地址EA;(无需访存)

【2.2.3】 隐含寻址

操作数地址隐含在操作码中;根据操作码隐含指出操作数在某寄存器中;(如操作数在寄存器中,无需访存)

【2.2.4】间接寻址

通过访存取出形式地址A指向的内存单元的操作数有效地址EA;再通过访存取出有效地址EA指向的内存单元的操作数;(需要2次访存)

【2.2.5】寄存器寻址

形式地址就是寄存器编号,操作数存储在寄存器中;(无需访存)

【2.2.6】寄存器间接寻址

形式地址就是寄存器编号,但操作数有效地址存储在寄存器中;(需要1次访问寄存器,1次访存);

【2.2.7】基址寻址

操作数有效地址EA等于基址+形式地址A;其中基址存储在专用寄存器或通用寄存器中,形式地址作为偏移量;专用寄存器或BR,通用寄存器如R0;(1次计算,1次访存);(注意,基址不变,但形式地址改变,通常用于多道程序设计)

【2.2.8】变址寻址

操作数有效地址EA等于变址+形式地址A;其中变址存储在变址寄存器IX(或通用寄存器)中;(1次计算,1次访存);(注意,变址可变,但形式地址不变,通常用于遍历数组)

【2.2.9】相对寻址

以pc寄存器作为基址寄存器,形式地址作为偏移量;

【2.2.10】堆栈寻址

操作数存储在堆栈的栈顶中,其中栈底是低地址,栈顶是高地址(SP寄存器存储);

Push:入栈;把ACC累加器的数据压入栈顶(内存);
Pop:出栈:把栈顶元素出栈并存入ACC累加器;


【3】寻址示例:求数组N个元素均值

【3.1】 直接寻址实现

直接寻址步骤(共计N+2条指令)

序号

指令

描述

1

LDA D

把操作数存入ACC累加器中;

2

ADD D+1

把ACC内容与D+1内容相加;和存入ACC;

3

ADD D+2

把ACC内容与D+2内容相加;和存入ACC;

4

……

此处省略100字

5

ADD D+(N-1)

把ACC内容与(N-1)内容相加;和存入ACC;

至此,N个数据的累加和已完成,结果存入到ACC中;

6

DIV #N

求ACC中和的均值

7

STA ANS

保存结果到内存单元

【3.2】变址寻址实现

变址寻址步骤(共计8条指令)

序号

指令

描述

1

LDA #0

把ACC累加器清零;

2

LDX #0

把IX变址寄存器清零;

3

ADD X, D

把变址寄存器IX的内容和指令中的形式地址存储的操作数做加法,结果存入累加器ACC;D为形式地址,如数组0号元素地址;

4

INX

变址寄存器IX自增1;

5

CPX #N

Compare-变址寄存器IX 与 N做比较;

6

BNE M

Not equal-若不等,则跳转到M号指令(M=3);

通过这个循环,我们累加;

7

DIV #N

求和的均值

8

STA ANS

保存结果到内存单元

【小结】直接寻址和变址寻址对比:
直接寻址需要n+2条指令;而变址寻址只需要8条指令即可(变址寻址性能更优)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python oj 输入_Python写OJ题时输入问题

# encoding: utf-8Created on Nov 6th, 2014author: SpeedcellPython的输入是野生字符串,所以要自己转类型strip去掉左右两端的空白符,返回strslipt把字符串按空白符拆开,返回[str]map把list里面的值映射到指定类型,返回[type]EOF…

本地缓存的原理及技术选型参考

转载自 本地缓存的原理及技术选型参考互联网架构设计的五大要素:高性能、高可用、可伸缩性、可扩展性、安全。如何做到高性能、高可用,缓存是一大助力。我们知道,绝大部分的时候,读数据写数据符合二八定律。并且读数据中&#xff…

程序员欢呼:微软Bing开始支持搜索源码、可直接运行

日常生活中,程序员们经常会遇见这样那样的问题,比如忘记了代码该怎么写,又或者需要实现一些特殊的算法和功能。这时候,你就可以去找微软 Bing 帮忙啦! 微软最近联合 HackerRank 一起研发了一项新功能:源代码…

rabbitmq创建缓存连接工厂

转自: 【RabbitMQ-3】连接池的配置_小胖学编程的博客-CSDN博客文章目录1. rabbitmq的connection连接池1.1 问题提出1.1.1 Connection对象管理以及性能1.1.2 Channel对象管理以及性能1.2 Spring AMQP线程池配置1.2.1 ConnectionFactory连接工厂1.2.2 消费发送和接收…

python简短语法_写出优雅简洁的 python 语法(二)函数传参

Python中函数传递参数的形式包含多种,可根据情况而定使用哪种方式。基本所有语言都有简介明了的语法去替代繁琐的代码,优雅的写法不仅能提升代码美观,更能提高提高开发效率,让代码更加易读。位置传递,默认参数位置传参…

你真的了解Java中的三目运算符吗

转载自 你真的了解Java中的三目运算符吗三目运算符是我们经常在代码中使用的,a (bnull?0:1);这样一行代码可以代替一个if-else,可以使代码变得清爽易读。但是,三目运算符也是有一定的语言规范的。在运用不恰当的时候会导致意想不到的问题。本文就介绍一…

关于.NET下开源及商业图像处理(PSD)组件

1 前言 这篇博客的背景是:为了完成吉日嘎拉的“PSD文件损坏检测和图层检测”任务,查找了目前.NET各种开源的及商业的图像处理资料,在完成任务之后,进行总结。此次任务主要是用C#操作PSD(PhotoShop)文件,中文资料很少&a…

SpringBoot连接多RabbitMQ源

转自: SpringBoot连接多RabbitMQ源 - 掘金在实际开发中,很多场景需要异步处理,这时就需要用到RabbitMQ,而且随着场景的增多程序可能需要连接多个RabbitMQ。SpringBoot本身提供了默认的配置可以快速配置连接RabbitMQ,但…

满足其中一个条件则可_农村分户好处多,但并非人人都可分户!满足这4个条件才可以申请...

分户,一般指子女成年或者成家后从父母户口里面独立出去,自立一户;也可以是指夫妻离婚后一方将户口独立出去(离婚也可以不分户,变更婚姻状态就行)。简单的说分户是指原本在一个户口本上的人口,现在分出去自成一个户口本…

Synchronized的实现原理(一)

转载自 Synchronized的实现原理(一)synchronized,是Java中用于解决并发情况下数据同步访问的一个很重要的关键字。当我们想要保证一个共享资源在同一时间只会被一个线程访问到时,我们可以在代码中使用synchronized关键字对类或者对…

FOSS历史回顾:三代开源人的故事

现在是2016年,你环顾一下四周,开源早已无处不在了。开源无论是规范、形式、以及面貌都和最初的大相径庭,然而事实上,这也预示着新一代的开源程序员们的崛起。下面我们尝试解释下。 (以下这一段落为作者自谦&#xff09…

Spring中@Autowired、@Qualifier、@Resource的区别

转自: Spring中Autowired、Qualifier、Resource的区别_老周聊架构的博客-CSDN博客_qualifier和resource区别1、AutowiredAutowired 可以单独使用。如果单独使用,它将按类型装配。因此,如果在容器中声明了多个相同类型的bean,则会…

map分组后取前10个_海关数据 | 图解前10个月外贸

*内容转载自微信公众号:海关发布RECOMMEND【 推荐阅读 】海关数据 | 图解前三季度我国外贸海关数据 | 图解8月外贸海关数据 | 一图看懂前7个月外贸海关数据 | 图解上半年度外贸增3.9%声明本微信订阅号不以商业营利为目的,不排除部分文字内容或图片转载自…

回顾build 2016:你好,这是微软迄今最好的Windows开发平台

按:本文作者陈计节,ThoughtWorks 高级咨询师。多年的跨平台 .NET 开发者,全栈工程师,技术布道师。擅长互联网应用程序的设计、开发和运维等工作。 在最近的开发者大会(Build 2016)上,微软面向开…

深入理解多线程(二)—— Java的对象模型

转载自 深入理解多线程(二)—— Java的对象模型上一篇文章中简单介绍过synchronized关键字的方式,其中,同步代码块使用monitorenter和monitorexit两个指令实现,同步方法使用ACC_SYNCHRONIZED标记符实现。后面几篇文章会…

8.1-CPU结构(学习笔记)

【README】 本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐; 【1】CPU结构 Cpu的首要功能就是解释指令;功能列表如下: 1) 取指令:从内存中读取…

生物信息 python 书籍_用python做生物信息数据分析(1-环境准备)

写在前面四五年前,接触生物信息的时候,阴差阳错,我选择用perl。事实上,直到嫌我,我还是认为我当初的选择,完全正确!。在做一些小文本的快速处理上,perl在我看来,从来最优…

8.2-指令周期(学习笔记)

【README】 本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐; 【1】指令周期 【1.1】指令周期概述 1)指令周期:取出并执行一条指令所需的全部时间&#xff1…

深入理解多线程(三)—— Java的对象头

转载自 深入理解多线程(三)—— Java的对象头上一篇文章中我们从HotSpot的源码入手,介绍了Java的对象模型。这一篇文章在上一篇文章的基础上再来介绍一下Java的对象头。主要介绍一下对象头的作用,结构以及他和锁的关系。 Java对象…

python tkinter 背景色改变不了_python - Tkinter背景颜色问题 - 堆栈内存溢出

我有一个脚本,其中包含Tkinter模块,我想每隔3分钟更改一次背景颜色,例如绿色3分钟,然后橙色,然后红色。 我有显示绿色的代码,但无法更改它。当我在代码中创建函数时,会遇到一些不同的错误&#…