汇编中的伪指令和软件抽象



这更像是一个一般性的理论问题。

我正在学习一些汇编语言,并注意到一些软件,如MARS for MIPS,实现了在体系结构的真实指令集中不存在的抽象,这些抽象似乎被称为伪指令,例如li,以及其他舒适的抽象,如整齐的数组创建等。

我的问题是

  • 是否有一些原因让我避免这些confy抽象,如果我想成为一个专业的汇编程序员?
  • 专业汇编编程缺乏这种类型的抽象吗?

我有点怀疑它的存在只是为了教育目的,但我没有找到任何关于这方面的信息。

作为一个"专业汇编程序员",你会忽略使用模糊的3操作数形式,可以将一个值从一个寄存器移动到另一个寄存器,而不是易于阅读的move伪指令,同样,使用模糊的3操作数形式将一个直接对象移动到寄存器中,而不是易于阅读的li伪指令。

避免伪指令的主要原因是如果你的导师说你不能使用它们。

然而,在使用它们时,我们应该理解它们,并且它们可能导致意想不到的低效率。许多伪指令(但不是全部)扩展为2或3条真正的硬件指令。使用它们隐藏了优化的机会。

举个例子,比较寄存器和立即值(硬件不直接支持)的分支有一个扩展,需要将一个立即值加载到寄存器中,以便使用寄存器进行比较。如果你意识到这一点,那么在循环中执行此操作,我们可以将直接加载到循环外部/之前的寄存器中以保存该指令&它在循环内循环。

此外,一般来说,MIPS汇编器支持使用CPU寄存器$at扩展和互连伪指令。因此,汇编程序员被告诫不要使用这个寄存器;调用约定将$at描述为"为汇编程序保留"。然而,CPU寄存器是宝贵的资源,这种专用的预留是一种浪费。(注意编译器不受此限制,可以自由地使用$at作为暂存寄存器[call clobbered])

RISC V及其汇编程序已经消除了这种"汇编程序保留"。寄存器(将其返回给程序员),并且只支持无需汇编程序专用寄存器即可完成的伪指令。虽然仍然支持各种lw $regtrg, label($regsrc)表单(尽管它们很难看),但不支持类似的sw表单,因为这些表单需要额外的寄存器!RISC V还删除了两个$k寄存器(为操作系统保留),将它们交还给用户模式代码,并且还扩展了调用约定,以便在寄存器中传递更多参数。这些变化使得RISC V更有效地使用稀缺资源(CPU寄存器)。

最新更新