了解 -(BOOL) f { return true 的反汇编; }

Understanding disassembly for -(BOOL) f { return true; }

方法 -(BOOL) f { return true; } 的程序集(在我的 iMac 上)是:

test`-[AppDelegate f]:
    0x1000014d0 <+0>:  pushq  %rbp
    0x1000014d1 <+1>:  movq   %rsp, %rbp
    0x1000014d4 <+4>:  movb   [=11=]x1, %al
    0x1000014d6 <+6>:  movq   %rdi, -0x8(%rbp)
    0x1000014da <+10>: movq   %rsi, -0x10(%rbp)
->  0x1000014de <+14>: movsbl %al, %eax
    0x1000014e1 <+17>: popq   %rbp
    0x1000014e2 <+18>: retq   

(为了生成这个,我在 return 语句和 Debug -> Debug Workflow -> Always show disassembly 上设置了一个断点)。

我很惊讶这是八个指令。

pushq  %rbp
movq   %rsp, %rbp
:
popq   %rbp
retq

^ 这似乎是管理堆栈和 returning 的标准样板。

movb   [=13=]x1, %al
movsbl %al, %eax

^ 这会将十六进制 00 00 00 01 加载到 EAX,这是用于 return 值的寄存器。

movq   %rdi, -0x8(%rbp)
movq   %rsi, -0x10(%rbp)

^ 但是这些在做什么?以上6行还不够吗?

编辑:我发现 http://www.idryman.org/blog/2014/12/02/writing-64-bit-assembly-on-mac-os-x/ 有帮助。

这是函数序言和结语。

https://en.wikipedia.org/wiki/Function_prologue

在 ObjC 中,每个方法都有两个隐式参数,self_cmd。这些在 %rdi 和 %rsi 中传递(这是 64 位 ABI 的规则)。它们被保存到堆栈中,以防我们用此方法中某处的另一个函数调用覆盖这些寄存器。如果您打开优化,您会看到这些指令已被删除(因为我们实际上从来不需要保存的值)。