当检查Swift iOS函数的寄存器时,我不明白为什么我不能创建某些arm64寄存器到x86 / 64寄存器的简单映射。我一直在寻找函数的入口。
我尝试了以下映射,但是没有用。
ANSWERED ,由@JasonMolenda撰写。
lldb为此具有方便的$arg
变量。
(lldb) reg read $arg5
x4 = 0x0000000000000020
(lldb) po $arg3
1
(lldb) p/x $arg3
(unsigned long) $4 = 0x0000000000000001
现在,您无需记住x86 / 64到arm64的映射:o)
答案 0 :(得分:2)
如果您只是在查看调用约定并在函数的进入/退出处注册(不在中间),那么是的,这些对于x86-64 System V调用约定是正确的。
有关函数调用约定的摘要,请参见What are the calling conventions for UNIX & Linux system calls on i386 and x86-64(有关ABI的完整详细信息,请参见https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI,包括如何传递/返回小或大结构以及FP值)按值。)
根据https://en.wikipedia.org/wiki/Calling_convention#ARM_(A64),AArch64的标准调用约定在x0..x7
中传递args,并在x0
中返回。 (从该超简短摘要中尚不清楚,可以在寄存器中返回多大的arg,是否可以在x1:x0中返回16字节的结构。)
但是内部一个函数,完全取决于编译器,甚至没有尝试使用类似的代码源。
您正在为单独的体系结构编译单独的二进制文件。在针对x86-64进行编译时,编译器甚至可能甚至没有试图使asm看起来像AArch64一样,只是应用“按条件”规则并使asm为x86-64尽可能高效地实现该功能。
不同的调整试探法将导致不同的内联和其他代码生成决策。
AArch64比x86-64具有更多的体系结构寄存器。显然,即使您使用的x86-64编译器试图使x86-64 asm与AArch64 asm相同,也无法实现1:1映射。