当前位置:   article > 正文

01_MIPS架构初探_misp架构

misp架构

MIPS架构初探

MIPS基础

什么是MIPS?

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

  • MIPS版本
    • MIPS I
    • MIPS II
    • MIPS III
    • MIPS I
    • MIPS IV
    • PIPS V
    • MIPS 32/64
  • MIPS可选扩展
    • MIPS-3D 在3D处理时的可扩展选项
    • MDMX
    • MIPS16e
    • MIPSMT

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 nameComment
r0$zeroAlways 0
r1$atReserved for assembler
r2 - r3%v0 - $v1Stores results
r4 - r7$a0 - $a3Stores arguments,参数超过4个才会存放到栈上
r8 - r15$t0 - $t7Temporaries,not saved
r16 - r23$s0 - $s7Contents saved for use later
r24 - r25$t8 - $t8More temporaries,not saved
r26 - r27$k0 - $k1Reserved by operating system。 给中断使用
r28$gpGlobal pointer
r29$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 x64
  • MISP 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-gnu

sudo apt-get install linux-libc-dev-mips-cross
sudo apt-get install libc6-mips-cross libc6-dev-mips-cross
sudo apt-get install binutils-mips-linux-gnu gcc-mips-linux-gnu
sudo apt-get install g++-mips-linux-gnu

gcc-mipsel-linux-gnu

sudo apt-get install linux-libc-dev-mipsel-cross
sudo apt-get install libc6-mipsel-cross libc6-dev-mipsel-cross
sudo apt-get install binutils-mipsel-linux-gnu gcc-mipsel-linux-gnu
sudo apt-get install g++-mipsel-linux-gnu
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Qemu安装

安装系统模式

sudo apt-get install qemu
  • 1

安装用户模式

sudo apt-get install qemu-user-static
  • 1

编译并运行MIPS

通过 MARS 编译并运行 mips程序

.data
	myStr: .asciiz "hello\n"

.text
	li $v0,4		;载入立即数
	la $a0,myStr ;载入地址
	syscall  ;系统调用,$v0中存储的就是系统调用值
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

.data
	message: .asciiz "Hi, everybody.\nMy name is MIPS.\n"

.text
	main:
		jal displayMessage  ;跳转指令,1、跳转displayMessage地址,同时把下一条指令的地址写入到 $ra寄存器
		
		addi $s0,$zero,5
		
		li $v0,1
		add $a0,$zero,$s0
		syscall
		
	li $v0,10 ;系统调用,退出
	syscall
	
	displayMessage:
		li $v0,4
		la $a0,message
		syscall
		
		jr $ra	;跳转到 $ra地址的位置
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
.data
	newline: .asciiz "\n"
	
.text
	main:
		addi $s0,$zero,10
		jal increaseMyRegister
		
		# print a new line
		li $v0,4
		la $a0,newline
		syscall
		
		#pirnt value
		li $v0,1
		move $a0,$s0
		syscall
		
	li $v0,10
	syscall
	
	increaseMyRegister:
		addi $sp,$sp,-4 
		sw $s0,0($sp) # 提升栈, 获取参数 10
		
		addi $s0,$s0,30
		
		#print new value in function
		li $v0,1
		move $a0,$s0
		syscall
		
		lw $s0,0($sp)
		addi $sp,$sp,4 # 恢复栈
		
		jr $ra
	
	# 效果,输出 40  50
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

静态交叉编译MIPS程序

编写C源代码 hello.c
#include<stdio.h>
int main(void)
{
	printf("hello\n");
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
静态链接编译 (这里使用大端的进行编译)
mipsel-linux-gnu-gcc hello.c -o hello --static
  • 1
qemu模拟运行 (使用大端的进行运行)
qemu-mipsel ./hello
  • 1
动态链接编译 (小端编译)
mips-linux-gnu-gcc hello.c -o hello
  • 1
qemu模拟运行,需要指定动态链接库 (小端运行)
qemu-mips -L /usr/mips-linux-gnu ./hello
  • 1
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号