gpt4 book ai didi

ios - 了解Xcode中的x86-64汇编代码

转载 作者:行者123 更新时间:2023-12-01 19:45:27 24 4
gpt4 key购买 nike

我没有使用汇编或x86-64的丰富经验,并且在调试特定于iOS版本的错误时,无法理解Xcode提供的以下汇编代码:

0x108f5607a <+18>:  movq   0x3fe98f(%rip), %rsi      ; "intrinsicContentSize"
0x108f56081 <+25>: movq 0x47c158(%rip), %r12 ; (void *)0x000000010b4aa800: objc_msgSend
0x108f56088 <+32>: callq *%r12
0x108f5608b <+35>: movsd %xmm0, -0x30(%rbp)
0x108f56090 <+40>: movsd %xmm1, -0x28(%rbp)
0x108f56095 <+45>: movq 0x426ea4(%rip), %rsi ; "_contentHuggingPriorities"
0x108f5609c <+52>: movq %rbx, %rdi
0x108f5609f <+55>: callq *%r12
0x108f560a2 <+58>: movsd %xmm0, -0x40(%rbp)
0x108f560a7 <+63>: movsd %xmm1, -0x38(%rbp)
0x108f560ac <+68>: movq 0x426e9d(%rip), %rsi ; "_contentCompressionResistancePriorities"
0x108f560b3 <+75>: movq %rbx, %rdi
0x108f560b6 <+78>: callq *%r12
0x108f560b9 <+81>: movsd %xmm0, -0x50(%rbp)
0x108f560be <+86>: movsd %xmm1, -0x48(%rbp)

多亏了汇编代码的注释,我可以猜测正在发送3条消息:
  • [obj intrinsicContentSize]
  • [obj _contentHuggingPriorities]
  • [obj _contentCompressionResistance]

  • 但是,我不了解 movsd指令的用途。这是否会将上述方法调用的返回值复制到寄存器中以供当前函数使用?如果是,那么假设调用 intrinsicContentSize_contentHuggingPriorities的结果被 _contentCompressionResistance的结果覆盖是正确的吗?

    最佳答案

    这是否是将上述方法调用的返回值复制到寄存器以便在当前函数中使用的方法?

    不,相反。 movsd %xmm0, -0x40(%rbp)是从 xmm0到堆栈本地的存储区。在AT&T语法中,目的地位于最后。 (与Intel语法相比,操作数列表是相反的。如果您对Intel语法更熟悉,请将调试器设置为显示Intel语法中的反汇编)。

    在此代码中:r12拥有一个指向objc_msgSend的函数指针,并对其进行了三个调用。您的反汇编程序为使用RIP相对寻址模式访问的静态位置提供了有用的符号名称。

    x86-64 System V调用约定的相关部分:

    RDI和RSI中的

  • 整数args,按此顺序。传递arg的寄存器被调用。 (仅将2个args传递给此函数,因此不使用RDX,RCX,R8,R9)。
  • RBX保留调用,此代码使用它重新初始化第三个参数均为相同值的第一个arg传递寄存器(RDI)。 (假设RBX = RDI在第一个之前;您没有显示出来)。
  • 在%xmm0和%xmm1中返回了两个FP返回值或一个结构。
  • 所有xmm / ymm / zmm寄存器都经过调用处理,因此FP值必须在函数调用之间溢出,而不是简单地复制到保留调用的寄存器中(因为没有)。
  • 关于ios - 了解Xcode中的x86-64汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48840935/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com