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