04MIPS指令系统(1)_447408859

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机原理
(计算机原理)
第4讲MIPS指令系统(1)
1
MIPS
体系结构概述
数据处理指令
数据传送指令
分支与跳转指令
MIPS指令格式
第4讲MIPS指令系统(1)
MIPS诞生于1980年代,是最早的RISC处理器之一,
也是目前销量最好的RISC处理器之一,从游戏机到路由器,再到SGI的超级计算机,都可以看到MIPS CPU 的应用
MIPS起源于Stanford大学John Hennessy教授的研
究成果。

Hennessy于1984年在硅谷创立了MIPS公司()
John L. Hennessy出版了两本著名的教科书:
Computer Organization and Design : The
Hardware/Software Interface(计算机组成与设计:硬件/软件接口)
Computer Architecture : A Quantitative
Approach(计算机体系结构:量化方法)
MIPS=Microprocessor without Interlocked
Pipeline Stages,无互锁流水级的微处理器MIPS的另一个含义是每秒百万条指令——
Millions of instructions per second
MIPS体系结构的发展
MIPS体系结构经历了以下几代
MIPS I——该指令集用于最初的32位处理器,
至今仍然很流行,R2000、R3000都是MIPS I
的实现
MIPS II——MIPS I的升级,最初为R6000定义,
失败
MIPS III——应用于R4000的64位指令集
MIPS IV——MIPS III的升级,应用于R5000和
R10000
32个通用寄存器可供编程使用:$0~$31,其

$0无论写入什么永远返回0
$31被子程序调用指令(“跳转与链接指令”)用
来保存返回地址
除此以外,所有寄存器都可以在任何指令中以
相同方式使用——真正通用
通用寄存器的习惯用法和命名
寄存器编号助记符用法
0zero永远为0
1at用做汇编器的临时变量
2-3v0, v1用于过程调用时返回结果
4-7a0-a3用于过程调用时传递参数
8-15t0-t7临时寄存器。

在过程调用中被调用者不需要保存与恢复
24-25t8-t9
16-23s0-s7保存寄存器。

在过程调用中被调用者一旦使用这些寄存器时,
必须负责保存和恢复这些寄存器的原值
26,27k0,k1通常被中断或异常处理程序使用,用来保存一些系统参数28gp全局指针。

一些运行系统维护这个指针来更方便的存取static
和extern变量
29sp堆栈指针
30fp帧指针
31ra返回地址
整数乘除法相关的寄存器
有两个和乘法相关的寄存器hi和lo,用来保存
计算结果
它们不是通用寄存器,只能用于乘除操作
32位MIPS指令集的特点
所有指令都是32位定长的
算术/逻辑运算指令为3操作数指令格式,目标
操作数只能是寄存器操作数,两个源操作数中一个只能是寄存器操作数,另一个只能是寄存器操作数或立即数
每条指令只能执行一个操作(运算)
内存寻址
对内存的访问只能通过装入(load)和存储
(store)指令进行。

算术/逻辑运算指令不能直接访问内存
数据在内存中存储时必须按字边界对齐
32位——字,16位——半字,8位——字节
MIPS指令的分类
MIPS指令集包括三类指令:
数据处理指令——实现算术与逻辑运算
数据传送指令——实现寄存器和内存间的数据
交换
分支与跳转指令——实现程序流程控制
MIPS
体系结构概述
数据处理指令
数据传送指令
分支与跳转指令
MIPS指令格式
第4讲MIPS指令系统(1)
加法
add $t0,$t1,$t2# $t0 = $t1 + $t2
减法
sub $t2,$t3,$t4# $t2 = $t3 -$t4
注释
寄存器以$符号开始
编译C语言的赋值语句
f= (g + h) –(i + j)
add t1, g, h
add t2, i, j
sub f, t1, t2
add $t1, $s1, $s2
add $t2, $s3, $s4
sub $s0, $t1, $t2
假设变量f、g、h、i、j分
别分配给寄存器$s0~$s4
临时变量t1、t2分别分配
给寄存器$t1、$t2
加16位有符号立即数
addi$t2,$t3, 5# $t2 = $t3 + 5
MIPS没有减立即数的指令,如何实现减立
即数操作?
and $t0,$t1,$t2# $t0 = $t1 & $t2 or $t0,$t1,$t2 # $t0 = $t1 | $t2 xor$t0,$t1,$t2# $t0 = $t1 $t2 nor $t0,$t1,$t2 # $t0 = ~($t1 | $t2)
如何实现NOT运算?
立即数逻辑运算
andi$t0,$t1,10
ori$t0,$t1,10
xori$t0,$t1,10
nor没有立即数版本,为什么?
移位运算,移位量为立即数
逻辑左移——
sll$t0, $t1, 10# $t0 = $t1 << 10,shift left logical 逻辑右移——
srl$t0, $t1, 10# $t0 = $t1 >> 10,shift right logical 算术右移——
sra$t0, $t1, 10# $t0 = $t1 >> 10,shift right arithm.
移位运算
逻辑左移
0逻辑右移0
算术右移
逻辑运算指令
移位运算,移位量在某个寄存器中
sllv$t0, $t1, $t3# $t0 = $t1 << ($t3%32)
srlv$t0, $t1, $t3# $t0 = $t1 >> ($t3%32
srav$t0, $t1, $t3# $t0 = $t1 >> ($t3%32)
比较指令
比较两个寄存器的内容,并根据比较的结果设
置第三个寄存器
slt$t1,$t2,$t3# if ($t2 < $t3) $t1=1;
# else $t1=0
sltu$t1,$t2,$t3# 无符号比较
寄存器与立即数比较
slti$t1,$t2,10# 与立即数比较
sltui$t1,$t2,10# 与无符号立即数比较
MIPS
体系结构概述
数据处理指令
数据传送指令
分支与跳转指令
MIPS指令格式
第4讲MIPS指令系统(1)
实现内存到寄存器的数据传送
lw$t1, 30($t2)#Load word MIPS只支持基址(变址)+偏移量的内存寻
址方式
存放基址的寄存器称为基址寄存器,指令
中的常量称为偏移量
lh$t1, 40($t3)#Load half word
lb$t1, 40($t3)#Load byte
lh从内存读取一个半字,装入寄存器最右边
16位,寄存器最左边16位以该半字的符号位填充;lb从内存读取一个字节,装入寄存器最右边8位,寄存器最左边24位以该字节的符号位填充——符号扩展
lhu$t1, 40($t3)#Load half word unsigned lbu$t1, 40($t3)#Load byte unsigned
lhu从内存读取一个半字,装入寄存器最右
边16位,寄存器最左边16位补0;lbu从内存读取一个字节,装入寄存器最右边8位,寄存器最左边24位补0——零扩展
将某个小位数二进制数扩展到更多位数的大位
数二进制数时,有两种扩展方法
符号扩展(sign extension)
用小位数二进制数的符号位填充大位数二进制
数新增的高端各位
在处理不同长度有符号数的时候,必须使用符
号扩展
8位16位32位
80
hex FF80
hex
FFFFFF80
hex
28
hex 0028
hex
00000028
hex
9A
hex FF9A
hex
FFFFFF9A
hex
零扩展(zero extension)
用零来填充大位数操作数的高端各位
在处理不同长度无符号数的时候,必须使用零
扩展
8位16位32位
80
hex 0080
hex
00000080
hex
28
hex 0028
hex
00000028
hex
9A
hex 009A
hex
0000009A
hex
存储(store)指令
实现寄存器到内存的数据传送
sw$t3, 500($t4) #Store word
sh$t3, 502($t2) #Store half
sb$t2, 41($t3) #Store byte
sb把寄存器最右边8位写入内存,sh把寄存
器最右边16位写入内存
虽然MIPS有32个通用寄存器,但是在某些情
况下(例如子程序调用)仍然需要将寄存器的内容换出到内存中,在这种情形下,栈是保存寄存器内容的理想场所
MIPS有一个$sp寄存器可以用做栈指针
将数据放入栈中称为压栈(PUSH),从栈中取
出数据称为出栈(POP)
例,将$s1、$s2、$s3寄存器的内容压入栈
addi$sp, $sp, -12
sw$s1, 8($sp)
sw$s2, 4($sp)
sw$s3, 0($sp)
高地址
低地址
$sp
压桟前
高地址
低地址
$sp
压桟后
$s3的内容
$s2的内容
$s1的内容
习惯上,栈按照从高到
到低的地址顺序增长
栈操作
出桟操作
lw $s1, 8($sp)lw $s2, 4($sp)lw $s3, 0($sp)addi $sp, $sp, 12
高地址低地址
$sp
出桟前
高地址低地址
$sp
出桟后
$s3的内容
$s2的内容$s1的内容
装入高位立即数
装入高位立即数(load upper immediate)
lui$t1, 30
例,将32位立即数0x1234abcd装入$t1寄存

