设计mips32cpu时,运算指令溢出怎么处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计mips32cpu时,运算指令溢出怎么处理相关的知识,希望对你有一定的参考价值。

addiu是GPR和立即数做无符号加法操作,请参考ISA.有溢出的操作在溢出发生时会发exception,即overflow exception;无溢出运算在溢出发生(GPR的位宽有限,表示不了结果)时,不报告(HW不报告给SW).溢出的处理,随便,MIPS架构定义了,这样的报告机制.你可以在overflow exception handler中知道这个加法(或者减法)发生了溢出,要用两个GPR表示这个结果;当然如果你不在意结果时,也可以什么都不做. 参考技术A 1、在A1填入数字 1
2、单击A1单元格
3、单击菜单“编辑”->“填充”->“序列”
4、在“序列”对话框选择:序列产生在“列”->类型“等比序列”->步长值“2”->终止值“256”,然后单击“确定”

此时你的序列生成了。
5、在A10输入公式=AVERAGE(A1:A9)
6、在A10右键->“设置单元格格式”->数字选项卡的“数值”->小数位数选择2
你要的结果出来了。

我的参照结果:
1
2
4
8
16
32
64
128
256
56.78本回答被提问者采纳

RISC处理器设计------指令集的设计

定义指令字长为32位,并把寄存器堆扩展到32个通用32位寄存器。一套包含8个寄存器的寄存器堆,对于一个优化好的进程,足够安排所有的本地变量。采用寄存器窗技术可以提高系统的吞吐率。使CPI<1.一套32位寄存器阵列能够实现4个嵌套深度的进程。
1.指令格式的设计
指令可以分为四大类:
类别
说明
运算类
寄存器数据算术逻辑运算
访存类
主存储器访问(Load/Store)
跳转类
分支跳转(控制转移、条件与非条件)
特殊类
对诸如程序计数器PC等特殊寄存器操作的特殊指令
 指令格式可以分为两大类:访存和寻址指令,无访存操作指令

访存和寻址指令:

F1:寄存器寻址

Opcode
RC
RA
 
RB
                                                                                               31        24    19     14             5        0

F2:偏移量间接寻址

Opcode
RC
RA
Offset14

                                                                                               31        24     19    14                      0

F3:绝对寻址

Opc.
Address30

                                                                                               31     30                                      0

F4:PC间接偏移寻址

Opcode
CC
Offset19

                                                                                               31         24      19                          0

 

无访存操作的指令:

F5:寄存器操作

Opcode
DEST
SRCA
 
SRCB

                                                                                               31        24      19      14            5       0

F6:寄存器和立即数操作

Opcode
DEST
SRCA
Immedicate14

                                                                                               31       24       19     14                     0

F7:立即数操作

Opcode
DEST
Immediate19

                                                                                               31       24      19                             0

F8:特殊寄存器操作

Opcode
RC
SA
 
                                                                                              31        24   19   14                           0

F9:特殊寄存器操作

Opcode
SC
 
RB

                                                                                              31         24   19                         5     0

F10:可用于多种操作

Opcode
 
Imm4

                                                                                              31        24                              4      0

F11:可用于多种操作

Opcode
 
                                                                                              31         24                                    0
 
指令格式含义的说明:
名称
含义
Opcode
指令操作码
RA RB RC
通用寄存器地址,作为访存和特殊指令的源和目的操作数、存储器地址、或索引寄存器
Offset n
地址偏移量常数,条件跳转的目标地址,如n位
Address30
绝对地址
CC
条件跳转码
SRCA SRCB DEST
算术和逻辑运算的源和目的寄存器地址
Immediate n
算术和逻辑运算的立即数,也用在软件中断中,如n位
Imm n
Immediate n的缩写
SA  SC
特殊寄存器的地址
 
名称
说明
REG
寄存器阵列(通用寄存器)
rA,rC
寄存器REG[RA],REG[RB]
rB
寄存器REG[RB]或者是在最低两位Offset14再扩展00,01,10,11
cc
跳转条件码CC
srcA,dest
寄存器REG[SRCA],REG[DEST]
srcB
寄存器REG[SRCB]或Immediate14
sA,sC
特殊寄存器SA和SC
MEM[n]
扩展寄存器的地址n
N,Z,C,V
状态标志位
 公共操作符表示寄存器或存储器之间的操作:
操作符
说明
A?expr
赋值
AB
交换
A>>B
将A右移B指定的位数
A<<B
将A左移B指定的位数
A>>>B
将A循环右移B指定的位数
{A,B}
拼接
A|B
按位逻辑“或”
A&B
按位逻辑“与”
A^B
按位逻辑“异或”
~A
按位求反
A + B
A - B
 
特殊寄存器的种类包括:程序计数器PC、返回地址RPC、旧PC值LPC、状态寄存器SR、向量基址寄存器VBR、硬件中断标志寄存器HWISR、异常标志寄存器EXCSR、软件中断标志寄存器SWISR、硬件中断返回程序计数器HWIRPC、异常返回程序计数器EXCRPC、软件中断返回程序计数器SWIRPC、硬件中断地址HWIADR、异常地址EXCADR。
 
