Я немного разбираюсь в том, как язык Objective-C отображается в Assembl. Я начал с учебника, найденного по адресу iOS Assembly Tutorial.Разъяснения на языке сборки iOS
Анализ фрагмента кода приведен ниже.
void fooFunction() {
int add = addFunction(12, 34);
printf("add = %i", add);
}
Он переводится в
_fooFunction:
@ 1:
push {r7, lr}
@ 2:
movs r0, #12
movs r1, #34
@ 3:
mov r7, sp
@ 4:
bl _addFunction
@ 5:
mov r1, r0
@ 6:
movw r0, :lower16:(L_.str-(LPC1_0+4))
movt r0, :upper16:(L_.str-(LPC1_0+4))
LPC1_0:
add r0, pc
@ 7:
blx _printf
@ 8:
pop {r7, pc}
О коде сборки, я не могу понять следующие две точки
-> Комментарий @ 1
Автор говорит, что push
декрементирует стек на 8 байт с r7
и lr
- 4 байта каждый. ОК. Но он также говорит, что два значения сохраняются с одной инструкцией. Что это значит?
-> Комментарий @ 6
movw r0, :lower16:(L_.str-(LPC1_0+4))
movt r0, :upper16:(L_.str-(LPC1_0+4))
Автор говорит, что r0
проведет адрес "add = %i"
(который может быть найти в сегменте данных), но я действительно не понимаю, как распределение памяти выглядит как. Почему он представляет разницу L_.str-(LPC1_0+4)
с пунктирной черной линией, а не с красной (рисуется мной).
Любые уточнения будут оценены.
Редактировать
Я отсутствует понятие толкая r7
на стек. Что значит подталкивать эту ценность и то, что она содержит?
Hi Jester. Сначала вы получите быстрый ответ. О 1 вопросе. 'push' означает, что значения, содержащиеся в' r7' и 'lr', помещаются в стек. А как насчет 'поп'? Что значит вернуться к 'r7' и' pc'? О втором, можете ли вы расширить его? Что это означает *, если Rp является pc *? Благодарю. –
'pop' - это противоположность' push', конечно, верхние два значения будут удалены из стека и помещены в 'r7' и' lr'. Не знаете, какие уточнения вам нужны? Что касается второго, фактическая [справочная страница] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/CIHEDHIF.html) рассказывает о инструкции в терминах 'ADD Rd, Rp, # expr', где' Rp' может быть 'sp' или' pc'. Я просто привел для вас соответствующий «pc» случай. – Jester
Шут, извините за задержку. Я добавил редактирование о необходимых уточнениях. Но, возможно, я просто пропустил концепцию нажатия значения в стек. –