计算机组成与结构概述Word格式文档下载.docx
- 文档编号:4710790
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:37
- 大小:914.13KB
计算机组成与结构概述Word格式文档下载.docx
《计算机组成与结构概述Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机组成与结构概述Word格式文档下载.docx(37页珍藏版)》请在冰点文库上搜索。
Intel80x86(Pentium4),IBM/MotorolaPowerPC(Macintosh),ARM,IntelIA64
RISC思想(精减指令集)
指令集更小,更简单,从而能有效构建更快硬件.
由软件通过组合简单运算来完成复杂运算.
为什么MIPS,而不是Intel的X86?
1.MIPS简单,漂亮。
不希望大家被一些细节所困扰(只见树木,不见森林);
2.MIPS广泛应用于嵌入式系统,x86很少应用嵌入式系统,而嵌入式计算机比PCs机多很多;
3.中国芯?
龙芯I代,II代(95%MIPS),获得MIPS授权.
*寄存器registers
与高级语言不同(如C或Java),汇编语言不能使用变量
为什么呢?
让硬件简单一些
汇编语言的操作数是寄存器registers
寄存器位于计算机硬件的某个特殊位置,数量有限
操作只能在寄存器上进行!
MIPS寄存器数量:
32个
为什么?
越小(少?
)越快——Smallerisfaster
优点:
由于寄存器在硬件中,其访问速度非常快(10亿分之一秒——1billionthofasecond)
缺点:
由于寄存器在硬件中,其数量有上限——32个
变量多于32个怎么办?
放在核心硬件外面,用的时候拿进来
效率问题
如果不是太多:
仔细编写代码来高效使用寄存器
A=3B=4C=A+BD=A-BE=C*DF=C/D使用6个
A=3B=4C=A+BD=A-BA=C*DB=C/D使用4个
A=3B=4C=A+BA=C-BA=C-BB=C/AA=C/A使用3个
每个MIPS寄存器是32位宽
在MIPS中我们将32位组织在一起,称为字word
寄存器编号:
0到31
每个寄存器可通过编号和名字来指定
通过编号指定:
$0,$1,$2,…$30,$31
C语言(其他大多数高级语言也一样)中,变量首先要声明并给定一个类型
例如:
intfahr,celsius;
chara,b,c,d,e;
每个变量只能表示其所声明的类型的值(不能混用及比较int型和char型变量).
在汇编语言中,寄存器没有类型;
运算(符)决定如何处理寄存器,即运算(符)确定寄存器内容的数据类型.
*例1:
a=b+c+d-e;
(注意理解)
add$t0,$s1,$s2#temp=b+c
add$t0,$t0,$s3#temp=temp+d
sub$s0,$t0,$s4#a=temp-e
例2:
f=(g+h)-(i+j);
add$t0,$s1,$s2#temp=g+h
add$t1,$s3,$s4#temp=i+j
sub$s0,$t0,$t1#f=(g+h)-(i+j)
MIPS汇编语言中:
寄存器=变量
一行一条指令(简单操作)
C变量:
$s0-$s7,对应寄存器16~23;
临时变量(temporary):
$t0-$t7,对应寄存器8~15;
Zero:
$zero
立即数:
数值常数
代码中经常出现,因此有专门的指令.
加立即数指令(AddImmediate):
addi$s0,$s1,10(inMIPS)
f=g+10(inC)
这里MIPS寄存器$s0,$s1对应于C变量f,g
语法和add指令类似
区别:
最后一个参数是数,而不是寄存器register
*没有减立即数
C变量映射到寄存器,但寄存器有限
超过32个元素的数组怎么办?
一般把这种数据结构放在内存memory中
MIPS算术指令仅能对寄存器操作,不能直接操作内存.
数据传送指令在寄存器和内存之间传送数据:
内存到寄存器;
寄存器到内存
*指定内存地址:
寄存器:
包含指向内存的指针
数值偏移量offset(以字节为单位)
内存地址为这两个值的和
*例:
8($t0)
内存地址为:
$t0的值+8(字节)
Load指令语法(InstructionSyntax):
12,3(4)
1是指令名字(operationname)
2是接收值的寄存器(registerthatwillreceivevalue)
3数值偏移量(单位:
字节)numericaloffsetinbytes
4包含指向内存指针的寄存器(registercontainingpointertomemory)
MIPS指令名字(InstructionName):
lw(意即LoadWord,故每次装入32位即一个字)
*
例:
lw$t0,12($s0)
该指令取出$s0中的指针,加上12,然后从计算的和所指的位置的内存中取得值,放到$t0中.
$s0称为基寄存器baseregister
12称为偏移offset
偏移通常用于访问结构体或数组的元素:
基寄存器指向结构体或数组的起始位置(注意偏移量必须是常数(即在编译时已知)).
*sw(即StoreWord,每次存储32位或一个字)
例:
sw$t0,12($s0)
该指令将$s0中的指针加上12,得到内存地址,然后把寄存器$t0中的值存储到该内存地址中
*lw和sw一个是取出,一个是存储,注意区分
重要概念:
寄存器可以保存任意32-位数值.该值可以是
对于add$t2,$t1,$t0
$t0和$t1中一般为数值
而对于lw$t2,0($t0)
$t0中一般为指针
不要混用!
内存中的每个字都有地址,这和数组中的下标类似
早年的计算机对内存的编号方法类似于C对数组的编号:
Memory[0],Memory[1],Memory[2],…
计算机既要访问8-位字节也要访问字(4bytes/word)
现代计算机按字节编址,(即,“字节寻址”)因此相临两个32-位(4byte)字的地址差别为4.Memory[0],Memory[4],Memory[8],…
*lw如何确定C变量A[5]的偏移量?
A[5]4x5=20:
bytev.word
手工编译以下语句:
g=h+A[5];
g:
$s1,h:
$s2,$s3:
A的基地址
首先将数据从内存传到寄存器:
lw$t0,20($s3)#$t0getsA[5]
将20与$s3相加来选定择A[5],放到$t0中
然后将结果和h相加,并放到g中
add$s1,$s2,$t0#$s1=h+A[5]
*缺陷:
经常会忘记,对于计算机的操作单位“字”序列,但在机器编址是字节。
故两个相临的字之间地址不是差一个。
很多汇编程序员常犯的错误是,取下一个地址时,简单加1。
另外,谨记对于lw和sw,基址和偏移量之和必须是4的倍数(即需要字对齐alignment)
注:
Aligned:
对齐的.
法则:
寄存器PK内存
如果变量数比寄存器个数还多,怎么办?
1.编译器试图把最常用的变量放到寄存器中
2.不是很常用的变量放到内存中:
spilling
为什么不把所有变量都放到内存中呢?
1.Smallerisfaster:
寄存器比内存快
2.寄存器能力更强:
MIPS一个算术指令就可以完成,读两个数,进行运算,并写结果
MIPS一个数据传送指令只能读或写一个操作数,而无运算
C(MIPS也一样)提供了语句标号Labels来支持“goto”跳转到代码所在处.
小结:
1.内存可访问到字节byte,但lw,sw每次访问一个字.
2.lw和sw所使用的指针就是内存地址,可以通过使用偏移量offset来进行增减.
3.分支让我们能在运行时(run-time)做决定,而不是在编译时(compile-time)进行.
4.MIPS决策的条件语句有:
beq(==)andbne(!
=).
溢出:
由于计算机精度的限制,而导致的算术运算错误.
add(add),检测溢出
addunsigned(addu),不检测溢出
左移ShiftLeft:
sll$s1,$s2,2#s1=s2<
<
2
将$s2的值左移2位,结果放到$s1中,在右边添0;
C语言的<
*左移(sll),右移(srl).
jal存储返回地址到寄存器中($ra),注:
$ra的寄存器号为31.
jr$ra跳回该地址处
MIPS指令小结语义
1.逻辑运算:
1)与and$s1,$s2,$s3$s1=$s2&
$s3
2)或or$s1,$s2,$s3$s1=$s2|$s3
3)或非nor$s1,$s2,$s3$s1=~($s2|$s3)
4)立即数与andi$s1,$s2,100$s1=$s2&
100
5)立即数或ori$s1,$s2,100$s1=$s2|100
6)逻辑左移sll$s1,$s2,10$s1=$s2<
10(来做2的幂的乘法)
7)逻辑右移srl$s1,$s2,10$s1=$s2>
>
10
8)sra(算术右移):
右移空出来的位进行符号扩展,来做2的幂的除法.
2.条件转移:
1)相等转移beq$s1,$s2,L如果$s1等于$s2,跳转L处
2)不等转移bne$s1,$s2,L如果$s1不等于$s2,跳转L处
3)小于比较slt$s1,$s2,$s3如果$s2小于$s3,$s1=1;
否则$s1=0;
4)小于比较slti$s1,$s2,100如果$s2小于100,$1=1;
否则$s1=0
立即数
3.无条件跳转:
1)跳转jL跳转到地址L(转移到目标地址0
2)寄存器跳转jr$ra跳转到$ra(用于过程返回)
3)跳转并链接jalL$ra=PC+4;
跳至L(用于过程调用)
4.其他:
1)立即数高位取:
lui
2)传送:
move
3)乘:
mult
4)立即数乘:
multi
5)立即数取:
li
6)小于则分支:
blt
7)小于等于则分支:
ble
8)大于则分支:
bgt
9)大于等于则分支:
bge
*上述中除了
(1)中的立即数取高位,其他的都是伪MIPS指令;
伪指令:
不能直接转成机器语言,而是要先转成其它MIPS指令的MIPS指令;
解析伪指令时,汇编器需要使用附加寄存器.
1.任何数与0“与”产生0,与1“与”不变.这可以用来产生掩码mask.
2.类似的注意到,任何数与1“或”,结果为1,而与0做“或”运算,结果为原数.
这可以用于强制字串的某些位为1.
寄存器约定:
1.$0不可改变,始终为0;
$s0-$s7和$sp如果改变必须恢复,所有存储寄存器以S开头.
2.$ra,$v0-$v1,$a0-$a3,$t0-$t9是临时寄存器,可以改变,且不需要恢复.
谨记:
Caller/callee仅需要保存其要使用的临时/存储寄存器,而不是所有的寄存器.
由于所有的指令和数据都存储在内存中,所有的东西都有内存地址:
指令,数据
指令集随时间的演化,产生“向后兼容”
指令格式:
I型:
用于有立即数的指令,lw和sw(偏移量也可看成立即数),分支语句(beq和bne),(但不用于移位指令;
)
J型:
用于j和jal
R型:
用于所有其他的指令
R格式指令
每个“字段”的位数为:
6+5+5+5+5+6=32
为了好记,每个字段名字如下:
在这个幻灯片和书中,每个字段看成5位或者6位无符号数,而不是作为32位整数的一部分.
每个寄存器字段正好是5位,故可以指定0-31间的任意正整数.每个这样的字段可以指定32个寄存器中的一个.
Opcode,即op,指令的基本操作,通常称为操作码,对所有R格式指令,此数为0.
rs:
第一个源操作寄存器;
rt:
第一个源操作寄存器;
rd:
存放操作结果的目的操作数寄存器;
shamt:
位移量,除了移位指令外,该字段设置为0.
funct:
函数,和opcode一起,共同指定指令的确切含义
reg表示0~31之间的一个寄存器号
I格式指令(用于有立即数的指令)
定义如下的位数的“字段”:
6+5+5+16=32bits
opcode:
与前面的相同,只是由于没有funct字段,opcode独立指定指令的I格式
指定寄存器操作数(如果有的话)
指定保存计算结果的寄存器(这也是为什么称为目标寄存器“rt”的原因),或者对于一些指令指定其他操作数.
opcode指定beq和bne
rs和rt指定要比较的寄存器
立即数指定什么呢?
立即数Immediate仅有16位
PC(ProgramCounter)存有当前要执行指令的字节地址;
指向内存的32位指针
因此immediate无法指定整个跳转的地址
J格式指令
对于分支,可以假定跳转到不太远的地上,因此可以指定PC的变化.
对于一般的跳转(j和jal),我们可能需要跳转到内存中的任意地址.
理想的情况,指定跳转到32位内存地址处.
不幸的是,无法把6位opcode和32位地址,一起放到单个32位字中,因此需要妥协.
保持Opcode字段与R格式和I格式兼容.
把其它所有字段合成为一个,形成一个大的目标地址空间.
和前面分支跳转一样,将只跳转到字对齐的地址,因此最后两位总是00(二进制).
因此,可以默认最后二位为00,而不必专门指定.
分支使用PC相对寻址,跳转使用绝对寻址.
反汇编很简单,首先需要解码opcode字段.(后面会讲)
IEEE754浮点数标准是被广泛接受的用于表示浮点数的标准(自1997年以来的桌面计算机和工作站都遵循此标准)
浮点数使我们能够:
表示既包含整数部分,又包含小数部分的数;
能高效的使用位数.
存储非常大和非常小的数的近似值.
在浮点数中,除0应该得到±
∞,而非溢出.
浮点数相加不满足结合律!
注意exponent中关键在于127和指数的加减.
*******
可以根据上表中op项的值来进行反编译.
反汇编的一个实例:
lui的功能
MAL(MIPSAssemblyLanguage):
程序员编写代码所用的指令集;
包括伪指令
TAL(TrueAssemblyLanguage):
可以转换成单个机器语言指令(32位位串)的指令集
程序必须先从MAL转换成TAL,然后再转成1和0串.
当效率不是关键所在时,我们会对高级语言进行解释,而如果要提高效率则会翻译成一种低级语言.
解释器:
直接执行源(高级)语言编写的程序
翻译器:
将源(高级)语言编写的程序转换成另一种(低级)语言编写的等价的程序
解释器提供了指令集独立性:
可以在任何机器上运行;
翻译/编译后的代码通常更高效,因此有更好的性能;
翻译/编译有助于“隐藏”程序的“源码”
执行程序的步骤(翻译):
输入:
高级语言代码(如C,Java如foo.c)
输出:
汇编语言代码(如,foo.sforMIPS)
输出可能包含伪指令
伪指令:
汇编器能理解,但机器不能理解的指令.
需要讨论四类地址:
PC相对寻址(beq,bne):
不重定位
绝对地址(j,jal):
总要重定位
外部引用(通常用jal):
总是重定位
数据引用(通常使用lui和ori):
总重定位
现实中,装入器即是操作系统(OS)
装入是操作系统的任务之一
同步数字系统:
处理器硬件,如MIPS,就是一种同步数字系统的实例
同步数字系统由两种基本电路组成:
组合逻辑电路;
状态单元.
ISA是非常重要的抽象层:
硬件与软件的协议.
电压是模拟量analog,量化为0/1
逻辑门
布尔代数的重要意义在于:
由AND,OR和NOT构建的门电路和布尔代数的代数式间存在一一对应
+即OR,•即AND,x即NOT,例:
算术逻辑单元(ALU)
数据多路复用器(这里2选1,n位宽):
N个1位位宽mux(连接法!
MIPS有多种指令:
公共的步骤是什么?
1.Stage1:
取指
无论何种指令,首先必须把32-位指令字从内存中取出。
(可能涉及缓存结构)
在这一步,我们还需要增加PC(即PC=PC+4,以指向下一条指令,由于是按字节寻址,故+4);
2.Stage2:
指令译码InstructionDecode
在取到指令后,下一步从各域(fields)中得到数据(对必要的指令数据进行解码)
首先,读出Opcode,以决定指令类型及字段长度
接下来,从相关部分读出数据
对add,读两个寄存器
对addi,读一个寄存器
对jal,不用读寄存器
3.Stage3:
ALU(Arithmetic-LogicUnit)
大多数指令的实际工作在此部完成:
算术指令(+,-,*,/),移位,逻辑(&
|),比较(slt)
装入loads和存储stores呢?
lw$t0,40($t1)
要访问的内存地址=$t1的值+40
因此,在这一步需要做这个加法运算
4.Stage4:
内存访问MemoryAccess
事实上只有load和store指令在此stage会做事;
其它指令在此阶段空闲idle或者直接跳过本阶段
由于load和store需要此步,因此需要一个专门的阶段stage来处理他们
由于cache系统的作用,该阶段有望加速
如果没有caches,本阶段stage会很慢;
5.Stage5:
写寄存器RegisterWrite
大多数指令会将计算结果写到寄存器
算术,逻辑,移位,装入,slt
而对存储,分支,跳转呢?
结束时,不写内容到寄存器
这些指令在第5阶段空闲,或者干脆跳过
是否能有不同的步骤?
是!
其他计算机结构可能会不同
前述指令至少在某一步空闲(idle),为什么MIPS还要有5步?
五步能使所有的操作有统一的步骤.
还有一个指令五个阶段都需要(即无空闲):
load
通用寄存器
用于第二步(Read)和第五步(Write)
MIPS共有32个通用寄存器
内存
用于第一步(Fetch)和第4步(R/W)
Cache系统使得这两步和其他步骤同样快(平均而言)
其他寄存器
为了实现每个时钟周期执行一步,在各步(stage)之间插入寄存器以保存阶段变换过程中的中间数据和控制信号.
寄存器是通用名词,意即保存位的实体.不是所有寄存器都在“寄存器文件”中.
单周期CPU:
指令的所有阶段在一个长的时钟周期中完成.
时钟周期足够长,以便能在一个周期内完成所有指令的五步,而不必中断.
多时钟周期CPU:
每个时钟周期,执行一个stage指令.
时钟和最慢的stage一样长.
和单时钟执行相比,有几个好处:
某个指令未用的阶段stages可以跳过,指令可以进入流水线pipelined(重叠).
分析指令集结构(ISA)->
数据通道需求
每个指令的含义由寄存器变换给定
数据通道必须包含用于ISA寄存器的存储单元
数据通道必须支持每个寄存器的变换
寄存器变换语言(RTL)
对所有指令的共同RTL操作如下:
(a)在开始执行指令前,使用程序记数器(PC)取址,
(b)在指令执行结束时,更新程序记数器.
数据通道所需要的最后一个存储单元是理想内存,在该处存储数据和指令.
执行load指令的时间是以下几项之和:
(a)PC反转;
(b)指令内存访问;
(c)读寄存器;
(d)算术逻辑单元计算数据内存地址;
(e)读内存;
(f)寄存器文件的启动时间和时钟误差
流水线
延时Latency:
完整的执行一个指定任务所需要的时间;
吞吐量Throughput:
在一段时间内能做的工作总量;
流水线不减少单个任务的延时量,但可以减少整个任务的吞吐量;
多任务同时进行,使用不同的资源;
每个指令必须运行同样的步骤,在流水线中也称为阶段“stages”,尽管其中一些有时会“休息”idle
*寄存器,右半边红色读,左半红色写
流水线的限制:
困境(Hazards)使下一条指令无法在所设计的时钟周期中执行。
结构困境Structuralhazards:
硬件不支持一些指令组合(一个人同时叠衣服和放到衣柜中)
控制困境Controlhazards:
流
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 组成 结构 概述