MIPS 汇编学习

来源:互联网 发布:软件系统设计方案模板 编辑:程序博客网 时间:2024/05/17 23:27

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位
0 0
原创粉丝点击