2016-05-23 5 views
3

Die Anordnung für das Verfahren -(BOOL) f { return true; } (auf meinem iMac) ist:Disassemblierung für - (BOOL) f {return 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 

(diese zu erzeugen stelle ich einen Haltepunkt auf der return-Anweisung und Debug -> Debug Workflow -> Immer Demontage zeigen).

Ich war überrascht, es ist acht Anweisungen.

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

^Dies scheint Standard-Standardplatte für die Verwaltung des Stapels und Rückkehr.

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

^Dies lädt hex 00 00 00 01 in EAX, das ist das Register für den Rückgabewert.

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

^aber was diese tun? Sind die obigen 6 Zeilen nicht ausreichend?

EDIT: Ich fand http://www.idryman.org/blog/2014/12/02/writing-64-bit-assembly-on-mac-os-x/ hilfreich.

Antwort

7

In ObjC gibt es zwei implizite Parameter jeder Methode, self und _cmd. Diese werden in% rdi und% rsi übergeben (das sind die Regeln des 64-Bit-ABI). Sie werden auf dem Stack gespeichert, falls wir diese Register mit einem anderen Funktionsaufruf irgendwo in dieser Methode überschreiben. Wenn Sie Optimierungen aktivieren, sehen Sie, dass diese Anweisungen entfernt werden (da wir die gespeicherten Werte nie wirklich benötigen).

0

Es ist die Funktion Prolog und Epilog.

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

+1

Nein, OP fragt nach mittleren Anweisungen, nicht nach Prolog und Epilog. Aus der Frage weiß OP das genau. – Kegluneq

+0

Eigentlich habe ich geahnt, was sie machen, aber ich kannte den technischen Namen nicht. Also +1 von mir. –