首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解x86-64汇编代码

理解x86-64汇编代码
EN

Stack Overflow用户
提问于 2018-02-17 11:49:37
回答 1查看 589关注 0票数 1

我没有使用程序集或x8664的大量经验,而且在调试特定于iOS版本的bug时,我很难理解Xcode提供的这个程序集代码:

代码语言:javascript
复制
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的结果覆盖,是否正确?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-17 12:45:33

这是将上述方法调用的返回值复制到寄存器以用于当前函数吗?

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

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

x86-64系统V呼叫公约的相关部分:

  • RDI和RSI中的整数args按该顺序排列。Arg传递寄存器被呼叫失败。(只有2个args传递给这个函数,因此不使用RDX、RCX、R8、R9 )。
  • RBX被调用保护,这段代码使用它重新插入第一个arg传递寄存器(RDI),对所有三个调用都具有相同的值。(假设RBX = RDI在第一个之前;您没有显示这一点)。
  • 在%xmm1 0和%xmm1 1中返回两个FP返回值或结构。
  • 所有xmm/ymm/zmm寄存器都是调用失败的,因此FP值必须跨函数调用溢出,而不是简单地复制到一个调用保留寄存器(因为没有任何)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48840935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档