riscv指令的格式:
也就是说我们的内存(主存)最大可以有2^31GB大小,离谱。
这些都要记得。
算术运算指令:
立即数:
带一个i。
注意:没有立即数减法,因为可以用加法代替:
乘法和除法:
逻辑运算:
注意:这些操作都是按位的,每一位都要对比。
移位操作:
数据传输指令(就是访问主存的):
格式:
这里讲一下内存是怎么寻址的。
load word ,store word。
实例:
前面的数字是字节数,要乘以4.
字节排布:
就是说A[0]会是最低位。
比较指令:
没有写u,当然是有符号数。
条件分支指令:
B就是跳转,eq就是相等,ne就是不相等,lt就是less than,ge就是greater或eq。
例子:
无条件跳转:
这些寄存器要记住:
伪指令:
举个例子:
开头那个是函数名字,代表跳转到这里来了。弹出其实就是把指针往上移了一下。X1是返回地址。
刚刚这个例子牵涉到了函数,这里详细讲讲:
函数的调用:
jal记得是什么吗?会跳转到pa,同时在x1记下当前这个jal指令的pc+4,也就是紧接着下面的指令。等到函数用完了返回的时候,就可以直接用x1回来。
函数返回的时候都是以ra为标准返回的。为什么不可以像之前调用函数一样用j简单快捷的返回呢?因为调用函数的地方有很多,每个地方调用的都是同一个函数,j跳转的是固定位置,那岂不每次返回都要变成固定位置?所以只能是用ra记录一下这次是谁在调用函数,就像做了一个标记一样。
那个/是或的意思,不是除的意思,ppt有点歧义。
大家的寄存器就这么多,很容易不够用。比如说我要函数嵌套,ra里面存好了一开始的地址,结果函数里面又调用了一个函数,ra岂不就被覆盖了?所有我们要想办法,就是栈:
我更愿意把它想象成弹簧。
内存分配:
函数嵌套的例子: