没有合适的资源?快使用搜索试试~ 我知道了~
MIPS-C 可以支持除浮点运算外的绝大多数定点类程序的运行,并且提供了包括 CP0、异常处理等指令,可以支持简单的操作系统的运行。功能分类 助记符功能(16
资源详情
资源评论
资源推荐
附录A MIPS-C 指令集
A.1 MIPS-C 指令表
本书从 MIPS 指令集中选择了一些常用指令构成了 MIPS-C 指令集。MIPS-C 可以支持除
浮点运算外的绝大多数定点类程序的运行,并且提供了包括 CP0、异常处理等指令,可以
支持简单的操作系统的运行。MIPS-C 指令集共包括 55 条指令。从更细致的功能角度,
MIPS-C 被划分为 9 个子类。
功能
分类
助记符
功能
OPCODE/
FUNCT
(16 进制)
操作
(VerilogHDL 语法描述)
加载
LB
加载字节
20H
R[rt] = {24{Mem[GPR[rs]+sign_ext(offset)][7]},
Mem[GPR[rs]+sign_ext(offset)][7:0]}
LBU
加载字节
(无符号)
24H
R[rt] = {24’b0, Mem[GPR[rs]+
sign_ext(offset)][7:0]}
LH
加载半字
21H
R[rt] = {16{Mem[GPR[rs]+sign_ext(offset)][15]},
Mem[GPR[rs]+sign_ext(offset)][15:0]}
LHU
加载半字
(无符号)
25H
R[rt] = {16’b0, Mem[GPR[rs]+
sign_ext(offset)][15:0]}
LW
加载字
23H
R[rt] = Mem[GPR[rs]+sign_ext(offset)]
保存
SB
存储字节
28H
Mem[GPR[rs]+sign_ext(offset)][7:0] = R[rt][7:0]
SH
存储半字
29H
Mem[GPR[rs]+sign_ext(offset)][15:0] =
R[rt][15:0]
SW
存储字
2BH
Mem[GPR[rs]+sign_ext(offset)] = R[rt]
R-R
运算
ADD
加
0/20H
GPR[rd] = GPR[rs] + GPR[rt]
ADDU
无符号加
0/21H
GPR[rd] = GPR[rs] + GPR[rt]
SUB
减
0/22H
GPR[rd] = GPR[rs] - GPR[rt]
SUBU
无符号减
0/23H
GPR[rd] = GPR[rs] - GPR[rt]
MULT
乘
0/18H
{HI, LO} = GPR[rs] × GPR[rt]
MULTU
乘(无符号)
0/19H
{HI, LO} = GPR[rs] × GPR[rt]
DIV
除
0/1AH
{HI, LO} = GPR[rs] / GPR[rt]
DIVU
除(无符号)
0/1BH
{HI, LO} = GPR[rs] / GPR[rt]
SLT
小于置 1
0/2AH
GPR[rd] = (GPR[rs] < GPR[rt]) ? 1:0
SLTU
小于置 1
(无符号)
0/2BH
GPR[rd] = (GPR[rs] < GPR[rt]) ? 1:0
SLL
逻辑左移
0/0H
GPR[rd] = {GPR[rt][31-s:0], s{0}}
SRL
逻辑右移
0/2H
GPR[rd] = {s{0}, GPR[rt][31:s]}
SRA
算术右移
0/3H
GPR[rd] = {s{GPR[rt][31]}, GPR[rt][31:s]}
SLLV
逻辑可变左移
0/4H
GPR[rd] = {GPR[rt][31-v:0], v{0}}
SRLV
逻辑可变右移
0/6H
GPR[rd] = {v{0}, GPR[rt][31:v]}
SRAV
算术可变右移
0/7H
GPR[rd] = {v{GPR[rt][31]}, GPR[rt][31:v]}
AND
与
0/24H
GPR[rd] = GPR[rs] & GPR[rt]
OR
或
0/25H
GPR[rd] = GPR[rs] | GPR[rt]
XOR
异或
0/26H
GPR[rd] = GPR[rs] ^ GPR[rt]
NOR
或非
0/27H
GPR[rd] = ~(GPR[rs] | GPR[rt])
R-I
运算
ADDI
加立即数
8H
GPR[rt] = GPR[rs] + SignExt(Imm)
ADDIU
加立即数
(无符号)
9H
GPR[rt] = GPR[rs] + SignExt(Imm)
ANDI
与立即数
CH
GPR[rt] = GPR[rs] & ZeroExt(Imm)
ORI
或立即数
DH
GPR[rt] = GPR[rs] | ZeroExt(Imm)
XORI
异或立即数
EH
GPR[rt] = GPR[rs] ^ ZeroExt(Imm)
LUI
立即数加载至高
位
FH
GPR[rt] = {imm, 16’b0}
SLTI
小于立即数置 1
AH
GPR[rt] = (GPR[rs] < SignExt(Imm)) ? 1 : 0
SLTIU
小于立即数置 1
(无符号)
BH
GPR[rt] = (GPR[rs] < SignExt(Imm)) ? 1 : 0
分支
BEQ
等于转移
4H
if (GPR[rs] == GPR[rt])
PC = PC + 4 + BranchAddr
BNE
不等转移
5H
if (GPR[rs] != GPR[rt])
PC = PC + 4 + BranchAddr
BLEZ
小于等于 0 转移
6H
if (GPR[rs] <= 0)
PC = PC + 4 + BranchAddr
BGTZ
大于 0 转移
7H
if (GPR[rs] > 0)
PC = PC + 4 + BranchAddr
BLTZ
小于 0 转移
特殊编码
if (GPR[rs] <0)
PC = PC + 4 + BranchAddr
BGEZ
大于等于 0 转移
特殊编码
if (GPR[rs] >= 0)
PC = PC + 4 + BranchAddr
跳转
J
跳转
2H
PC = JumpAddr
JAL
跳转并链接
3H
PC = JumpAddr; GPR[31] = PC + 4
JALR
跳转并链接寄存
器
0/9H
PC = GPR[rs]; GPR[rd] = PC + 4
JR
跳转寄存器
0/8H
PC = GPR[rs]
传输
MFHI
读 HI寄存器
0/10H
GPR[rd] = HI
MFLO
读 LO 寄存器
0/12H
GPR[rd] = LO
MTHI
写 HI寄存器
0/11H
HI = GPR[rs]
MTLO
写 LO 寄存器
0/13H
LO = GPR[rs]
特权
ERET
异常返回
10/18H
PC = EPC;还需要对 CP0 的其他寄存器做处理
MFC0
读 CP0 寄存器
特殊编码
GPR[rt] = CP0[rd]
MTC0
写 CP0 寄存器
特殊编码
CP0[rd] = GPR[rt]
陷阱
BREAK
断点异常
0/DH
EPC = PC+4;
PC = 异常处理地址;
CP0 的其他寄存器做处理
SYSCA
LL
系统调用异常
0/CH
EPC = PC+4;
PC = 异常处理地址;
CP0 的其他寄存器做处理
BLTZ:INSTR
31..26
/INSTR
20..16
=01/00H
BGEZ:INSTR
31..26
/INSTR
20..16
=01/01H
MFC0:INSTR
31..26
/INSTR
25..21
=10/00H
MTC0:INSTR
31..26
/INSTR
25..21
=10/04H
A.2 MIPS-C 指令图
A.3 加载指令
1. lb:加载字节
编码
31
26
25
21
20
16
15
0
lb
100000
base
rt
offset
6
5
5
16
格式
lb rt, offset(base)
描述
GPR[rt] memory[GPR[base]+offset]
操作
Addr GPR[base] + sign_ext(offset)
memword memory[Addr]
byte Addr
1..0
GPR[rt] sign_ext(memword
7+8*byte..8*byte
)
示例
lb $v1, 3($s0)
2. lbu:加载无符号字节
编码
31
26
25
21
20
16
15
0
lbu
100100
base
rt
offset
6
5
5
16
格式
lbu rt, offset(base)
描述
GPR[rt] memory[GPR[base]+offset]
操作
Addr GPR[base] + sign_ext(offset)
memword memory[Addr]
byte Addr
1..0
GPR[rt] zero_ext(memword
7+8*byte..8*byte
)
示例
lbu $v1, 3($s0)
3. lh:加载半字
编码
31
26
25
21
20
16
15
0
lh
100001
base
rt
offset
6
5
5
16
格式
lh rt, offset(base)
描述
GPR[rt] memory[GPR[base]+offset]
操作
Addr GPR[base] + sign_ext(offset)
memword memory[Addr]
byte Addr
1
GPR[rt] sign_ext(memword
15+16*byte..16*byte
)
示例
lh $v1, 3($s0)
约束
Addr 必须是 2 的倍数(即 Addr
0
必须为 0),否则产生地址错误异常
4. lhu:加载无符号半字
编码
31
26
25
21
20
16
15
0
lhu
100101
base
rt
offset
6
5
5
16
剩余18页未读,继续阅读
艾斯·歪
- 粉丝: 33
- 资源: 343
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0