首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mips、lw和sw指令中偏移的意义是什么?

在mips、lw和sw指令中偏移的意义是什么?
EN

Stack Overflow用户
提问于 2021-09-01 14:04:40
回答 1查看 1.4K关注 0票数 1

我的老师刚刚讨论了这个话题,但我仍然在质疑为什么要用偏移量。它是用某种前缀对值进行分类吗?如果你能用一种简单的方式解释为什么在这些说明中使用偏移量,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-01 14:38:47

偏移量用于几种不同的场景。下面是一些示例:

  1. 许多算法自然涉及像A[i+1]. 这样的表达式编译器将计算A+i,并使用偏移量4来获得+1 (假设A是由4个字节元素组成的数组)。

展开循环后,甚至只涉及A[i],展开部件介绍了A[i+1]A[i+2]等的用法。偏移量是有用的。

  1. 当我们访问基于堆栈的内存时,基本寄存器将是堆栈指针,在这里注册$sp. ,偏移量显示要访问的堆栈槽,因此非常方便地访问基于堆栈的本地变量。

  1. 存在堆栈的隐藏用法(对C程序员隐藏),包括保存$s寄存器值、返回地址寄存器值$ra,以及潜在地传递到寄存器中的参数。访问时还使用$sp作为基本寄存器和适当的偏移量以到达正确的时隙。

不适合寄存器的参数将在堆栈上传递,并使用$sp作为基本值和适当的偏移量进行访问,调用方(设置参数)和被调用方(访问它们)都会访问这些参数。

可以使用两个指令序列访问

  1. 全局变量,然后使用lui和带有适当偏移量的lwsw进行访问。lui指令形成一个较高的16位,lwsw指令提供一个较低的16位。因此,可以形成一个32位地址,以便访问地址空间中的任何地方的全局变量。

g 232

  1. 对象有字段,访问字段是使用指向对象的指针和对象内字段的偏移量完成的。因此,在C中,f1的偏移量为8,因此,f1将使用加载或存储,其中p作为基本寄存器,8作为偏移量。p->f2将使用相同的p,但使用不同的偏移量。

总之,有相当多的情况下,基+非零常数是有用的。零常数也非常有用,正如您已经知道的*p (简单取消引用)和A[i] (数组索引),因此MIPS选择只提供一种寻址模式。

其他架构提供了几种寻址模式,例如取消偏移量和无偏移量(除其他外),因此对于它们,您可以选择不偏移量,而不是提供零偏移量。然后,您可以使用较短的指令,因为没有偏移量编码(短指令有利于代码密度,这对指令缓存性能很好). 。然而,为了利用这一点,您需要一个可变长度指令集和更多编码,这两者都是MIPS根据其RISC哲学选择的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69015320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档