我的老师刚刚讨论了这个话题,但我仍然在质疑为什么要用偏移量。它是用某种前缀对值进行分类吗?如果你能用一种简单的方式解释为什么在这些说明中使用偏移量,我将不胜感激。
发布于 2021-09-01 14:38:47
偏移量用于几种不同的场景。下面是一些示例:
A[i+1]. 这样的表达式编译器将计算A+i,并使用偏移量4来获得+1 (假设A是由4个字节元素组成的数组)。展开循环后,甚至只涉及A[i],展开部件介绍了A[i+1]、A[i+2]等的用法。偏移量是有用的。
$sp. ,偏移量显示要访问的堆栈槽,因此非常方便地访问基于堆栈的本地变量。$s寄存器值、返回地址寄存器值$ra,以及潜在地传递到寄存器中的参数。访问时还使用$sp作为基本寄存器和适当的偏移量以到达正确的时隙。不适合寄存器的参数将在堆栈上传递,并使用$sp作为基本值和适当的偏移量进行访问,调用方(设置参数)和被调用方(访问它们)都会访问这些参数。
可以使用两个指令序列访问
lui和带有适当偏移量的lw或sw进行访问。lui指令形成一个较高的16位,lw或sw指令提供一个较低的16位。因此,可以形成一个32位地址,以便访问地址空间中的任何地方的全局变量。g 232
f1的偏移量为8,因此,f1将使用加载或存储,其中p作为基本寄存器,8作为偏移量。p->f2将使用相同的p,但使用不同的偏移量。总之,有相当多的情况下,基+非零常数是有用的。零常数也非常有用,正如您已经知道的*p (简单取消引用)和A[i] (数组索引),因此MIPS选择只提供一种寻址模式。
其他架构提供了几种寻址模式,例如取消偏移量和无偏移量(除其他外),因此对于它们,您可以选择不偏移量,而不是提供零偏移量。然后,您可以使用较短的指令,因为没有偏移量编码(短指令有利于代码密度,这对指令缓存性能很好). 。然而,为了利用这一点,您需要一个可变长度指令集和更多编码,这两者都是MIPS根据其RISC哲学选择的。
https://stackoverflow.com/questions/69015320
复制相似问题