ARM汇编有SWI和SVC指令,可以进入“监管模式”。
让我感到困惑的是,为什么会有两个?这里说SVC曾经是SWI。这是否意味着它们基本上改变了助记符号?它们是一样的吗?我可以互换使用它们吗?一个是在架构之前存在的,另一个是架构之后才有的吗?
ARM汇编有SWI和SVC指令,可以进入“监管模式”。
让我感到困惑的是,为什么会有两个?这里说SVC曾经是SWI。这是否意味着它们基本上改变了助记符号?它们是一样的吗?我可以互换使用它们吗?一个是在架构之前存在的,另一个是架构之后才有的吗?
是的,SWI和SVC是同一件事,只是名称变了。以前,SVC指令被称为SWI,即软件中断。
SVC(和SWI)的操作码部分由用户定义(位0-23是用户定义的,类似于SVC处理程序的参数)。位24-27是b1111,这4位使CPU意识到操作码是SVC(或SWI)。 更多细节请参见ARM信息中心。
在ARMv8的附录K6“AArch32指令集的传统指令语法”中,有一个很好的UAL vs pre-UAL助记符表。
其中一个条目如下:
Pre-UAL syntax UAL equivalent
SWI SVC
该文明确说明它们是等效的。
在GNU GAS中,您可以使用.syntax unified
选择UAL语法。
从GCC开始,您可以使用-masm-syntax-unified
选项进行内联汇编,尽管由于一些已经修复的错误,在8.2.0版本中无法正常工作: 如何在GCC中编写.syntax unified UAL ARMv7内联汇编?
UAL与pre-UAL除了某些指令名称之外,还有进一步的影响,例如在某些整数文字中是否需要#
: ARM汇编中立即值是否需要哈希标记?