Xcode调试iOS版本特定bug:x86-64汇编movsd指令作用咨询
关于Xcode汇编中
movsd指令及OC方法返回值的解析 嘿,我来帮你理清这个疑惑!你提到的这几个UIKit相关方法,它们的返回值类型刚好和movsd指令的作用完全对应,咱们一步步拆解:
首先,先明确这三个方法的返回值类型,这是理解汇编的关键:
[obj intrinsicContentSize]:返回CGSize,在x86-64的iOS环境下,CGFloat是64位双精度浮点数(double),所以这个结构体是两个double组成的16字节数据[obj _contentHuggingPriorities]和[obj _contentCompressionResistance]:返回的UILayoutPriority本质就是double类型
接下来看movsd指令:
在x86-64架构里,movsd是Move Scalar Double-Precision Floating-Point Value的缩写,专门用来处理64位双精度浮点数的移动操作。它的格式通常是movsd 源操作数, 目标操作数,支持在XMM浮点寄存器和内存之间互传数据。
然后结合OC的调用约定:
对于iOS的x86-64环境,浮点类型(包括由浮点组成的小结构体)的返回值会放在XMM系列寄存器里:
- 单个
double(比如那两个优先级方法的返回值)会存在XMM0寄存器中 - 像
CGSize这种由两个double组成的16字节结构体,会用XMM0存width、XMM1存height
所以你看到的movsd指令,大概率就是在做这些返回值的“中转”:
- 如果是
movsd %xmm0, 0xXX(%rbp):就是把XMM寄存器里的方法返回值(比如优先级数值,或者CGSize的width/height)保存到栈上的局部变量位置 - 如果是
movsd 0xXX(%rbp), %xmm0:则是把之前存在栈上的浮点值重新加载到XMM寄存器,供后续代码使用
总结一下你的疑问:没错,这些movsd指令确实是在处理这三个方法调用的返回值,要么是把寄存器里的返回值存到内存,要么是从内存读取到寄存器,都是x86-64架构下处理浮点返回值的标准操作。
内容的提问来源于stack exchange,提问作者peco




