MIPS 汇编
2017年3月26日16:35:51 张飞online
1.mips汇编都是32位的,是$0-$31 ,但是为了方便我们也可以用别名然后通过编译器实现替换,当然这些别名都是约定好的$0 返回值永远是0 用于清0
$31 函数的返回值,像x86的ax,arm中的r?(忘了)
2.和x86相比,有人说是目标寄存器的位置不一样,个人觉得扯淡,我可是学过x86的,x86的目标寄存器也是左边。
3.反而觉得是mips诸多指令是3个操作数
4.这里重要说一下的是程序计数器,看书上讲程序计数器不是寄存器(是不是以后研究)但后面有句话值得理解,那就是对于有多级流水线的
cpu其实你是不好说,现在程序计数器里面的值,(的确如此,曾经学arm汇编的时候就纠结过,取指令和执行肯定不是一个,那么程序计数器究竟
指向那个。。。。。。。呵呵呵呵,不研究了)
5.jal指令后面的指令,看意思应该可以看懂就是跳转,x86的jmp,arm的b,bl 到了mips是jal,但要注意:
jal print
move $4,$6(不是返回这里)
调用会返回到这里哦!
其实这里还是很好理解的,这里的move叫延迟槽,其实之所以可以理解原因是俩点,
1,再学校学习dsp汇编的时候好像就有这样的指令
2 ,他的作用好像是排空流水线(以后研究,好像是这个作用),但要明确的是程序是执行完move才跳转的,那么返回地址不言而喻
对了mips是没有状态寄存器或者说是标志位的,这个要注意,反正我学过的这些cpu还没见过这么搞
hi 和 lo 是乘除用的寄存器,一般不做他用,用于放乘除的结果,当然可以通过特殊指令实现存放
6.上面提了一般的寄存器,如果有协处理器,那么这个肯定是有的(现在来看),比如fpa(不是fpga啊呵呵呵呵)是浮点运算协处理器
$f0 -$f31
7. 子程序的返回通常用 jr ra 让保存了返回地址,时候mips里面没有ret
8.mips只有一种寻址,任何加载和存储都可以写成 lw $1,offset($2)
我们来分析一下这条指令
lw这是固定指令,$1是目标寄存器,那么$2和offset(构成了偏移)offset是16位的有符号的
(-32768,,32767)完美32k上32k下 ,64k范围寻址。
9.32位的空间如何存储,有符号数符号位扩展填充,无符号数0填充(其他的处理器好像也是如此)
64位也是如此扩展
8 ld
4 lw
2 lh
b lb
10.对于内存的快速读取,load和store俩条指令可以实现读取,但是慢,很多编译器通过gt指向,偏移实现寻址
这个明天查书细看吧
11 . .set noreorder 其实就是不优化是伪指令
misp 四代指令扩展到了64位,但是扩展的干净利落,完全兼容了32位