L7 过程调用
caller和callee各有各的责任
每个register的作用展示
jal 是 jump and link 两步:第一个把下一个指令的地址给ra,第二个是跳的target address
jr copy the ra to the pc
因为可能重复使用相同的register,这样就污染了调用者的状态,于是我们把要保留的register的压栈,一般来说S的寄存器要压栈,而temp的寄存器don't care
然而对于递归调用来说,我们要考虑的更多:
因为这个参数和ra可能会被重写,所以要压栈
Callee权利:1.可以谁便使用v, a, t类型的寄存器,2.假设参数被正确传递
Caller为此做的保证:save ra, a, v, t
Caller可以不保留s,因为s如果会被callee使用,会存在栈上先
load byte,因为不够寄存器的大小,所以要扩展:1.符号扩展和2.无符号扩展,取决于load的类型lb, lbu。
关于立即数太大的问题
可以把16bit为前移动,然后,再来or上一个16bit的数,这样就成了一个32bit的数辣(:
beq和bne的,rs, rt是两个要比较的寄存器,同时因为我们的instruction都是4个byte,也都是从4的倍数地址开始的。so使用不是4倍数的byte 是非法的,所以这个immediate是word immediate (offset = immediate * 4)因为我们默认pc已经加了4了,所以这个offset是作用在pc + 4上面的
L8
因为这个opcode要保留6bit,所以我们最多给这个26bit给这个地址。同时利用上面提到的优化,我们从后面补两个0,就是4的倍数。但是我们还是少了4个bit,怎么解决?毕竟内存是2的32次方的
我们从pc头部借用4个bit, 然后我们将内存分为16个分区,这样我们在与pc同一个分区内的地址就可以任意到达。
关于这个256MB = 2 8 10 10 bits?可能是ppt写错了。。。
compiler是把higher level变成汇编语言,然后变成机器码,然后一些不知道怎么跳转的地方,通过linker来后面决定,然后就从内存读取程序运行辣