首页 > 编程知识 正文

01_MIPS架构初探

时间:2023-05-04 17:38:57 阅读:275851 作者:4137

MIPS架构初探 MIPS基础 什么是MIPS?

MIPS(无互锁流水线微处理器)是一种精简(RISC)指令系统结构(ISA),起源于Stanford大学John Hennessy教授的研究成果

MIPS版本 MIPS IMIPS IIMIPS IIIMIPS IMIPS IVPIPS VMIPS 32/64 MIPS可选扩展 MIPS-3D 在3D处理时的可扩展选项MDMXMIPS16eMIPSMT

CISC(Complex Instruction Set Computer)复杂指令计算机。Interl的X86、AMD的K5、K6未该类型

RISC(Reduced Instruction Set Computer)精简指令计算机。Acron公司的ARM、IBM的PowerPC、MIPS公司的MIPS为该类型

MIPS结构的基本特点

优先选取一些使用频率最高的简单指令,以及一些很有用但不复杂的指令指令长度固定,格式种类少,个字段划分比较一致,各字段功能比较规整只有存数,取数,访问存储器,其余指令的操作都是在寄存器之间进行CPU中通常寄存器数量较多

假如有一个4字节的数据为0x12 34 56 78 (十进制:305419896,0x12为高字节,0x78为低字节),若将其存放于地址0x4000 8000中

内存地址0x4000 8000(低地址)0x4000 80010x4000 80020x4000 8003(高地址)大端模式0x12(高字节)0x340x560x78(低字节)小端模式0x78(低字节)0x560x340x12(高字节)

mips : big-endian的mips架构

mipsel : little-endian的mips架构

MIPS应用领域

计算机、电视机、龙芯芯片、摄像头、路由器 …

MIPS汇编 MIPS寄存器 registerAssembly nameCommentr0$zeroAlways 0r1$atReserved for assemblerr2 - r3%v0 - $v1Stores resultsr4 - r7$a0 - $a3Stores arguments,参数超过4个才会存放到栈上r8 - r15$t0 - $t7Temporaries,not savedr16 - r23$s0 - $s7Contents saved for use laterr24 - r25$t8 - $t8More temporaries,not savedr26 - r27$k0 - $k1Reserved by operating system。 给中断使用r28$gpGlobal pointerr29$spStack pointer。栈r30$fpFrame pointer。栈r31$raReturn address$f0 - $f3-Floating point return values$f4 - $f10-Temporary registers,not preserved by subprograms$12 - $f14-First two arguments to subprograms,not preserved by subprograms$16 - $f18-More temporary registers,not preserved by subprograms$f20 - $31-Saved registers,preserved by subprograms

一般情况下,32位处理器中每个寄存器的大小是32位,即4字节

MIPS五级流水线

取指令 : 将指令从指令Cache中取出,并计算下一条指令的地址读操作数及转移: 根据指令从寄存器中读出操作数,同时若为转移指令,满足转移条件时设置PC执行: 根据指令进行计算,若为存取类指令,则计算地址访问存储器: 若为存取类指令,对进行数据Cache进行读写写结果: 将执行或存取的结果写回寄存器 MIPS指令集 R格式指令为纯寄存器指令,所有的操作数(除移位外)均保存在寄存器中,Op字段均为0,使用funct字段区分指令I格式指令为带立即数的指令,最多使用两个寄存器,同时包括了load/store指令使用Op字段区分指令J格式指令为长跳转指令,仅有一个立即数操作数。使用Op字段区分指令
MIPS环境搭建 操作系统 : Ubuntu x64MISP IDE : MARS 4.5 (运行方式 java -jar mars.jar)在线网站 : https://rivoire.cs.sonoma.edu/cs351/wemips/交叉编译 : misp-linux-gnu*模拟环境 : qemu (最好是到github搜索qemu,通过官方文档给定的步骤进行安装)

MISP交叉编译链接工具

gcc-mips-linux-gnusudo apt-get install linux-libc-dev-mips-crosssudo apt-get install libc6-mips-cross libc6-dev-mips-crosssudo apt-get install binutils-mips-linux-gnu gcc-mips-linux-gnusudo apt-get install g++-mips-linux-gnugcc-mipsel-linux-gnusudo apt-get install linux-libc-dev-mipsel-crosssudo apt-get install libc6-mipsel-cross libc6-dev-mipsel-crosssudo apt-get install binutils-mipsel-linux-gnu gcc-mipsel-linux-gnusudo apt-get install g++-mipsel-linux-gnu

Qemu安装

安装系统模式

sudo apt-get install qemu

安装用户模式

sudo apt-get install qemu-user-static 编译并运行MIPS

通过 MARS 编译并运行 mips程序

.datamyStr: .asciiz "hellon".textli $v0,4;载入立即数la $a0,myStr ;载入地址syscall ;系统调用,$v0中存储的就是系统调用值

.datamessage: .asciiz "Hi, everybody.nMy name is MIPS.n".textmain:jal displayMessage ;跳转指令,1、跳转displayMessage地址,同时把下一条指令的地址写入到 $ra寄存器addi $s0,$zero,5li $v0,1add $a0,$zero,$s0syscallli $v0,10 ;系统调用,退出syscalldisplayMessage:li $v0,4la $a0,messagesyscalljr $ra;跳转到 $ra地址的位置 .datanewline: .asciiz "n".textmain:addi $s0,$zero,10jal increaseMyRegister# print a new lineli $v0,4la $a0,newlinesyscall#pirnt valueli $v0,1move $a0,$s0syscallli $v0,10syscallincreaseMyRegister:addi $sp,$sp,-4 sw $s0,0($sp) # 提升栈, 获取参数 10addi $s0,$s0,30#print new value in functionli $v0,1move $a0,$s0syscalllw $s0,0($sp)addi $sp,$sp,4 # 恢复栈jr $ra# 效果,输出 40 50 静态交叉编译MIPS程序 编写C源代码 hello.c #include<stdio.h>int main(void){printf("hellon");return 0;} 静态链接编译 (这里使用大端的进行编译) mipsel-linux-gnu-gcc hello.c -o hello --static qemu模拟运行 (使用大端的进行运行) qemu-mipsel ./hello 动态链接编译 (小端编译) mips-linux-gnu-gcc hello.c -o hello qemu模拟运行,需要指定动态链接库 (小端运行) qemu-mips -L /usr/mips-linux-gnu ./hello

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。