ARM 程序集具有用于进入“管理程序模式”的 SWI 和 SVC 指令。
令我困惑的是,为什么有两个? 这里据说SVC的前身是SWI。这是否意味着他们基本上改变了助记符?它们是同一件事吗?我可以互换使用它们吗?其中一个存在于架构之前,另一个存在于架构之后吗?
是的,
SWI
和SVC
是一样的,只是换了个名字而已。以前,SVC
指令称为 SWI
,软件中断。
SVC
(和SWI
)的操作码部分是用户定义的(位 0-23 是用户定义的,就像 SVC 处理程序的参数)。位 24-27 是 b1111
,这 4 位使 CPU 意识到操作码是 SVC
(或 SWI
)。在ARMv8附录K6“AArch32指令集的遗留指令语法”上有一个很好的UAL与pre-UAL助记表
该表的条目之一是:
Pre-UAL syntax UAL equivalent
SWI SVC
明确指出它们是等价的。
在 GNU GAS 上,您可以使用
.syntax unified
选择 UAL 语法。
在 GCC 中,您可以使用选项
-masm-syntax-unified
进行内联汇编,尽管由于当时修复的错误,它在 8.2.0 中不起作用:How to write .syntax Unified UAL ARMv7 inline assembly in GCC?
除了某些指令的名称之外,UAL 与 pre-UAL 还具有进一步的含义,例如某些整数文字中是否需要
#
:ARM 汇编中的立即值是否需要哈希?