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

Lar*_*ara 3 assembly instruction-set

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

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

我的问题是:

  • 如果我想成为一名专业的汇编程序员,我是否有理由避免这些令人困惑的抽象?
  • 专业的汇编编程是否缺乏这种类型的抽象?

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

Eri*_*idt 5

作为一名“专业汇编程序员”,您会疏忽使用可以将值从一个寄存器移动到另一个寄存器的晦涩的 3 操作数形式,而不是易于阅读的move伪指令,与使用晦涩的 3 操作数形式移动相同将立即数写入寄存器而不是易于阅读的li伪指令。

\n

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

\n

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

\n

例如,比较寄存器与立即数的分支(硬件不直接支持)有一个扩展,需要将立即值加载到寄存器中,以便使用寄存器来注册比较。\xc2\xa0 如果您知道这一点,那么在循环中执行此操作时,我们可以将立即数加载到循环外部/之前的寄存器中,以保存该指令及其循环内部的周期。

\n

此外,一般来说,MIPS 汇编器支持使用 CPU 寄存器扩展和互连的伪指令$at。\xc2\xa0 因此,汇编程序员被警告不要使用该寄存器;调用约定描述$at为“为汇编程序保留”。\xc2\xa0 然而,CPU 寄存器是宝贵的资源,这种专用保留是一种浪费。\xc2\xa0 (注意,编译器不受此保留的约束,可以自由使用$at作为暂存寄存器[调用破坏]。)

\n

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

\n