繁体   English   中英

比较Intel vs Arm Registers与Swift / lldb

[英]Comparing Intel vs Arm Registers with Swift / lldb

当检查Swift iOS函数的寄存器时,我不明白为什么我不能创建某些arm64寄存器到x86 / 64寄存器的简单映射。 我一直在寻找函数的入口。

我尝试了以下映射,但是没有用。

在此处输入图片说明

通过下面@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)

如果您只是在查看调用约定并在函数的进入/退出处注册(不在中间),那么可以,对于x86-64 System V调用约定而言,它们是正确的。

有关函数调用约定的摘要,请参见在i386和x86-64上UNIX和Linux系统调用的调用约定是什么(请参见https://github.com/hjl-tools/x86-psABI/wiki/X86- psABI ,了解ABI的全部详细信息,包括按大小传递/返回大小结构的大小,以及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映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM