方法-(BOOL) f { return true; }
(在我的iMac上)的程序集是:
test`-[AppDelegate f]:
0x1000014d0 <+0>: pushq %rbp
0x1000014d1 <+1>: movq %rsp, %rbp
0x1000014d4 <+4>: movb $0x1, %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 - &gt; Debug Workflow - &gt;总是显示反汇编)上设置断点。
我很惊讶这是八条指令。
pushq %rbp
movq %rsp, %rbp
:
popq %rbp
retq
^这似乎是管理堆栈和返回的标准样板。
movb $0x1, %al
movsbl %al, %eax
^这会将十六进制00 00 00 01加载到EAX中,这是用于返回值的寄存器。
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/有帮助。
答案 0 :(得分:8)
在ObjC中,每个方法都有两个隐含参数self
和_cmd
。这些是在%rdi和%rsi中传递的(这是64位ABI的规则)。如果我们用这个方法中的某个地方的另一个函数调用覆盖那些寄存器,它们将被保存到堆栈中。如果启用优化,您将看到这些指令被删除(因为我们实际上从未需要保存的值)。
答案 1 :(得分:0)