Performance 为什么在arm64 ABI中不使用SVC的立即值?

Performance 为什么在arm64 ABI中不使用SVC的立即值?,performance,optimization,arm,arm64,abi,Performance,Optimization,Arm,Arm64,Abi,在aarch32中,更准确地说是ARM-OABI,仍然使用swi的立即值来传输系统调用号。另一方面,在ARM-EABI中,使用寄存器swi#0则表示应使用寄存器 此选项在aarch64中不再可用,因此我一直使用此组合: mov x8, syscall_number svc #0 为什么我必须在此处添加额外的4字节代码大小,而立即值这次仍然未使用? 根据ARM程序员指南,立即值存储在异常综合征寄存器ESR_EL中,因此应可通过mrs读取。或者这已经是一个太大的性能损失 参考资料:

在aarch32中,更准确地说是ARM-OABI,仍然使用
swi
的立即值来传输系统调用号。另一方面,在ARM-EABI中,使用寄存器<代码>swi#0则表示应使用寄存器

此选项在aarch64中不再可用,因此我一直使用此组合:

mov  x8, syscall_number
svc  #0
为什么我必须在此处添加额外的4字节代码大小,而立即值这次仍然未使用?

根据ARM程序员指南,立即值存储在异常综合征寄存器
ESR_EL
中,因此应可通过
mrs
读取。或者这已经是一个太大的性能损失


参考资料:


可能是因为它在aarch32中没有意义。或者可能是因为设置寄存器比硬编码指令更容易。(只有一个helper函数而不是许多helper函数)它与
ESR\u ELx
没有任何关系-无论如何都需要读取寄存器,以便将系统调用与其他同步异常(如数据中止)区分开来。这实际上取决于操作系统的选择。ARM64 Windows使用SVC指令上的立即数值来选择哪个系统调用。我认为,将系统呼叫号码作为即时消息稍微有利于安全性,因为它限制了ROP小工具的使用机会。