lui$t1, 0x1234
ori$t1, $t1, 0xabcd
MIPS
体系结构概述
数据处理指令
数据传送指令
分支与跳转指令
MIPS指令格式
第4讲MIPS指令系统(1)
分支(branch)指令
beq$t0, $t1, Target#如果$t0=$t1,则分支执
#行标号为Target的指令bne$t0, $t1, Target#如果$t0!=$t1,则分支执
#行标号为Target的指令分支指令与比较指令相结合,可以实现各种条
件分支:相等、不等、小于、小于或等于、大于、大于或等于
跳转(jump)指令
无条件分支
j Lable#无条件跳转到标号Lable处

unsigned int i, j;

If(i <= j)
f =
g + h;
else
f =
g -h;
sltu$t2, $s4, $s3
beq$t2, $zero, Else
sub $s0, $s1, $s2
j Exit
Else: add $s0, $s1, $s2
Exit: …
汇编代码
假设变量f、g、h 、i、j分
配给寄存器$s0~$s4

while(save[i] == k)
i += 1;
Loop:sll$t1, $s3, 2
add $t1, $t1, $s6
lw$t0, 0($t1)
bne$t0, $s5, Exit
addi$s3, $s3, 1
j Loop
汇编代码
假设变量i、k对应寄存器
$s3和$s5,数组save的基
址存放在$s6中
MIPS
体系结构概述
数据处理指令
数据传送指令
分支与跳转指令
MIPS指令格式
第4讲MIPS指令系统(1)
MIPS指令格式MIPS有三种指令格式:
R格式(Register format)
I格式(Immediate format)
J格式(Jump format)
R 格式
Op 为操作码
Rs 、Rt 为两个源寄存器Rd 为目标寄存器
Shamt 字段为移位量,用于移位指令Funct 字段为指令功能码
Op
Rs
Rt
Rd
Shamt
Funct
6位
5位
5位
5位
5位
6位
用于寄存器-寄存器类型的ALU指令,包括算
术运算指令、逻辑运算指令和比较指令
大多数ALU指令的操作码字段为0,指令执行
的操作由功能码字段Funct决定
算术运算指令、位运算指令和比较指令的移位量字段为0
00000010010100111000100000100000
Op Rs Rt Rd Shamt Funct
例:add $s1, $s2, $s30x02538820
6位5位5位5位5位6位
移位指令格式1:
sll rd, rt, shamt
移位量由移位量字段shamt决定,shamt必须在0~31之间,Rs字段为0
00000000000100101000101010000011
Op Rs Rt Rd Shamt Funct
例:sra$s1, $s2, 100x00128a83
6位5位5位5位5位6位
移位指令格式2:
sllv rd, rt, rs
移位量由Rs字段决定,移位量字段为0
000000100111001010001000000000111
Op Rs Rt Rd Shamt Funct 例:srav$s1, $s2, $s30x02728807 6位5位5位5位5位6位
用于装入/存储指令、分支指令和寄存器-立即
数类型的ALU指令
Op Rs Rt Offset/Imm
6位5位5位16位
数据装入
汇编语言格式:lw rt, Offset(Rs)功能:Rt = Mem[Rs + Offset]
10001110010100010000 0000 0110 0100
6位5位5位16位
例:lw $s1, 100($s2)
0x8e510064
Op
Rs
Rt
Offset
数据存储
汇编语言格式:sw rt, Offset(Rs)功能:Mem[Rs + Address] = Rt
例:sw $s1, 100($s2)
0xae510064
10101110010100010000 0000 0110 0100
6位5位5位16位
Op
Rs
Rt
Offset
分支指令
汇编语言格式1:
beq rs, rt, Label
功能:if(Rs<relation> Rt) goto
(PC+4)+(Offset<<2)
分支指令采用的寻址方式为PC相对寻址
Offset与(PC+4)相加之前左移2位,这是因为转
移的距离一定4的整数倍,实际在指令中存放的是18位偏移量的高16位,实际的分支范围是向下215-1条指令,向上215条指令
立即数ALU 指令
00100011101111010000 0000 0000 0100
6位
5位
5位
16位
例:addi $sp, $sp, 4
0x23bd0004
Op Rs Rt Imm
跳转指令、跳转与链接指令的格式
J格式指令采用伪直接寻址——跳转地址为指令中的26位常数左移2位后与PC中的高位拼接得到
Op Target
6位26位。

相关文档
最新文档