assembly SPARC v8:本地寄存器使用情况

3duebb1j  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(248)

我正在使用汇编程序混合高级语言。我可以使用本地寄存器(l0到l7)编程吗?因为我有两个观察。
1.编译器生成的机器代码没有本地寄存器。
1.陷阱模型使用的寄存器l0至l3。
考虑到以上两点,我可以使用本地寄存器进行汇编编程吗?
先谢谢你。

ca1c2owp

ca1c2owp1#

首先,如果你还没有看过,请看一下这个车轮图:https://icps.u-strasbg.fr/people/loechner/public_html/enseignement/SPARC/sparcstack.html它摘自SPARC V8体系结构手册,显示了in、out和本地寄存器的工作方式。
此图有两个主要要点。

  • 一个寄存器窗口的 in 寄存器与下一个窗口的 out 寄存器重叠。这可以用来将参数从调用函数传递到被调用函数。
  • 每个窗口的 local 寄存器 * 不 * 与任何内容重叠,因此您可以随意使用它们,而不会被其他函数破坏。即使由于调用堆栈深度超过物理窗口的数量而不得不在硬件中重用本地寄存器,本地寄存器的值也应该通过窗口更改陷阱透明地恢复。

简而言之,您的问题的答案是是的,您可以使用本地寄存器进行汇编编程。
要处理您的观察结果:
1.编译器有时会生成使用输入和输出寄存器而不是局部变量的汇编。我不知道这到底是为什么,但我在“玩具”程序上观察到了同样的事情。如果你添加更多的变量和/或使用更高的优化级别,它可能会开始使用局部变量。记住,i和o寄存器也是通用的,可以用于传递参数以外的用途。
1.我怀疑你搞错了。你是怎么得出这个结论的?
希望这能有所帮助。这主要是靠记忆,我在过去的一年里没有在SPARC上工作过,所以我欢迎更正。

相关问题