访存类装载和存储指令:
这类指令除了从存储器中取出指令外,他们自身还要访问存储器,与存储器交换数据。一个处理器字是32位,还有2个字节的16位半字和8位字节。
按字访问的存储器地址通常受字长的限制,即地址的最低两位都是零。对于半字的读取,地址最低位是零。为了提高效率,可以对地址值仅保存不带最低两位的地址值,只在需要的时候进行扩展。
访存类指令用操作数rA、rB和rC作为地址操作数。当rA和rC表示的是寄存器RA和RC时,rB的值依赖操作数的种类。操作数可以是通用寄存器中的数值,也可以是14位常数再拓展00、01,、10、11所形成的16位数值。
存储器用4种不同的寻址方式。在索引寄存器相对寻址中(F1格式),存储器的地址通过基址寄存器rA和索引寄存器rB求和得到。
偏移量间接寻址(F2格式)是寄存器rA和rB代表的偏移量求和得到地址的寻址方式。这种寻址方式可用于简单的矩阵数据读/写,堆栈操作和本地变量的管理。
STORE指令的rC寄存器保存操作数地址,用于将数据装载到存储器相应位置。由于处理器具有延迟装载的特性,目的寄存器在下一个周期才能完成新的数值的装载。
 
助记符
名称
格式
说明
LDU
LDU.D
LDU.B
装载无符号字
装载无符号半字
装载无符号字节
F1,2
F1,2
F1,2
rC?MEM[rA+rB](字)
rC?MEM[rA+rB](半字)
rC?MEM[rA+rB](字节)
LDS
LDS.D
LDS.B
装载有符号字
装载有符号半字
装载有符号字节
F1,2
F1,2
F1,2
rC?MEM[rA+rB](字)
rC?MEM[rA+rB](半字)
rC?MEM[rA+rB](字节)
ST
ST.D
ST.B
存储字
存储半字
存储字节
F1,2
F1,2
F1,2
MEM[rA+rB]?rC
MEM[rA+rB]?rC(低16位半字)
MEM[rA+rB]?rC(低8位字节)
SWP
交换字
F1,2
rC?MEM[rA+rB] 
 
跳转类指令
跳转类指令(控制转移、分支跳转)通过改变程序计数器PC来改变程序流的执行顺序。紧跟着跳转类指令之后,有一条位于延迟槽中的延迟指令在程序流跳转之前执行,即使此时程序流不发生跳转,延迟指令也会进入流水线。
如果跳转指令不执行,同时延迟槽中是一条ANNUL指令,这条延迟指令才会被忽略。
绝对地址Address30(F3格式)专门供CALL指令使用。由于CALL指令的跳转目的指令只可能是32位字长的指令,所以绝对地址在最低位扩展00。
为了支持高级语言,设计PC-偏移量相对寻址的指令形式(F4格式)。BCC指令(条件跳转)包含了19位的常数偏移量,作为相对跳转地址。这个相对地址距离是用有符号数表示的,并在最低位扩展两个0。指令执行时,这个相对地址与PC中的地址值相加,这样覆盖了
技术分享图片范围的存储器地址空间。
子程序可以通过CALL指令调用,而子程序返回则通过综合的CTR指令RET来完成。
RISC处理器的一个特点是在CALL指令之后的返回地址是由用户负责保存的,这个返回地址是紧跟在延迟槽之后的地址。这个地址在CALL指令执行期间自动送入特殊寄存器RPC(Return -PC),随后这个地址值只能通过特殊指令LRFS Rb,RPC 指令被保存到一个随机通用寄存器Rb中。子程序返回使用前面提到的RET Rb指令完成。
综合的跳转类指令JMP可以实现程序流向保存在寄存器中的地址处跳转。条件跳转类指令称为BCC指令,包括BGT、BLE等等。
非条件跳转包括CALL、JMP、RET、SEI、RET1和HALT指令。
          
