[祭祖实验2] MIPS语言基础了解(1)
关于伪指令
例子
什么是处理器指令集:
处理器只是在块硅晶片上所集成的超大规模的集成电路;
指令集,就是用来计算和控制计算机系统的一套命令的集合,而每一种新型的处理器在设计时就规定了一系列与硬件电路相配合的指令系统。
MIPS体系结构
• RISC是相对于CISC的 • RISC的杰出代表有ARM、POWERPC、MIPS •
CISC的处理器大家天天用,intel&amd的x86
对于一条汇编语言指令来说,有两个问题要解决
•要指出进行什么操作
•要指出大多数指令涉及的操作数和操作结果放在何处
-
MIPS不支持特征
关于操作数
通用寄存器的习惯用法和命名:
所有的MIPS指令都是32位长
简单性来自规则性
R-format: 所有其他
I-format: 用于有立即数的指令, lw, sw, beq, bne
J-format: 无条件跳转 j, 并连接jal
e.g.add $8,$9,$10
• 装入指令lw、存储指令sw的格式
– 数据装入lw:Rt = Mem[Rs + Address]
– 数据存储sw:Mem[Rs + Address] = Rt
• 只有装入lw(从内存中读出数据)和存储sw (写入内存中)指令实现对内存的访问
• 存储器寻址方式: c($rx) 寄存器rx的地址值+立即数c
- 分支指令采用的寻址方式为PC相对寻址——分支目标的地址是PC+4与指令中的偏移量之和。
– 跳转指令采用伪直接寻址。
跳转地址为指令中的26位常数与PC(program counter)中的高位拼接得到。
• 指令格式为什么要分三类呢?
– 所有指令长度相同,都是32位
– 要让每一条指令刚好合适,充分发挥作用 – ……提示:和ALU及指令译码电路设计有关
MIPS寻址方式
寄存器寻址
立即数寻址
基址或偏移寻址
PC相对寻址
伪直接寻址
算术运算指令
• 加法
add $ t0, $ t1, $t2 # $t0 = $t1 + $t2
• 减法
sub $t2, $t3, $t4 # $t2 = $t3 - $t4
注:寄存器以$开头
• 加16位有符号立即数
addi $ t2,$t3, 5 # $t2 = $t3 + 5
• MIPS没有减立即数的指令,如何实现减立即数操作?
逻辑运算指令
比较指令
栈操作
• 虽然MIPS有32个通用寄存器,但是在某些情况下(例如子程序调用)仍然需要将寄存器的内容换出到内存中,在这种情形下,栈是保存寄存器内容的理想场所
• MIPS有一个$sp寄存器可以用做栈指针,但没有下述操作(PUSH/POP)
• 将数据放入栈中称为压栈(PUSH),从栈中取出数据称为出栈(POP)
帧指针fp
装入高位立即数
分支指令
过程调用
• MIPS的过程调用遵循如下约定:
– 通过$ a0~$ a3四个参数寄存器传递参数
– 通过$ v0~$ v1两个返回值寄存器传递返回值
– 通过$ ra寄存器保存返回地址
• 子程序调用通过跳转与链接指令jal进行 jal Procedure
#将返回地址保存在$ra寄存器中
#程序跳转到过程Procedure处执行
子程序返回通过寄存器跳转指令jr进行
jr $ra # 跳转到寄存器指定的地址
临时寄存器不必保存
保存寄存器必须保存
嵌套调用
– 如果只有叶过程,情况非常简单,但现实是残酷
的
– 假设主程序调用过程A,参数为3时,将3存入$a0
中,jal A
– 再假设过程A调用过程B,参数为7时,同样存入
$a0,导致 $a0使用上的冲突
提高计算机性能的途径
• 一些技术可以在保持其他两项不变的前提下减少其中的一项:
采用优化编译技术,在目标代码中消除冗余代码,可以减少指令数,但是并不提高CPI和时钟周期。
采用快速电路技术或更为先进的结构减少信号传输延迟,可以减少时钟周期,但是并不提高CPI和指令数。