408复习笔记—MIPS指令系统
以此文来大致理一下408中对mips基础知识的考察 用来帮我自己去回顾
主存储器和寄存器之间数据传送指令
首先是最重要的两条访存指令,mips只有这两条指令可以进行访存的操作
一个是sw:store指令 向主存对应存储单元中存入数据-将指定寄存器中的一个字的数据存到指定的内存单元中
一个是lw:load指令- 取出主存中对应存储单元的数据 将指定内存地址的一整个字的数据传送到指定的寄存器中
一般配合基址寻址来进行,sp相当于基址寄存器。
一般MIPS基址寄存器有32位
所以寻址范围是0-2的32次方-1——可寻址0到4GB内存地址范围
基址寻址 适合配合数组来进行, 基址寄存器保存了整个数组的首地址a[ ], 然后加上偏移量可以找到指定位置的数组元素,假如有一数组int a[i],以a[4]为例,将i的值放进r1寄存器,当前i=4
则a[4]的主存地址=a数组的首地址+[r1]*4,这里*4是因为按字节编址,一个int变量占4个字节,所以占了4个存储单元,故要偏移i*4。
模拟一下sw 2 16(4)的执行过程:
该sw指令取到mdr中,然后cu发出控制信号,将指令从mdr复制到ir中,经过cu译码,4号寄存器的值通过加法器加上16 得到的主存地址送到mar当中,mar将地址送到内存控制器中,然后将2号寄存器的值送到mdr ,cu发出主存写命令 再把mdr中的数据送到对应的主存地址所指向的存储单元中。
R[r]表示寄存器组中的r号寄存器中的内容
M[addr]主存地址为addr对应存储单元的内容
M[R[4]+12] 将4号寄存器中的值加上偏移量12组成addr1,表示主存的addr1地址对应的存储单元的内容
M[pc]表示pc所指内存中的指令
lw 2 12(4)的执行过程:
该lw指令取到mdr中,然后cu发出控制信号,将指令从mdr复制到ir中 ,cu 译码 分析操作码 发出控制信号将4号寄存器的值通过加法器 得到目标地址 送到mar中,地址再从mar送到内存控制器中,然后cu发出主存读命令 把对应主存单元中的值加载出来 放到2号寄存器中去。
注意:指令每取出到mdr中时,pc已经自动+4。
i型,J型,R型指令格式:
定长指令字 MIPS:
定长的指令让指令规整 利于cpu执行 但是容易造成空间浪费 所有指令都是32位 有些指令没必要用这么多位数的 一个操作数字段也要占32位 太浪费了
变长指令字 x86
MIPS一共有32个通用寄存器
左移右移的偏移量的范围位0到31 偏移32位则数据都为0了, 就没意义了,真题考过
r型高位6位op始终是6个0 代表 逻辑运算 这一种操作 它是有意义的 具体操作类型决定于低6位的功能码来确定 如加减乘除add sub div mul or and xor nor逻辑或非取反 移位 等 共有2的6次方64种操作类型
i型指令——immediate立即数的意思
如:addiu 无符号立即数相加
符号扩展立即数 lw sw
beq bne 也是属于i型指令 满足条件相当于跳转jmp pc指向beq指令的下一个指令的地址的值加上偏移量x一条指令字长占的存储单元的个数
这里尤其注意PC=PC+4+(offset*k)k为指令占的存储单元,这里的4就是移动到下一条指令的偏移,也就是4字节——4个存储单元,要注意题目里说的pc是不是指向的是当前指令的下一条指令的地址,如果是的话,就不用+4了!!!!!!!!!
这一块涉及到pc相对寻址。
J型:
散记:
for循环结构;
主存地址之间不能直接传数据 必须先到寄存器中
当前函数的局部变量或者上一层的函数的变量可以存到寄存器或者上一层zhanzhen中
lw 实现回到上一层帧底部
i型的偏移量只有16位表达的地址的大小太小了
j型指令 可以跳转更大范围的地址
W
未完待续