助记符
名称
格式
如果cc,            则执行
BGT
BLE
BGE
BLT
BHI
BLS
符号数大于时跳转
符号数小于等于时跳转
符号数大于等于时跳转
符号数小于时跳转
无符号数大于时跳转
无符号数小于等于时跳转
F4
F4
F4
F4
F4
F4
~((N^V)|Z)          PC?PC+{Offset19,00}
(N^V)|Z             PC?PC+{Offset19,00}
~(N^V)|Z            PC?PC+{Offset19,00}
(N^V)&~Z            PC?PC+{Offset19,00}
~(C|Z)              PC?PC+{Offset19,00}
C|Z                 PC?PC+{Offset19,00}
BPL
BMI
BNE
BEQ
BVC
BVS
BCC
BCS
正数时跳转
负数时跳转
不等时跳转
相等时跳转
无溢出时跳转
溢出时跳转
无进位时跳转
有进位时跳转
F4
F4
F4
F4
F4
F4
F4
F4
~N                  PC?PC+{Offset19,00}
N                   PC?PC+{Offset19,00}
~Z                  PC?PC+{Offset19,00}
Z                   PC?PC+{Offset19,00}
~V                  PC?PC+{Offset19,00}
V                   PC?PC+{Offset19,00}
~C                  PC?PC+{Offset19,00}
C                   PC?PC+{Offset19,00}
BT
BF
为真时跳转
为假时跳转
F4
F4
true                PC?PC+{Offset19,00}
false
XXX.A
带.A参数
F4
对于上面的指令,延迟指令都会执行;但当带有.A参数时,如果跳转未执行,则放弃延迟槽指令。
CALL
JMP
RET
SWI
RET1
调用
跳转
返回
软件中断
中断返回
F3
F9
F9
F10
F11
RPC?PC,PC?{Address30,00}执行延迟槽指令
PC?rB 执行延迟槽指令
PC?rB 执行延迟槽指令
PC?VBR|{1,Imm4,000}保存处理器状态
恢复保存处理器状态
HALT
中止
F11
中止并等待复位
 
 
运算类指令
运算类指令不需要存储器操作。这类指令用到3个操作数srcA,srcB和dest。srcA和dest分别代表寄存器地址SRCA和DEST,srcB根据opcode的定义,分别可以表示寄存器REG或者一个14位的常数立即数。
所以可以进行两个寄存器之间的运算(格式F5),也可以进行立即数与寄存器之间的操作(格式F6),最后还可以单独进行立即数操作(格式F7)。
处理器运算中的负数是用2的补码表示的。对于立即数,最高位将根据常数的符号位补齐32位。
逻辑运算对32位操作数是按位执行的。移位操作和循环移位执行时,数据移位的位数由寄存器SRCB中的值给出。
除了LDH指令,所有的运算类指令都可以使用带.F参数。如果指令带这个参数,运算结果的标志位将会保存进标志寄存器中,供后续的跳转指令使用。
 
标志位
名称
计算
带.F参数的运算类指令
N
dest[31]
所有指令
Z
~(|dest[31,0])
所有指令
C
进位
dest[32]
~dest[32]
srcA[srcB-1]
0
未定义
ADD,ADDC,LSL
SUB,SUBC
LSR ,ASR ,ROT ,if srcB>0
LSR ,ASR ,ROT ,if srcB=0
其他指令
V
溢出
Carry[32]~Carry[31]
未定义
ADD,ADDC,SUB,SUBC
其他指令
 
助记符
名称
格式
说明
ADD
ADDC
SUB
SUBC
带进位位加
带借位位减
F5,6
F5,6
F5,6
F5,6
dest ? srcA + srcB
dest ? srcA + srcB + C
dest ? srcA – srcB
dest ? srcA – srcB – C
AND
OR
XOR
异或
F5,6
F5,6
F5,6
dest ? srcA & srcB
dest ? srcA | srcB
dest ? srcA ^ srcB
LSL
LSR
ASR
ROT
逻辑左移
逻辑右移
算术右移
循环移位
F5,6
F5,6
F5,6
F5,6
dest ? srcA << srcB
dest ? srcA >> srcB
dest ? srcA >> srcB  最高位扩展符号位
dest ? srcA >>> srcB
XXX.F
.F参数
 
对于上面的所有指令,标志位根据目的寄存器的值设定标志位
LDH
高位装载
F7
dest?{Immediate19,0…0}目的寄存器最高位由Immediate19替换
 
特殊类指令
特殊类指令完成特殊寄存器与通用寄存器中数据的交换功能。对于特殊寄存器的读写权限根据内核/用户模式信号确定。
助记符
名称
格式
说明
LRFS
SRIS
CLC
从特殊寄存器进行装载
保存寄存器数据到特殊寄存器
清除Cache
F8
F9
F11
rC?sA rC通用寄存器,sA特殊寄存器
sC?rB sC特殊寄存器,rB通用寄存器
清除Cache
 在处理器模式KERNEL_MODE下,13个特殊寄存器均可读可写。在用户模式USER_MODE下,特殊寄存器PC、RPC以及LPC可以进行读和写,但是状态寄存器SR只能进行读操作,只有最后几位SR[3:0]可以进行写操作,对其他位的写操作无效。对禁止读/写的寄存器进行操作将会导致一个异常中断PRIVILEGE_VIOLATION。还有使用不带操作数的指令格式F11的控制指令CLC。
 
  综合指令
 
助记符
名称
实现
CLR
NEG
NOP
NOT
JMP
RET
清除
求负数
无操作
按位求反
跳转
子程序返回
XOR Rd,R0,R0
SUB Rd,R0,Rd
XOR R0,R0,R0
XOR Rd,Ra,-1
SRIS PC,Rb
SRIS PC,Rb

以上是关于设计mips32cpu时,运算指令溢出怎么处理的主要内容,如果未能解决你的问题,请参考以下文章

MIPS32的DIV和DIVU实现

计算机组成与设计—— 流水线处理器

CPU和GPU的运算机制的差异

MIPS汇编程序设计——四则运算计算器

FPU 浮点运算单元和DSP指令

一条指令在cpu中的执行流程(理解CPU组成)