![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
组成原理
文章平均质量分 53
DrCrypto
这个作者很懒,什么都没留下…
展开
-
由一道习题看如何设计浮点数
一道浮点数计算的题目,计算了很长时间,最终结果还是因为部分细节出错,导致全盘皆错,因此,有必要认真总结浮点数计算牵涉到的方方面面的数据表示的细节。这个过程本身相当有趣,因为人脑在处理二进制方面并没有十进制那种直觉。尤其是当在补码下计算,总是得先进行一次数据的反加1才能看出数字的本意,进行一个减法,也需要默念,将减数连通符号位求反加一再和减数相加。甚至不如直接进行十进制数的加减再换算为补码。。这个过程原创 2016-09-24 15:12:45 · 4313 阅读 · 5 评论 -
低字节+高字节+字地址+大端序+小端序全辨析
本次总结这个知识点的起因是一道相对寻址题中把这个知识点作为基本条件,然而其他的问题我都明白,却卡在了低字节为字地址的存放方式中。因此有必要再次进行细致的回顾总结。先看这道题目,作为一个句柄。 设相对寻址的转移指令占用三个字节。第一个字节为操作码,第二,三个字节为相对位移量(补码表示),而且数据在存储器中采用以低字节为字地址的存放方式。每当CPU从存储器中取出一个字节时,即自动完成(PC) + 1原创 2016-10-03 14:12:57 · 31333 阅读 · 19 评论 -
微程序控制器的组成及原理总结
基本概念这一部分像是微观版本的计算机部件之间的关系缩影。在我们可见的模块关系中,主存,CPU之间的数据流,控制信号的传输,指令的执行过程等都比较熟悉了。而在微程序控制这边,很多设计思路是一脉相承的,在外部是存储程序,在这里是存储逻辑,之所以叫逻辑,只是表达微程序更多是对控制信号的作用。与硬布线控制组合逻辑也形成对应。核心思想是:把每条机器指令转化为一段微程序,并把这段微程序存入控制存储器(Contr原创 2016-10-06 14:35:31 · 22449 阅读 · 6 评论 -
多模低位交叉编址
首先需要从地址的设计上理解:低位是体号,高位是体内地址。 这是最核心的部分,忽略掉这个,多模低位交叉编址的理解就无从谈起了。为什么这么说呢?因为,我们知道地址是从低到高增长的。那么,体号在低位的时候,该怎么控制呢? 这里,设计的有多个存储模块,而且这些模块必须长相一样,因此呢,体内的地址编法也是同步增长的。比如共4个模块体,分别编号为0,1,2,3. 访问的时候,体号为0时,访问模块体0高位地址原创 2016-11-10 15:58:31 · 9979 阅读 · 1 评论 -
移码的再总结
移码的再总结@(组成原理)在总结原码,反码,补码的表示范围时,忽略了对移码的总结,现在看移码本身的表示范围与IEEE754使用的特殊阶码,有点迷惑,思考后才明白,这其中的关节。首先我们明白移码与补码有相同的表达能力。也就是说,给定相同的机器字长,它们的表达范围相同。比如,8位机器字长,都用1位表达正负。 则补码的表示范围:[−27,+27−1]=[−128,+127][-2^7,+2^7-1] =原创 2016-11-02 17:36:22 · 26354 阅读 · 9 评论 -
汇编语言程序vs. 汇编程序
汇编语言程序vs. 汇编程序@(组成原理)这是个常常被人拿来挖坑的地方。汇编语言程序就是你用汇编语言写的文本型的程序,我们说用一堆助记符来写的源代码。汇编程序是汇编阶段用来把汇编语言翻译成机器语言指令的程序。二者是不同的概念。比如有些时候问,计算机能够直接执行的是:A. 机器语言程序 B. 汇编语言程序 C. 硬件描述语言程序汇编语言程序需要经过汇编以后得到机器目标语言,是二进制程序,才能被硬件原创 2016-12-02 13:37:48 · 3582 阅读 · 0 评论 -
标志寄存器总结
标志寄存器总结@(组成原理)标志寄存器也称作:状态寄存器(PSW)。存放内容有:条件码标志控制标志系统标志总共分为:6个状态标志位CF-进位/借位标志:加法时产生进位,减法时借位则CF=1,不然为0;CF反映的是最高位是否借位。AF-辅助进位标志,供BCD码使用,一般不太关注这个。OF-溢出标志,带符号数计算时超过了字长表示的范围,则溢出OF=1ZF-零标志,运算结果为0,则ZF=1原创 2016-11-18 14:43:06 · 1555 阅读 · 0 评论 -
补码,反码,原码的范围总结
刚刚碰到一个题目,需要写出一种浮点数范围的题。 原题如下 假定一种浮点数格式是11位数符,77位阶码,88位尾数。其中尾数用补码表示,阶码用移码表示。 问,此格式可以表示的数据范围。无疑,我们不用关注下溢的问题,只用找出最大正值和最小负值即可。这里有两个重点:阶码的表示范围和尾数能够表达的范围。我们知道IEEE754的尾数是用原码表示,默认高位是1,在补码这里没有。我们纯粹关心8位补码能表示多原创 2016-09-21 14:50:04 · 9393 阅读 · 0 评论 -
浮点数的加减计算总结
首先要说的是:浮点运算中的下溢指的是:运算结果的绝对值小于机器数所能表示的最小绝对值。再看告知浮点数的格式,最大值问题: 设浮点数共12位,其中阶码含1位阶符共4位,以2为底,补码表示。尾数含一位数符共8位,补码表示,规格化。该浮点数所能表示的最大正数是?解答:首先,我们马上可以构想出补码最大时的样子,因为和原码一样,是0.1111111…1形式。 这里呢,尾数含数符共8位,所以是0.11111原创 2016-09-22 15:41:52 · 19006 阅读 · 0 评论 -
寻址范围总结
基本不出两种情况。以下是例子,真正弄懂就差不多不用害怕了。假设CPU有20根地址线,32根数据线,试问按字节和字寻址,寻址范围分别是多少? 解答:首先,默认情况下,地址线的位数对应的都是按字节寻址。但是如果题目中数据线就只有4根,还当默认按字节寻址,那就大错特错了。因为数据线才4根,一次读写只能4个bit,根本不可能做到按字节寻址,这里的数据线有32根。所以可以大胆放马过来。 如果是按原创 2016-08-28 18:00:50 · 14388 阅读 · 0 评论 -
浮点数运算中的舍入问题
前面讲到了浮点数计算时候的步骤:对阶,尾数求和,规格化。没有细细研究舍入的问题。需要提出的是,阶码是小的向大的看齐,因此尾数求和阶段只有右移,没有左移。在规格化阶段,尾数超过加和溢出,需要右移。高位不是1的时候就左移。 左移,阶码要-1,右移,阶码要+1. 我以为自己懂了,但是真的遇到问题,才发现有一处不明,导致全盘皆不明。书上提供了两种舍入的方法,一种是0舍1入法,一种是恒置1法。具体解释是这原创 2016-09-24 09:50:44 · 32355 阅读 · 18 评论 -
宏观角度看数字编码
宏观角度看数字编码@(组成原理)在二进制的世界中,对数字编码,无论是原码,反码,还是补码,移码等,都是用的二进制的离散状态标记数字。因此,抓住离散状态的分配就抓住了核心。从原码看起,因为+0和-0是不同概念,浪费了一个编码。反码只是原码反着编,同样浪费了一个。补码呢,就没有这个问题,且因+0都一样,所以-0这个编码就可以用到最小的负数编码上。比如四位整数,数据位占用3位,符号位占用一位,则在原码下,原创 2016-11-01 16:37:00 · 523 阅读 · 0 评论 -
再看结构体对齐与小端联合问题
再看结构体对齐与小端联合问题@(组成原理)先再次回看一道题目的分析。(2012.15)某计算机存储器按字节编址,采用小端方式存放数据。假定编译器规定int型和short型长度分别为32位和16位,并且按照边界对齐存储。某C语言程序段如下:struct{ int a; char b; short c; }record;record.a = 273;若record变量的首地原创 2016-11-16 18:49:39 · 1096 阅读 · 0 评论 -
深入研读Cache存储的计算
假设某个计算机的主存地址空间是256MB,按照字节编址,其数据Cache有8行,行长有64B.从这道题目里要好好领悟Cache策略的优美之处。1)不考虑用于Cache的一致性维护位和替换算法控制位,并且采用直接映射方式,则该数Cache的总容量是多少?2)若该Cache采用直接映射方式,则主存地址为3200(十进制)的主存对应的Cache行号是多少?若采用二路组相连映射又是多少?解: 首先,这类题目原创 2016-09-28 14:33:54 · 15613 阅读 · 10 评论 -
Cache缺失率的计算原理
Cache缺失率的计算@(组成原理)Cache缺失率的考察可以直接结合着直接映射知识点的考察,且综合性难度更大一些。再次思考Cache的基本原理,要从读写两个角度深入思考。 Cache和主存都被分为若干大小相等的块,Cache块还可以称作Cache行。每块由若干字节组成,块的长度称为块长。由于Cache的容量远远小于主存的容量,所以Cache中的块数要远少于主存中的块数。仅仅保存主存中最活跃的若原创 2016-11-22 15:50:18 · 23061 阅读 · 31 评论 -
思考PC的位数设计
思考PC的位数设计@(组成原理)前面专门讨论过PC的自增长问题。但是并未思考过PC的计算原理是什么。这里以一道题目来再次思考这个问题。(2016.18)某计算机主存空间是4GB,字长是32位,按照字节编址。采用32位定长指令格式,若指令按照字边界对齐存放,则程序计数器PC和指令寄存器IR的位数至少分别是:B A. 30, 30 B. 30, 32 C. 32, 30 D. 32, 32分析:原创 2016-11-22 16:10:54 · 16315 阅读 · 15 评论 -
PC自增与转移地址计算问题总结
PC自增与转移地址计算问题总结@(组成原理)在之前的文章中强调过PC的自增问题,以及提到了一点点PC转移时的计算问题。但是没有对PC自增以后与偏移值相加时会碰到的补码运算问题。此处做一个补充。http://blog.csdn.net/u011240016/article/details/52723779?locationNum=2&fps=1http://blog.csdn.net/u0112400原创 2016-12-05 16:55:55 · 6347 阅读 · 0 评论 -
程序中断
中断请求触发器(INTR),中断屏蔽触发器(MASK)二者成对出现。 接口中的完成触发器D,为1表示设备准备就绪。 中断源:凡是能够向CPU提出中断请求的各种因素都叫中断源。因此,有多个中断源,但是,CPU某一时刻只接受一个中断源。那么其他的中断源怎么办? 老办法:排队等候啊。 如何选择中断源?也是老办法,谁优先级高就选谁。正在处理中断呢,能不能被打断? 答案是可以的,优先级的作用也在这里原创 2016-08-30 17:02:28 · 4278 阅读 · 4 评论 -
如何设计扩展操作码--应用
在下面这一篇讲过一点点基础原理。 http://blog.csdn.net/u011240016/article/details/52717315如果是给定指令字长,再给你一些需求,如何设计满足需求的指令格式? 光说没用,以实例求证。 假设指令字长是16位,操作数的地址码是6位,指令有0地址,一地址,二地址三种。第一道 1)设固定操作码,若0地址指令有M种,一地址指令有N种,则二地址指原创 2016-10-01 14:44:04 · 7336 阅读 · 3 评论 -
Cache计算的再总结
这部分的知识,虽然考点很少,我也常常感觉自己能够非常熟练的演绎出访问过程,给出计算结果。但是每次遇到一个新的题,总会有一小会的卡顿,然后心情就紧张一下。再分析两个题目,熟悉一下。假设脑海中是一个宏观的印象,那么需要抓住的核心是:定位主存块号。 核心的过程是将主存块映射到Cache块,其次才是策略的选择。 而定位主存块号的角度通常有:告诉你十进制的主存地址或16进制的主存地址,以及主存容量是Cac原创 2016-09-30 13:48:54 · 25115 阅读 · 7 评论 -
补码加减法判断进位判断是否溢出的总结
通常我们说的加减法进位方式判断是否溢出一般指的都是补码方式运算下的。无论是以为符号位还是两位符号位,逻辑是相同的。先由一位符号位说起。 假设是5位机器位,一位用作符号位,四位用作数据位,那么数据的表示范围是: -2^4 ~ 2^4-1 即:-16~15因此我们上来就看一个溢出的例子,形成一种直观的感受: -8-9 = -17,果断是溢出的。补码表示 1,1000 1,0111原创 2016-09-18 00:45:19 · 54104 阅读 · 15 评论 -
虚拟存储的要点
基本概念首先问一个问题:虚拟存储的总容量会大于辅存和主存之和吗?为什么这么问,是因为我最开始以为既然是虚拟存储,自然可以无限制的往大了虚拟,具体虚拟多少,具体问题具体分析。但是,请看基本定义,常常被忽略(至少我是这样的人。。)。 虚拟存储器:将主存和辅存的地址空间统一编址,形成一个庞大的地址空间。在这个空间中用户可以自由编程,而不必在乎实际的主存容量和程序在主存中实际的存放位置。何为庞大看明白了吗原创 2016-09-30 14:08:42 · 2126 阅读 · 2 评论 -
微程序相关的两个知识点
互斥与相容微命令计算 某计算机的控制器采用微程序控制方式。微指令中的操作控制字段采用字段直接编码(区别于直接编码)法,共有33个微命令,构成5个互斥类,分别包括7、3、12、5、6个微命令。则操作控制字段至少有15位。解释:字段直接编码就是把微命令多个段,段的数目等于互斥类的数目。因此这里分为5个段,每段里要留一个离散状态表示自己没命令。所以7个微命令对应3位,3个微命令对应2位,12个微命令原创 2016-10-06 15:00:49 · 10989 阅读 · 4 评论 -
关于外部测试字段解释冲突
关于外部测试字段解释冲突@(组成原理)看版本1的解释:某机器共有52个微操作控制信号。构成5个互斥类微命令组,各组分别包含5,8,2,15,22个微命令。已知可以判定的外部条件有2个,微命令字长是28位。 1)按照水平型微指令格式设计微命令,要求微指令的下地址字段直接给出后续微指令地址。 2)指出控制存储器的容量。分析:微命令分组这个没有问题,注意留出一个不发命令的状态即可,所以是:3,4,2,原创 2016-12-12 17:11:40 · 6075 阅读 · 0 评论 -
关于指令执行周期的细节思考
关于指令执行周期的细节思考@(组成原理)(取自2012.44)五段流水线:取指(IF)、译码/读寄存器(ID)、执行/计算有效地址(EX)、访问存储器(M)、结果写回寄存器(WB)。流水线按序发射,按序完成。不采用数据转发技术,并且同一个寄存器的读和写操作不能在同一个时钟周期内进行。只看一个方面的问题:若高级语言程序中某赋值语句为:x = a+b,x,a,b均为int型变量,它们的存储单元地址分别为原创 2016-12-15 23:29:39 · 4842 阅读 · 0 评论 -
左移右移小总结
左移右移小总结@(组成原理)关于数的移位,特别需要注意正数,三码相同,所以无论左移还是右移都是补0.而负数的补码就需要注意,左移在右边补0,右移需要在左边补1,有一个很有趣的误区是,认为符号位保持不变,仅仅移动数据位,这是不对的,因为无论数据位还是符号位,都是二进制,在整体大迁移的过程中,符号位也是要跟随潮流的。只不过,为了保证右移后,和原来的符号数一样,因此,负数在右移时左边补1.比如8位机器数(原创 2016-12-11 16:30:42 · 24996 阅读 · 0 评论 -
扩展码再思考
扩展码再思考@(组成原理)之前有总结过比较规整的情况下,如何计算扩展码的问题。同时强调了扩展码要抓住操作码位数扩大的方向,同时是地址减少的方向。可以类比IP地址子网划分时,子网号扩大,则主机号变少。本质都是在有限字长上的二进制计算。http://blog.csdn.net/u011240016/article/details/52717315再思考一个问题: 某指令系统指令字长是8位。每一地址码原创 2016-12-06 16:47:48 · 2657 阅读 · 0 评论 -
动态半导体刷新周期
动态半导体刷新周期@(组成原理) 动态半导体存储器利用电容存储电荷记录。电容会放电,因此必须在电荷流失前对电容充电–刷新。刷新分为两步:读取并放大信息存入信息因此,刷新其实是信息的再生过程。刷新按照行来进行。刷新一行的时间为一个存取周期。刷新放大器集成在RAM上。这里极易引起歧义的是,既然分为两个阶段,一读一写,自然是两个存取周期,实际不然。此处的读不是CPU读取主存,此处的写也不是CP原创 2016-12-06 16:25:16 · 2329 阅读 · 1 评论 -
扩展操作码的总结
需要建立的一种直观的认知是:既然是扩展操作码,就意味着操作码的位数越变越多! 之所以这么强调,是因为常常混淆了操作码的扩展方向。再看扩展的原理: 假设指令字长是16位,平均劈开成4份,高位4位用作操作码,低12位分别用作三个地址码。那么操作码的个数就是四个二进制所能表达的离散数目:24=162^4 = 16OK,如果地址码只能做地址码,这是最终的结局了。 但是,如果地址码可以化身为操作码,这并原创 2016-10-01 13:51:55 · 44780 阅读 · 35 评论 -
访问Cache和主存的效率计算问题
第一,看命中率的定义:CPU欲访问的信息已经在Cache中的比率称之为命中率。 设程序在执行期间,Cache的命中次数是Nc,访问主存的次数是Nm,则命中率H = Nc / (Nc+Nm)平均访问时间Ta = Htc + (1-H)tm.看一道习题理解两种策略的不同:同时访问Cache和主存,Cache命中时中断访存 || 先访问Cache,没有时在访问主存调入Cache再从Cache中拿数原创 2016-09-28 14:35:07 · 21932 阅读 · 1 评论 -
存储系统
基本名词预览RAM:随机存取,易失性存储器,断电即消失 ROM:随机存取,非易失性存储器。字长:一次存取操作的数据量 存取时间(Ta)=启动一次存储器操作到完成该操作的时间,读出或写入存取周期(Tm):连续两次独立地访问存储器操作(读或写)之间所需要的最小时间间隔。大于存取时间。因为读写操作后有一段恢复时间。 存取时间一般小于存取周期。主存带宽:数据传输率每秒从主存进出信息的最大数量相联存原创 2016-08-28 17:48:26 · 3768 阅读 · 1 评论 -
Cache之组相连映射
简单说就是,组相连映射是直接映射和全相连映射的一种折中。具体的执行策略是:将Cache进行分组,数量记为Q,每组有R个字块。 设i是Cache的组号,j是主存的块号,那么一个主存块怎么映射到组中呢? i = j mod Q根据这个计算式,应该明白,相邻的主存块映射在不同Cache组中。那么我们需要仔细研究一下这个时候的主存地址怎么分配。格局和直接映射比较相似:分为高m位和低b位。 高m位也分为原创 2016-08-28 17:08:07 · 10002 阅读 · 1 评论 -
中断占据CPU时间的计算问题
某计算机主频是50MHz,采用定时查询的方式控制设备A的I/O,查询程序运行一次所用的时钟周期至少是500.在设备A工作期间,为保证呢个数据不丢失,每秒需要对其查询至少200次,则CPU用于设备A的I/O的时间占据整个CPU时间的百分比至少是:0.20%。分析:如果真的查询到A有I/O请求了,那么CPU将完全用于A的I/O,因此,这里的情况是A并没有发起I/O,CPU作为大家长,要定期查询用掉的时原创 2016-10-12 13:54:13 · 11194 阅读 · 2 评论 -
关于DMA的两个小知识点
本篇不是完整谈DMA的工作原理,而是说一说犯错的两个点。 能产生DMA请求的总线部件是(B) I.高速外设 II. 需要和主机批量交换的外设 III.具有DMA接口的设备 A.只有I B.只有III C.I、III D. II、III分析:只有具有DMA接口的设备才能产生DMA请求。但是,这里并没有说请求是DMA产生!因为真正的请求还是来源于外设。只不过外设将请求发到DMA控制原创 2016-10-12 14:28:10 · 2196 阅读 · 0 评论 -
DRAM的动态刷新问题总结
直接看一个问题: 一个1K x 4位的DRAM芯片,若其内部结构排列成64 x 64形式,且存取周期为0.1us。 1)若采用分散刷新和集中刷新相结合的方式,即用异步刷新的方法,刷新的信号周期应取多少? 2)若采用集中刷新,则对该存储芯片刷新一遍需要多少时间?死时间率是多少?这种问题问的都是很直接的,前提要理解这些刷新的工作原理。对于1)异步刷新,我们只需要计算一个时间间隔即可,这原创 2016-09-25 15:02:05 · 10876 阅读 · 4 评论 -
大端模式和小端模式的再理解
首先看一段程序:#include <stdio.h>int main(){ int a = 100; int b = 200; int c = 300; printf("%p\n",&a); printf("%p\n",&b); printf("%p\n",&c); return 0;}看输出结果:0x7fff52499ad8 // a原创 2016-09-25 13:59:05 · 838 阅读 · 0 评论 -
数据规格化的总结
首先,原码的尾数规格化形式是很简单的: 正数的形式是:0.1xxxxxx…x,自然最大值就是0.1111111….1, 最小值是0.10000….0 负数的形式是:1.1xxxxxx…x,自然最小值就是1.111111….1, 最大值是1.1000…..0因为我们很轻松就能联系到:小数的最高位必须是1.那么到补码表示的时候,这个规则就不成立了吗?不是,这也是补码尾数规格化的依托。因此,正小数的原创 2016-09-21 15:04:48 · 27740 阅读 · 16 评论 -
总线操作与定时
总线定时:总线在双方交换数据的过程中需要时间上配合关系的控制。这种关系称为总线定时。实质是一种协议或规则。有同步与异步两种。传输的四个阶段: 申请分配:主模块提出申请,经过总线仲裁机构决定下一个传输周期总线给谁用。 寻址:取得了使用权的主模块通过总线发送本次要访问的从模块及有关命令,启动参与本次传输的从模块。 传输:主从开始数据交换。 结束 :撤出系统总线,让出使用权。同步定原创 2016-08-28 17:28:03 · 4918 阅读 · 0 评论 -
unsigned int数相减时候的trick
假设是8位的unsigned int整数。 一个是x=134,一个是y=246.首先拿过来就是计算它们的二进制位: 134 = 1000,0110B 246 = 1111,0110B因为是无符号数,所以解释成正数,也就意味着这样的看似原码的二进制位就是补码表示,也可以理解为符号位在第九位藏着一个0.这里主要讨论一个细节: 134-246的计算过程。 是不是想直接用134-246得到一个-9原创 2016-09-18 01:34:44 · 2789 阅读 · 3 评论 -
补码加减法
基本的规则就是: 加法: 整数: [A]补 + [B]补 = [A+B]补 (mod 2^(n+1)) 小数: [A]补 + [B]补 = [A+B]补 (mod 2)减法: 整数: [A-B]补 = [A]补 + [-B]补 (mod 2^(n+1)) 小数: [A-B]补 = [A]补 + [-B]补(mod 2) [-B]补的求法就是 [B]补的连同符号位在内,每位求反加一原创 2016-09-04 17:07:49 · 39794 阅读 · 9 评论