2016-05-23 3 views
3

(私のiMac上)メソッド-(BOOL) f { return true; }ためのアセンブリは、次のとおりです。- (BOOL)fの分解を理解する{trueを返します。 }

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 

(I return文とデバッグにブレークポイントを設定し、これを生成する - >常に分解を示した - >デバッグワークフロー)。

私はそれが8命令であることに驚いた。

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

^これは、スタックを管理して戻るための標準的な定型書であるようです。

movb $0x1, %al 
movsbl %al, %eax 

^これは、戻り値に使用されるレジスタであるEAXに16進数00 00 00 01をロードします。

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/が役に立ちました。

答えて

7

あらゆる方法、self_cmdには、2つの暗黙のパラメータがあります。これらは%rdiと%rsiに渡されます(これは64ビットABIのルールです)。これらのレジスタを、このメソッドのどこかで別の関数呼び出しで上書きする場合は、スタックに保存されます。最適化をオンにすると、それらの命令が削除されていることがわかります(実際に保存された値は決して必要ないため)。

0

これは、プロローグとエピローグの機能です。 ObjCで

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

+1

いいえ、OPは機能のプロローグとエピローグではなく、中間の命令について質問しています。質問から、OPはそれらについて明確に分かっています。 – Kegluneq

+0

実際に彼らは何をしているのか推測しましたが、技術的な名前は分かりませんでした。だから+1。 –

関連する問題