计算机原理与设计-32位MIPS 指令
MIPS指令基础
- 基本知识
- MIPS指令集
- 指令格式
- I型指令
- R型指令
- J型指令
- 寄存器与编码
- 指令详情
- 算数指令
- 数据传输指令
- 逻辑指令
- 分支指令
- 跳转指令
- MIPS指令翻译示例
- 斐波那契数列
- 字符串复制
基本知识
定义:计算机语言中的基本单词称为指令,一台计算机的全部指令称为该计算机的指令集。
指令集:MIPS(RISC)、ARMv7/ARMv8(RISC)、Intel x86(CISC)。
字(Word):MIPS体系架构中,寄存器大小为32位,称32位为一个字。
补码:计算机中有符号整数的最高位作为符号位,负数使用补码表示,x + (~x) = -1,所以负数的表示形 式为-x = (~x)+1。
逻辑右移与符号右移:位右移时使用0填充高位与使用符号位填充高位的区别。
MIPS指令集
指令格式
32位MIPS指令集的长度均为32位,保持所有指令长度相同,但不同类型指令有不同的格式,为R型MIPS字段命名如下:
op | rs | rt | rd | shamt | funct |
---|---|---|---|---|---|
6位 | 5位 | 5位 | 5位 | 5位 | 6位 |
指令操作码 | 源寄存器1 | 源寄存器2 | 目的寄存器 | 位移量(移位指令) | 功能码 |
I型指令
op | rs | rt | constant or address |
---|---|---|---|
6位 | 5位 | 5位 | 16位 |
指令操作码 | 源寄存器 | 目的寄存器 | 立即数或地址 |
R型指令
op | rs | rt | rd | shamt | funct |
---|---|---|---|---|---|
6位 | 5位 | 5位 | 5位 | 5位 | 6位 |
指令操作码 | 源寄存器 | 寄存器2 | 目的寄存器 | 位移量(移位指令) | 功能码 |
J型指令
指令:j 10000
op | address |
---|---|
6位 | 26位 |
2 | 10000 |
指令:bne $s0,$s1,Exit
op | rs | rt | address |
---|---|---|---|
6位 | 5位 | 5位 | 16位 |
5 | 16 | 17 | Exit |
寄存器与编码
Register | Regsiter Code Value(op字段) | Description |
---|---|---|
zero | 0 | 存储0值,用于辅助计算 |
v0—>v1 | 2~3 | 过程调用:返回值寄存器 |
a0—>a3 | 4~7 | 过程调用:参数寄存器(Argument Register),传递参数值 |
t0—> t7 | 8~15 | 8个临时寄存器(Temporary Register),过程调用时无需保存旧值 |
s0—> s7 | 16~23 | 8个保留寄存器(Saved Register),过程调用时需要被压栈保存并恢复 |
t8—> t9 | 24~25 | 2个临时寄存器(Temporary Register),过程调用时无需保存旧值 |
gp | 28 | 全局指针(Global Pointer):指向静态数据区的保留寄存器 |
sp | 29 | 栈指针(Stack Pointer) |
fp | 30 | 过程调用:帧指针(Frame Pointer),指向过程帧的第一个字,在过程有局部变量时为变量提供统一的偏移基址 |
ra | 31 | 过程调用:返回地址寄存器(Return Address Register) |
at、k0、k1 | 32,26,27 | at由汇编器保留使用,以进行伪指令的翻译,k0~k1由操作系统保留 |
指令详情
算数指令
指令 | 示例 | 说明 |
---|---|---|
加法 | add $s1,$s2,$s3 | $s1 = $s2 + $s3 |
减法 | sub $s1,$s2,$s3 | $s1 = $s2 - $s3 |
立即数加法 | add $s1,$s2,20 | $s1 = $s2 + 20 立即数可为负数 |
数据传输指令
指令 | 示例 | 说明 |
---|---|---|
取字 | lw $s1,20($s2) | $s1 = memory[$s2 + 20], load word |
存字 | sw $s1,20($s2) | memory[$s2+20] = $s1, store word |
取半字 | lh $s1,20($s2) | $s1 = memory[$s2 + 20], load half |
取无符号半字 | lhu $s1,20($s2) | $s1 = memory[$s2 + 20], load half unsigned |
存半字 | sh $s1,20($s2) | memory[$s2+20] = $s1, store half |
取字节 | lb $s1,20($s2) | $s1 = memory[$s2 + 20], load byte |
取无符号半字 | lbu $s1,20($s2) | $s1 = memory[$s2 + 20], load byte unsigned |
存半字 | sb $s1,20($s2) | memory[$s2+20] = $s1, store byte |
取链接字 | ll $s1,20($s2) | $s1 = memory[$s2+20], load link word,取字作为原子交换的前半部分 |
存条件字 | sc $s1,20($s2) | memory[$s2+20] = $s1, $s1 = 0或1,store condition word,如果对应的连接字被更改了,则将寄存器值设置为0 |
取立即数的高位 | lui $s1,20 | $s1 = 20∗21620*2^{16}20∗216, load upper immediate |
逻辑指令
指令 | 示例 | 说明 |
---|---|---|
与 | and $s1,$s2,$s3 | $s1 = $s2 & $s3 |
或 | or $s1,$s2,$s3 | $s1 = $s2 | $s3 |
或非 | nor $s1,$s2,$s3 | $s1 = ~($s2 | $s3) |
立即数与 | andi $s1,$s2,20 | $s1 = $s2 & 20 |
立即数或 | ori $s1,$s2,20 | $s1 = $s2 | 20 |
逻辑左移 | sll $s1,$s2,10 | $s1 = $s2 << 10 |
逻辑右移 | srl $s1,$s2,10 | $s1 = $s2 >> 10 |
分支指令
指令 | 示例 | 说明 |
---|---|---|
相等时分支 | beq $s1,$s2,25 | if($s1 == $s2) goto PC + 4 + 25 * 4, branch equal |
不等时分支 | bne $s1,$s2,25 | if($s1 != $s2) goto PC + 4 + 25 * 4, branch not equal |
小于时置位 | slt $s1,$s2,$s3 | if($s2 < $s3) $s1 = 1 else $s1 = 0, set less than |
无符号小于时置位 | sltu $s1,$s2,$s3 | if($s2 < $s3) $s1 = 1 else $s1 = 0, set less than unsigned |
跳转指令
指令 | 示例 | 说明 |
---|---|---|
跳转 | j 2500 | goto 2500 * 4, jump |
寄存器跳转 | jr $ra | goto $ra, jump register |
跳转并链接 | jal 2500 | $ra = PC + 4, goto 4 * 2500, jump and link |
MIPS指令翻译示例
斐波那契数列
int fact(int n)
{if(n < 1) return 1;else return (n * fact(n - 1));
}
下面为上述程序的 MIPS汇编代码
。
fact: addi $sp, $sp, -8 //sp指针预留8字节sw $ra, 4($sp) //保存返回地址sw $a0, 0($sp) //保存参数nslti $t0, $a0, 1 //if n < 1 $t0 = 1 else $t0 = 0beq $t0, $zero, L1 //if n >= 1 goto L1addi $v0, $zero, 1 //return 1addi $sp, $sp, 8 //弹栈jr $ra //寄存器跳转
L1: addi $a0, $a0, -1 //参数更新为n-1jal fact //链接跳转lw $a0, 0($sp) //取当前的参数值nlw $ra, 4($sp) //将返回地址加载到$raaddi $sp, $sp, 8 //弹栈mul $v0, $v0, $a0 //return n * fact(n - 1)jr $ra //寄存器跳转
字符串复制
void strcpy(char x[], char y[])
{int i;i = 0;while((x[i] = y[i]) != '\0')i += 1;
}
addi $sp, $sp, -4sw $s1, 0($sp) //保存s1内容add $t1, $zero, $%zero //$t1 = 0
L1: add $t2, $t1, $a2 //$t2 = y + iadd $t3, $t1, $a1 //$t3 = x + ilbu $s1, 0($t2) //$s1 = y[i]sb $s1, 0($t3) //x[i] = $s1addi $t1, $t1, 1 //$t1 = $t1 + 1bne $s1, $zero, L1 //if $s1 == 0 goto L1lw $s1, 0($sp) //恢复s1内容addi $sp, $sp, 4 jr $ra
计算机原理与设计-32位MIPS 指令相关推荐
- 32位mips指令说明
空指令(1条) nop指令 逻辑运算指令(8条) and.or.xor.nor指令 ...
- 计算机组成与原理如何书写DEC微指令,计算机组成原理课程设计16位机微程序控制器指令系统设计与实现.doc...
计算机组成原理课程设计16位机微程序控制器指令系统设计与实现 一.设计题目 16位机微程序控制器指令系统的设计与实现 二.设计目的 通过看懂教学计算机组合逻辑控制器中已经设计好并正常运行的几条基本指令 ...
- 32位MIPS流水线CPU设计
32位MIPS流水线CPU设计 一. 实验信息 二. 实验内容 (一) 设计原理及实验方案 1.总体设计思路: 2.基础指令部分原理图: 3.扩展指令后controls赋值的真值表:(与单周期几乎相同 ...
- 计算机原理课程设计 第二版pdf,计算机原理课程设计.pdf
第 1 页 共 10 页 计算机原理课程设计 计算机原理课程设计 成员信息成员信息 小组编号 8 成员信息 姓名 学号 实验分工 分值比例 组长 XXX 20040602XXXX 编写测试程序 总体测 ...
- 计算机原理与设计verilog pdf,计算机原理与设计: Verilog HDL版
摘要: 李亚民教授长期从事计算机原理和体系结构的教学与研究,他的新书<计算机原理与设计--VerilogHDL版>讲述计算机原理,计算机设计以及如何用VerilogHDL实现设计.主要内容 ...
- 现在使用计算机字长是多少位,现在使用的计算机字长都是32位
语音内容: 大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 现在使用的计算机字长不一定是32位,还有64位的.若一台计算机的字长为32位,则表明该计算机在CPU中能够作为一个整体 ...
- mips的旁路_64位MIPS指令处理器的流水线设计
1 引言 随着集成电路设计和工艺技术的发展,嵌入式系统(SOC)已经在PDA.机顶盒.手机等信息终端中被广泛应用.他不仅减小了电路尺寸,而且具有成本低廉,可靠性高,功耗低等优点.可以说嵌入式系统是未来 ...
- 32位mips运算器logisim_很多网友问32位低功耗MCU设计
传统的低功耗 MCU 设计都是以8位MCU为主,因为8 位内核阈门相对较少,运行或泄露电流低,售价也相对低廉.但是,许多新兴的应用都需要比8位内核更大的处理效率.近年智慧生活的抬头.物联网的建立,手持 ...
- 【2020/12/4修订】【梳理】计算机组成与设计 第2章 指令(docx)
配套教材: Computer Organization and Design: The Hardware / Software Interface (5th Edition) 这是专业必修课<计 ...
最新文章
- UVA 141 The Spot Game
- 通信大数据应用未来还有很大的想象空间
- 关于C++中vector和set使用sort方法进行排序
- Python3实现32位整数翻转
- CVPR 2019 论文大盘点—人体姿态篇
- dz后台html,discuz X1.5 论坛后台站长常用操作小结
- 9.2 配置rsync+inotify实时同步
- 【AI教程】AI科研绘图
- Linux系统之安装mariadb方法
- Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Archit
- 贝壳找房上海研发全员被优化,公司回应来了!
- 【Codeforces301E】Yaroslav and Arrangements
- VMR-21论文总结
- Java程序启动QQ(九)
- windows 2008 r2或win7安装SP1补丁,安装sqlserver 2012
- 简洁明了的插值音频重采样算法例子 (附完整C代码)
- uview——switch开关 列表修改状态
- 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第8章 指针 课后习题答案
- 使 ASP.NET Web 站点易于访问
- 三种方法在当前目录下打开cmd命令窗口