2016-05-23 9 views
3

Узел для метода -(BOOL) f { return true; } (на мой компьютер) является:Понимание разборки для - (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 

(для создания этого я поставил точку останова на утверждение возвращения и отладки -> Debug Workflow -> Всегда показывать разборку).

Я был удивлен, что это восемь инструкций.

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

^Это, как представляется, стандартный шаблон для управления стеком и возврата.

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

^это загружает hex 00 00 00 01 в EAX, который является регистром, используемым для возвращаемого значения.

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

^но что они делают? Не достаточны ли эти 6 строк?

EDIT: Я нашел http://www.idryman.org/blog/2014/12/02/writing-64-bit-assembly-on-mac-os-x/ полезной.

ответ

7

В ObjC есть два неявные параметры для каждого метода, self и _cmd. Они передаются в% rdi и% rsi (это правила 64-разрядного ABI). Они сохраняются в стеке, если мы перезаписываем эти регистры с помощью другого вызова функции где-то в этом методе. Если вы включите оптимизацию, вы увидите, что эти инструкции удалены (поскольку нам действительно не нужны сохраненные значения).

0

Это функция пролога и эпилога.

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

+1

Нет, ОП спрашивает о средних инструкциях, а не о прологе и эпилоге. Из этого вопроса OP ясно знает об этом. – Kegluneq

+0

На самом деле я догадывался, что они делают, но я не знал технического названия. Так что +1 от меня. –

 Смежные вопросы

  • Нет связанных вопросов^_^