常用五类指令:运算指令、LOAD指令、STORE指令、条件转移指令、无条件转移指令。
一、运算类指令
注:Rs指源操作数(source);Rd指目的操作数(destination)。
运算类指令 | 指令的汇编格式 | 功能说明 |
---|---|---|
加法指令(两个寄存器相加) | ADD Rs,Rd | (Rs)+(Rd)→Rd |
加法指令(寄存器与立即数相加) | ADD #1,Rd | 1+(Rd)→Rd |
算术左移 | SHL Rd | (Rd)<<<2→Rd |
IF:根据PC从指令Cache取指令至IF段的锁存器。
ID:取出操作数至ID段锁存器。
EX:运算,将结果存入EX段锁存器。
M:空段
WB:将结果写回寄存器
对于RSIC来说,只有LOAD和STORE指令可以访存,所有运算类指令的操作数只能来自寄存器或立即数。运算得到的结果也是存回寄存器中。所以对于RISC在访存阶段运算类指令是不需要做任何操作,但时间必须要消耗,为了方便流水线的安排,会让所有指令都经历相同的阶段,即使某个阶段空闲。
二、LOAD指令
指令的汇编格式 | 功能说明 |
---|---|
LOAD Rd,1(Rs) | (1+(Rs))→Rd |
或LOAD Rd,mem | (mem)→Rd |
IF:根据PC从指令Cache取指令至IF段的锁存器。
ID:将基址寄存器的值(Rs)放到锁存器A,将偏移量的值(指令中指明的立即数,如1)放到Imm锁存器中。
EX:运算,将偏移量和基址相加(1+(Rs))得到有效地址EA。
M:根据EA从数据Cache中取数并放入锁存器。
WB:将取出的数写回寄存器。
三、STORE指令
指令的汇编格式 | 功能说明 |
---|---|
STORE Rs,1(Rs) | Rs→(1+(Rd)) |
或STORE Rs,mem | Rs→(mem) |
IF:根据PC从指令Cache取指令至IF段的锁存器。
ID:将基址寄存器的值(Rd)放到锁存器A,将偏移量的值(指令中指明的立即数,如1)放到Imm锁存器中。将要存的数放到锁存器B。
EX:运算,将偏移量和基址相加(1+(Rs))得到有效地址EA。并将锁存器B的内容放到锁存器Store。
M:根据EA将锁存器Store中的数据写入Cache。
WB:空段。
四、条件转移类指令
注:转移类指令通常采用相对寻址。
指令的汇编格式 | 功能说明 |
---|---|
beq Rs,Rt,#偏移量 | 若(Rs)==(Rt),则(PC)+指令字长+(偏移量*指令字长)→PC;否则(PC)+指令字长→PC |
bne Rs,Rt,#偏移量 | 若(Rs)!=(Rt),则(PC)+指令字长+(偏移量*指令字长)→PC;否则(PC)+指令字长→PC |
IF:根据PC从指令Cache取指令至IF段的锁存器。
ID:将进行比较的两个数放入锁存器A和B;偏移量放入Imm。
EX:通过ALU的计算得到A和B的比较结果,将比较结果放入EX段的锁存器中。
M:将目标PC值写回PC。
经过EX的处理后就能知道条件是否满足,根据条件是否满足来决定PC的值,对于条件转移类指令来说在访存阶段不会访存,而是直接修改寄存器PC的值,也就是说修改PC的值并不是在写回阶段,写回阶段通常是写回通用寄存器。
WB:空段。
很多教材把写回PC的功能段称为“WrPC段”,其耗时比M段更短,因此可以安排在M段时间内完成。
五、无条件转移指令
注:转移类指令通常采用相对寻址
指令的汇编格式 | 功能说明 |
---|---|
jmp #偏移量 | (PC)+指令字长+(偏移量*指令字长)→PC |
IF:根据PC从指令Cache取指令至IF段的锁存器。
ID:将偏移量放入Imm。
EX:
由于无条件转移指令不用判断转移条件,所以用不到运算器ALU。而是会直接根据偏移量把目标的PC值直接写回PC中,直接进行转移。WrPC功能段也比EX段执行时间短,所以将WrPC段安排在EX段执行。
注:WrPC段越早执行就能越早判断出PC的值,进而越能避免控制冲突。
M:空段。
WB:空段。
相关真题
【2012】某16位计算机中,有符号整数用补码表示,数据Cache和指令Cache分离。下表给出了指令系统中的部分指令格式,其中Rs和Rd表示寄存器,mem表示存储单元地址,(x)表示寄存器x或存储单元x的内容。
该计算机采用5段流水方式执行指令,各流水段分别是IF、ID、EX、M和WB,流水线采用“按序发射,按序完成”方式,未采用转发技术处理数据相关,且同一寄存器的读和写操作不能在同一个时钟周期内进行。请回答下列问题:
(1)若int型变量x的值为-513,存放在寄存器R1中,则执行“SHR R1”后,R1中的内容是多少(用十六进制表示)?
(2)若在某个时间段中,有连续的4条指令进入流水线,在其执行过程中未发生任何阻塞,则执行这4条指令所需的时钟周期数为多少?
(3)若高级语言程序中某赋值语句为x=a+b,x、a和b均为int型变量,它们的存储单元地址分别表示为[x]、[a]和[b]。该语句对应的指令序列及其在指令流中的执行过程如下所示。
则这4条指令执行过程中I3的ID段和I4的IF段被阻塞的原因是什么?
(4)若高级语言程序中某赋值语句为x = x*2 + a,x和a均为unsigned int类型的变量,它们的存储单元地址分别表示为[x]、[a],则执行这条语句至少需要多少时钟周期?要求模仿上图画出这条语句对应的指令序列及其在流水线中的执行过程示意图。
首先(1)考查的是第二章数据的表示:
x的机器码为[x]补=1111 1101 1111 1111B,即指令执行前(R1)=FDFFH,右移1位后为1111 1110 1111 1111B,即指令执行后(R1)=FEFFH。
(2)考查的是流水线时间的计算,T=(n+k-1)*时钟周期。其中n为指令总数,k为指令执行阶段个数。因此,至少需要4+5-1=8个时钟周期。
(3)
①I3的ID段被阻塞的原因:因为I3与I1和I2都存在数据相关,需要等到I1和I2将结果写回寄存器后,I3才能读寄存器内容,所以I3的ID段被阻塞。
②I4的IF段被阻塞的原因:因为I4的前一条指令I3在ID段被阻塞,此时I3还占用这IF段的锁存器,I4无法进入IF段的锁存器,需要等到I3释放IF段的锁存器后,I4的IF段才能顺利执行。
(4)
【2014】某程序中有循环代码段P:“for(int i=0;i
执行上述代码的计算机M采用32位定长指令字,其中分支指令bne采用如下格式:
OP为操作码;Rs和Rd为寄存器编号;OFFSET为偏移量,用补码表示。
(1)M的存储器编址单位是什么?
(2)已知sll指令实现左移功能,数组A中每个元素占多少位?
(3)表中bne指令的OFFSET字段值是多少?已知bne指令采用相对寻址方式,当前PC内容为bne指令地址,通过分析表中指令地址和bne指令内容,推断bne指令的转移目标地址计算公式。
(4)若M采用如下“按序发射、按序完成”的5级流水线:IF、ID、EXE、MEM、WB,且硬件不采取任何转发措施,分支指令的执行均引起3个时钟周期的阻塞,则P中哪些指令的执行会由于数据相关而发生流水线阻塞?哪条指令的执行会发生控制冒险?为什么指令1的执行不会因为与指令5的数据相关而发生阻塞?
解:(1)根据表可得,指令与指令之间相差4个地址即4个存储单元,也就是说一条指令占4个存储单元,而题目给出一条指令的指令字长为32bit,所以每个存储单元占8bit。由此可推出机器按字节编址。
(2)分析指令的运行
①R2*4→R4 —— R4=i*4
②R3+R4→R4 —— R4=A[0]+i*4
③R4所指主存地址的内容→R5 —— R5=M[A[0]+i*4]——R5=A[i]
④R1+R5→R1 —— sum=sum+A[i]
⑤R2=R2+1 —— i++
⑥if(R2)!=(R6) goto ① —— if(i != N) 继续循环。
根据②可得数组A中每个元素占4B=32位。
(3)由表可知,bne指令的机器代码为1446FFFAH,根据题干给出的指令格式,后2B的内容为OFFSET字段,所以该指令的OFFSET字段为FFFAH,用补码表示,值为-6。系统执行到bne指令时,PC自动加4,PC的内容为08048118H,而跳转的目标是08048100H,两者相差了18H,即24个单位的地址间隔,所以偏移地址的一位即是真实跳转地址的4位。所以bne指令的转移目标地址计算公式为(PC)+4+OFFSET*4。
(4)由于数据相关而发生阻塞的指令为第2、3、4、6条,都与各自前一条指令发生数据相关。第6条指令会发生控制冒险。
当前循环的第5条指令与下次循环的第1条指令虽然有数据相关,但由于第6条指令后有3个时钟周期的阻塞,因而消除了该数据相关。
【2014】假设对于上题中的计算机M和程序P的机器代码,M采用页式虚拟存储管理;P开始执行时,(R1)=(R2)=0,(R6)=1000,其机器代码已经调入主存但不在Cache中;数组A未调入主存,且所有数组元素在同一页,并存储在磁盘的同一个扇区。
(1)P执行结束时,R2的内容是多少?
(2)M的指令Cache和数据Cache分离。若指令Cache共有16行,Cache和主存交换的块大小为32B,则其数据区的容量是多少?若仅考虑程序段P的执行,则指令Cache的命中率是多少?
(3)P在执行过程中,哪条指令的执行可能发生溢出异常?哪条指令的执行可能产生缺页异常?对于数组A的访问,需要读磁盘和TLB至少各多少次?
解:(1)(R1)=(R2)=0说明sum=0,i=0;(R6)=1000说明N=1000。P执行结束后i的值为1000,即R2的内容是1000。
(2)数据区容量 = Cache行数*Cache块大小=16*32B=512B
P共有6条指令,占24B,小于主存块大小32B,P的起始地址为0804 8100H,对应一块开始位置,由此可知所有指令都在一个主存块内。读取第一条指令时会发生Cache缺失,因此将P所在的主存块调入Cache中,以后每次读取指令时,都能在指令Cache中命中。因此在1000次循环中,只会发生1次指令访问缺失,所以指令Cache的命中率为(1000*6-1)/(1000*6)=99.98%。
(3)指令4为加法指令,对应sum+=A[j],当数组A中元素值过大时,会导致这条加法指令发生溢出异常;而指令2、5虽然都是加法指令,但它们分别为数组地址的计算指令和存储变量i的寄存器进行自增的指令,而i最大为1000,所以它们都不会产生溢出异常。
只有访存指令可能产生缺页异常,即指令3可能产生缺页异常。因此数组A在磁盘的一页上,而一开始数组并不在主存中,第一次访问数组时会导致访问磁盘,把A调入内存,而以后数组A的元素都在内存中,不会访问磁盘,所以该程序一共访问一次磁盘。
每访问一次内存就会查找一次TLB,共访问数组1000次,所以此时又访问1000次TLB,还要考虑到第一次访问数组A,即访问A[0]时,会多访问一次TLB(第一次访问A[0]时,会先查一次TLB,然后产生缺页,处理完缺页中断后,会重新访问A[0],此时又会重新查TLB),所以访问TLB的次数一共是1001次。