我没有使用程序集或x8664的大量经验,而且在调试特定于iOS版本的bug时,我很难理解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的结果覆盖,是否正确?
发布于 2018-02-17 12:45:33
这是将上述方法调用的返回值复制到寄存器以用于当前函数吗?
不,恰恰相反。movsd %xmm0, -0x40(%rbp)是从 xmm0到堆栈上的本地的存储。在AT&T语法中,目标位于最后。(操作数列表与Intel语法相反。如果您更熟悉Intel语法,请将调试器设置为以Intel语法显示反汇编)。
在这段代码中:r12保存一个指向objc_msgSend的函数指针,并使用它进行三个调用。反汇编程序为使用RIP相对寻址模式访问的静态位置提供了有用的符号名。
x86-64系统V呼叫公约的相关部分:
https://stackoverflow.com/questions/48840935
复制相似问题