MiniSys1A指令系统+体系结构13年版.docx
- 文档编号:18385186
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:58
- 大小:35.58KB
MiniSys1A指令系统+体系结构13年版.docx
《MiniSys1A指令系统+体系结构13年版.docx》由会员分享,可在线阅读,更多相关《MiniSys1A指令系统+体系结构13年版.docx(58页珍藏版)》请在冰豆网上搜索。
MiniSys1A指令系统+体系结构13年版
2.1MiniSys-1ACPU结构
2.2.1MiniSys-1ACPU体系结构
一个CPU的设计可以从指令集的设计开始,比如酷睿,安腾,ARM等CPU都设计有自己的指令集,也可以借鉴其他的指令集,如我国的龙芯就采用的MIPS指令集,AMD的弈龙也是在x86指令集基础上发展起来的。
而要设计的MiniSys-1ACPU是MiniSysCPU的升级版本,它也是一种RISC结构的32位CPU,在体系结构上主要借鉴了MIPSCPU,包括其寄存器组织方式以及指令集等,但也根据需要有一些自己的定义。
具体实现参考了同为MIPS类CPU设计的参考文献[1]和[13]中有关内容。
MiniSys-1ACPU内部拥有32个32位通用寄存器、一个32位指令指针寄存器PC,2个用于存放乘除法结果的寄存器(HI,LO),所有指令均采用32位等长指令,除LB、LBU、LH、LHU、LW、SB、SH、SW指令以外,其他任何指令均不对存储器操作。
根据指令在CPU中执行的流程,将指令在CPU中的执行过程分成四个基本步骤:
取指、译码、执行和回写(或取数/存数)。
取指步骤负责从指令存储器中获取下一条指令,译码步骤负责解析指令,提供运算需要的存放在寄存器中的数据以及各类控制信号,执行步骤负责计算,回写步骤负责将计算过的结果写回到相应的寄存器。
只有LB、LBU、LH、LHU、LW、指令才有取数步骤(即从内存中读入数据),此时执行单元负责计算数据所在内存单元的地址,而存数步骤只有SB、SH、SW指令才有,由执行单元负责计算待存数据在内存中的地址。
按照以上的四个步骤,整个CPU的内部功能被划分成5个基本单元:
取指单元、译码单元、控制单元、执行单元和存储单元。
其中,取指单元负责从指令存储器获取指令;译码单元主要负责从寄存器获取操作数和将运算结果回写到寄存器,它实际上包含了译码和回写两个步骤;而控制单元则完成上述译码步骤中解析指令和提供控制信号的功能;执行单元负责算术、逻辑运算,并负责计算与存储器操作有关的地址;存储单元负责取数或存数的步骤,即该单元负责存取数据存储器。
2.2.2MiniSys-1ACPU的寄存器组
参照MIPSCPU的设计,MiniSys-1ACPU也设计了32个32位的通用寄存器,1个32位的指令指针寄存器PC,2个用于存放乘除法结果的寄存器(HI,LO)。
MiniSys-1ACPU的指令采用等长的32位(4字节)指令,所以在没有执行转移指令的情况下,PC值会在每个指令获取之后被加4,如果执行转移指令且需要转移,则根据转移的目的地址修改PC值。
PC寄存器对用户是透明的。
通常设计寄存器组的时候,都会对每个通用寄存器规定一些约定用途,以方便使用。
MiniSys-1ACPU的32个通用寄存器基本按照MIPS寄存器组的组织方式和约定,根据设计的需要,稍微做了一些调整,如表2.2所示。
表2.2MiniSys-1ACPU的32个通用寄存器及其约定
寄存器名
寄存器号
约定用途
$zero
0
常数0,该寄存器永远只返回0。
$at
1
用做汇编器的暂时变量。
$v0~$v1
2~3
用来存放一个子程序(函数)的非浮点运算的结果或返回值。
$a0~$a3
4~7
存放子程序(函数)调用时的非浮点参数。
$t0~$t7
8~15
暂时变量,子程序(函数)使用时不保存这些寄存器的值,因此调用后它们的值会被破坏。
$s0~$s7
16~23
8个子程序用寄存器。
子程序(函数)必须在返回之前恢复这些寄存器的值以保证其没有变化。
$t8~$t9
24~25
暂时变量,子程序(函数)使用时不保存这些寄存器的值,因此调用后它们的值会被破坏。
$i0~$i1
26~27
分别保存两个中断到来时程序的返回地址。
(该两寄存器定义和MIPS中的有所不同)
$s9
28
第10个子程序用寄存器。
(该定义和MIPS中的不同)
$sp
29
堆栈指针,对它的调整必须显式的通过指令来实现,硬件不支持堆栈指针的调整。
$s8
30
第9个子程序用寄存器。
(该定义和MIPS中的不同)
$ra
31
存放调用子程序(函数)时的返回地址。
HI
隐藏
乘结果的高32位,除结果的余数
LO
隐藏
乘结果的低32位,除结果的商
对寄存器的使用既可以使用其寄存器名,如$zero,$t0等,也可以使用寄存器号,如$0,$8等。
在这32个寄存器中,$0,$26,$27,$29和$31的用法是固定的,平时最好不作为其他用途使用,尤其是$0始终只返回数据0,因此对其进行写操作没有任何作用。
这几个寄存器的写入应该由硬件自动完成,所以在CPU设计的时候需要注意这个问题。
其他寄存器(HI和LO除外)在不作约定用途的时候均可作为通用寄存器使用,作为约定用途使用的时候需要注意下面几个问题。
$v0和$v1作为子程序非浮点返回值的存放寄存器,而$a0~$a3存放子程序的非浮点调用参数,如果这些寄存器不够,则程序员或编译器要设法利用内存来传递参数。
$t0~$t9这10个寄存器在子程序中如果被使用,则他们原来的值会被破坏而不被保存,因此它们只能用来存放临时变量。
编译器和程序员必须注意的是,当调用一个子程序时,这些寄存器中的值如果有用,需要自己设法保存他们。
$s0~$s9这10个寄存器也可以在子程序中存放变量,但子程序必须保证返回前恢复其原来的值,因此子程序需要设法保存它们的原始值,这可以利用堆栈操作来实现。
$sp是堆栈指针寄存器,但由于MiniSysCPU没有堆栈操作指令,因此对$sp的操作不由硬件实现,它必须由软件显式地操作。
实际上,MiniSys的堆栈功能完全由软件来仿真实现,这个问题将在4.2节中讨论。
还需要注意的是,无论是子程序调用还是中断处理,都只通过一个固定的寄存器存放返回地址,因此,硬件上不支持子程序嵌套(即使不是递归调用也不允许),也不支持同级中断的嵌套。
如果确实需要子程序嵌套调用,则编译器和程序员一定要利用内存保存好外层子程序的返回地址。
而中断是由硬件随机产生的,无法预知何时会产生嵌套中断,因此必须由硬件负责严禁同级中断的嵌套。
2.2.3MiniSys-1A的指令系统
MiniSys-1A的指令系统采用了MIPS指令集中常用的57条指令,由于MiniSys-1A有32根地址线,理论可访问的存储器空间达到4GB,另外,为了尽量简化设计,部分指令的功能作了一些调整,具体指令功能在本节将给出详细解释。
1.指令类型与指令格式
参考MIPSCPU的指令集设计原则,MiniSys-1A所有指令的执行都在寄存器中完成,如果要和存储器交换数据只能使用LB、LBU、LH、LHU、LW、SB、SH、SW指令。
按照功能划分,58条指令被分成以下几类:
∙算术运算指令:
完成2个操作数的算术运算,如add,addu,addi,addiu,sub,subu,mul,mult,multu,div,divu。
∙逻辑运算指令:
完成2个操作数的逻辑运算和移位,如and,andi,or,ori,xor,xori,nor,sll,srl,sra,sllv,srlv,srav。
∙数据传送指令:
完成对数据存储器的读写或将立即数传到一个寄存器,如lb,lbu,lh,lhu,lw,sb,sh,sw,mfhi,mflo,mthi,mtlo,lui。
∙条件转移指令:
完成对操作数的分支条件进行判断,满足条件则转移到目标地址运行,否则顺序运行下一地址指令,如beq,bne,slt,slti,sltu,sltiu,bgez,bgtz,blez,bltz,bzezal,bltzal。
∙无条件转移指令:
转移到目标地址执行,通常跳转范围比条件转移指令大,如j,jr,jal,jalr。
∙异常指令:
与异常相关的一些指令,如break,syscall。
∙特权指令:
需在系统态才能执行的指令,eret,mfc0,mtc0。
从指令格式上分,MiniSys-1A的指令被划分为三类,R-类型、I-类型和J-类型,分别对应寄存器操作数、含立即数操作数和含转移地址的三种类型指令。
表2.3给出了这三类指令的具体格式。
表2.3MiniSys-1A指令格式
3126
2521
2016
1511
106
50
R-类型
op(6位)
rs(5位)
rt(5位)
Rd(5位)
shamt(5位)
func(6位)
I-类型
op(6位)
rs(5位)
rt(5位)
immediate(16位)
J-类型
op(6位)
address
op-操作码;rs,rt,rd-寄存器操作数;shamt-移位的位数;func-功能码;immediate-立即数;address-转移的目标地址
从表中可以看到,无论哪种类型的指令,均是32位等长指令。
R-类型指令的操作码为全0,各指令功能靠指令的最低6位的功能码(func)来区别。
这种类型的指令大部分都将两个源操作数放到rs,rt寄存器中,而计算后的数据放在rd寄存器中。
也有部分移位指令将移位次数放在shamt中。
jr指令是R-类型指令中的特例,它只有rs寄存器有效,放转移的地址。
I-类型指令的操作数中其中一个是16位的立即数,由于MiniSys-1A的数据都是32位的,所以16位的立即数将做32位扩展,如果是无符号数,则采用高16位全填0来扩展。
如果是有符号数,则高16位做符号扩展,即将有符号立即数的符号位填满高16位。
如16位数8085H如果是无符号数,则扩展为32位数是00008085H,如果是有符号数,则做符号扩展后,成为0FFFF8085H。
J-类型指令除了6位操作码外,剩下的26位全部是转移的目标地址,要注意的是存放在指令中的地址是实际地址除以4以后的值。
2.指令的汇编语句格式与指令的寻址方式
指令的汇编语句格式如下:
[标号:
]指令助记符第1操作数[,第2操作数[,第3操作数]][;注释]
其中[]中的内容为可选项,标号可以是以英文字母开头的字母-数字串,标号和指令助记符都不区分字母的大小写。
从上述汇编语句格式可以看到,MiniSys的指令包括1操作数指令,2操作数指令和3操作数指令。
1操作数指令只有j、jal和jr三个无条件转移指令,唯一的操作数作为转移的目标地址除以4的值或目标地址所在的寄存器的寄存器号。
2操作数指令只有lui指令,其第1操作数是目的操作数,第2操作数是源操作数。
3操作数指令中通常第1操作数是目的操作数,第2和第3操作数是源操作数,但条件转移指令beq和bne除外,这两条指令中第1和第2操作数是源操作数,第3操作数是转移的相对偏移量。
MiniSys-1A的指令一共有4种寻址方式:
∙立即数寻址。
指令中第3操作数可以使用16位立即数寻址方式,即直接将16位二进制数作为操作数,实际应用中可以采用10进制或16进制数,如:
addi $1,$2,100。
需要注意的是尽管MiniSysCPU是32位处理器,但其立即数最多16位。
在移位指令中,如果移位的位数用立即数表示,则该立即数只有5位2进制位。
∙相对寻址。
操作数是下一条指令的PC值(PC+4)加上一个32位偏移量,主要用于条件转移指令。
如beq $1,$2,10
∙寄存器寻址。
即操作数是存放在寄存器中,指令里放的是寄存器号。
如add$1,$2,$3。
∙寄存器相对寻址。
操作数存放在数据存储器中,其有效地址由两部分组成,基地址放在一个寄存器中,偏移部分为一个16位的立即数,如lw $1,10($2)。
3.指令详解
Minisys-1A一共有57条与MIPS指令兼容的指令,下面对每条指令的格式、功能等给出详细解释,其中用到一些符号约定如下,另外,赋值算式右边的PC中存放的是是当前指令的地址。
rs,rt,rd-表示32位通用寄存器(rs是源操作数,rt为源/目的操作数,rd为目的操作数)
shamt-表示5位移位位数
immediate-表示16位立即数
offset-表示16位偏移量
address-表示26位地址
1)加法指令
指令格式:
3126
2521
2016
1511
106
50
000000
rs
rt
rd
00000
100000
汇编格式:
ADDrd,rs,rt
指令类型:
R-类型
功能描述:
(rd)←(rs)+(rt)
32位整数加法,源操作数分别在rs,rt两个通用寄存器中,结果放在rd寄存器。
由于本设计无溢出检测,因此该指令功能同ADDU。
汇编举例:
ADD$4,$2,$3
2)有符号立即数加法指令
指令格式:
3126
2521
2016
150
001000
rs
rt
immediate
汇编格式:
ADDIrt,rs,immediate
指令类型:
I-类型
功能描述:
(rt)←(rs)+(Sign-Extend)immediate
首先将16位有符号立即数扩展到32位,然后加上rs中的数,结果给rt寄存器。
如果结果溢出会产生内部异常中断。
汇编举例:
ADDI$4,$2,-100
3)无符号立即数加法指令
指令格式:
3126
2521
2016
150
001001
rs
rt
immediate
汇编格式:
ADDIUrt,rs,immediate
指令类型:
I-类型
功能描述:
(rt)←(rs)+(Sign-Extend)immediate
首先将16位有符号立即数扩展到32位,然后加上rs中的数,结果给rt寄存器。
与ADDI的不同是不会因溢出而产生内部异常中断(MiniSysCPU中未实现内部异常中断)。
汇编举例:
ADDIU$4,$2,100
4)无符号数加法指令
指令格式:
3126
2521
2016
1511
106
50
000000
rs
rt
rd
00000
100001
汇编格式:
ADDUrd,rs,rt
指令类型:
R-类型
功能描述:
(rd)←(rs)+(rt)
32位无符号整数加,源操作数分别在rs,rt两个通用寄存器中,结果放在rd寄存器。
汇编举例:
ADDU$4,$2,$3
5)逻辑与指令
指令格式:
3126
2521
2016
1511
106
50
000000
rs
rt
rd
00000
100100
汇编格式:
ANDrd,rs,rt
指令类型:
R-类型
功能描述:
(rd)←(rs)AND(rt)
32位数按位逻辑与,源操作数分别在rs,rt中,结果放在rd寄存器。
汇编举例:
AND$1,$2,$3
6)立即数逻辑与指令
指令格式:
3126
2521
2016
150
001100
rs
rt
immediate
汇编格式:
ANDIrt,rs,immediate
指令类型:
I-类型
功能描述:
(rt)←(rs)AND(Zero-Extend)immediate
首先将16位立即数零扩展到32位,然后同rs中的数按位逻辑与,结果给rt寄存器。
汇编举例:
ANDI$1,$2,1
7)相等则转移指令
指令格式:
3126
2521
2016
150
000100
rs
rt
offset(offset=immediate/4)
汇编格式:
BEQrt,rs,offset
指令类型:
I-类型
功能描述:
if((rt)=(rs))then(PC)←(PC)+4+((Sign-Extend)offset<<2)
如果rt和rs的值相等,则转移到新的地址。
新地址是当前指令的下一条指令地址(PC+4)加上一个32位偏移量。
该32位偏移量是将16位offset符号扩展到32位,然后左移2位(即乘4)后取低32位得到。
实际系统中只用了低16位地址线。
汇编举例:
BEQ $1,$2,10
8)不相等则转移指令
指令格式:
3126
2521
2016
150
000101
rs
rt
offset(offset=immediate/4)
汇编格式:
BNErt,rs,offset
指令类型:
I-类型
功能描述:
if((rt)≠(rs))then(PC)←(PC)+4+((Sign-Extend)offset<<2)
如果rt和rs的值不等,则转移到新的地址。
新地址是当前指令的下一条指令地址(PC+4)加上一个32位偏移量。
该32位偏移量是将16位offset符号扩展到32位,然后左移2位(即乘4)后取低32位得到。
实际系统中只用了低16位地址线。
汇编举例:
BNE $1,$2,10
9)无条件转移指令
指令格式:
3126
250
000010
address(address=target/4)
汇编格式:
Jtarget
指令类型:
J-类型
功能描述:
(PC)←((Zero-Extend)address<<2)
无条件转移到新的地址。
新地址是26位address零扩展到32位,然后左移2位(即乘4)后取低32位得到。
实际系统中只用了低16位地址线。
要注意指令中的address是汇编语句中操作数target除以4的结果。
在做CPU设计或汇编(编译)器设计的时候都要注意这一点。
汇编举例:
J1000
10)过程调用指令
指令格式:
3126
250
000011
address(address=target/4)
汇编格式:
JALtarget
指令类型:
J-类型
功能描述:
①($31)←(PC)+4
②(PC)←((Zero-Extend)address<<2)
先将下条指令的地址((PC)+4)保存在$31($ra)作为过程的返回地址,然后无条件转移到新的地址。
新地址是26位address零扩展到32位,然后左移2位(即乘4)后取低32位得到。
实际系统中只用了低16位地址线。
要注意指令中的address是汇编语句中操作数target除以4的结果。
在做CPU设计或汇编(编译)器设计的时候都要注意这一点。
汇编举例:
JAL1000
11)按寄存器内容转移指令
指令格式:
3126
2521
2016
1511
106
50
000000
rs
00000
00000
00000
001000
汇编格式:
JRrs
指令类型:
R-类型
功能描述:
(PC)←(rs)
将rs寄存器的内容当地址,赋给PC,从而完成转移,通常可做过程返回语句。
实际系统中只用了低16位地址线。
汇编举例:
JR$31
12)立即数赋值指令
指令格式:
3126
2521
2016
150
001111
00000
rt
immediate
汇编格式:
LUIrt,immediate
指令类型:
I-类型
功能描述:
(rt)←immediate<<16&0FFFF0000H即(rt)←immediate×65536
首先16位立即数赋给rt寄存器的高16位,低16位用0填充。
也就是将16位立即数乘以65536后赋值给rt寄存器。
汇编举例:
LUI$5,200
13)存储器读(字操作)
指令格式:
3126
2521
2016
150
100011
rs
rt
offset
汇编格式:
LWrt,offset(rs)
指令类型:
I-类型
功能描述:
(rt)←Memory[(rs)+(sign_extend)offset]
以rs寄存器的内容为基地址,offset通过符号扩展后形成32位的偏移,将基地址加上偏移形成一个32位的地址,以此地址从RAM中读出一个字(4字节)赋给rt寄存器。
本系统中只使用了低16位地址,汇编中,offset可以是变量名。
汇编举例:
LW$3,10($2)或LW$3,buff($2)
14)逻辑或非指令
指令格式:
3126
2521
2016
1511
106
50
000000
rs
rt
rd
00000
100111
汇编格式:
NORrd,rs,rt
指令类型:
R-类型
功能描述:
(rd)←(rs)NOR(rt)
32位数按位逻辑或非,源操作数分别在rs,rt中,结果放在rd寄存器。
汇编举例:
NOR$1,$2,$3
15)逻辑或指令
指令格式:
3126
2521
2016
1511
106
50
000000
rs
rt
rd
00000
100101
汇编格式:
ORrd,rs,rt
指令类型:
R-类型
功能描述:
(rd)←(rs)OR(rt)
32位数按位逻辑或,源操作数分别在rs,rt中,结果放在rd寄存器。
汇编举例:
OR$1,$2,$3
16)立即数逻辑或指令
指令格式:
3126
2521
2016
150
001101
rs
rt
immediate
汇编格式:
ORIrt,rs,immediate
指令类型:
I-类型
功能描述:
(rt)←(rs)OR(Zero-Extend)immediate
首先将16位立即数零扩展到32位,然后同rs中的数按位逻辑或,结果给rt寄存器。
汇编举例:
ORI$1,$2,5
17)逻辑左移指令
指令格式:
3126
2521
2016
1511
106
50
000000
00000
rt
rd
shamt
000000
汇编格式:
SLLrd,rt,shamt
指令类型:
R-类型
功能描述:
(rd)←(rt)< 将rt寄存器中的32位数逻辑左移后赋给rd,低位用0填充,移位的位数是shamt。 汇编举例: SLL$1,$2,10 18)按寄存器值逻辑左移指令 指令格式: 3126 2521 2016 1511 106 50 000000 rs rt rd shamt 000100 汇编格式: SLLVrd,rt,rs 指令类型: R-类型 功能描述: (rd)←(rt)<<(rs) 将rt寄存器中的32位数逻辑左移后赋给rd,低位用0填充,移位的位数在rs寄存器中。 汇编举例: SLLV$1,$2,$3 19)小于则设置指令 指令格式: 3126 2521 2016 1511 106 50 000000 r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MiniSys1A 指令系统 体系结构 13 年版