2015-02-20 2 views
0

Я немного разбираюсь в том, как язык 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) с пунктирной черной линией, а не с красной (рисуется мной).

enter image description here

Любые уточнения будут оценены.

Редактировать

Я отсутствует понятие толкая r7 на стек. Что значит подталкивать эту ценность и то, что она содержит?

ответ

1

Но он также говорит, что эти два значения сохраняются с инструкцией . Что это значит?

То, что одна команда push поместит оба значения в стек.

Почему он представляет разницу L_.str- (LPC1_0 + 4)

Поскольку add r0, pc неявно добавляет 4 байта больше. Цитирую instruction set reference:

Add an immediate constant to the value from sp or pc, and place the result into a low register. 
Syntax: ADD Rd, Rp, #expr 
where: 
Rd is the destination register. Rd mustbe in the range r0-r7. 
Rp is either sp or pc. 
expr is an expression that evaluates (at assembly time) to a multiple of 4 in the range 0-1020. 

If Rp is the pc, the value used is: (the address of the current instruction + 4) AND &FFFFFFFC. 
+0

Hi Jester. Сначала вы получите быстрый ответ. О 1 вопросе. 'push' означает, что значения, содержащиеся в' r7' и 'lr', помещаются в стек. А как насчет 'поп'? Что значит вернуться к 'r7' и' pc'? О втором, можете ли вы расширить его? Что это означает *, если Rp является pc *? Благодарю. –

+0

'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

+0

Шут, извините за задержку. Я добавил редактирование о необходимых уточнениях. Но, возможно, я просто пропустил концепцию нажатия значения в стек. –

0

Для комментариев 1: Два значения помещаются в стек являются магазин значения в r7 и lr.

Два 4 байтовых значения равны 8 байтам.

Для комментариев 6: Ярлык LPC1_0 следуют инструкции

add r0, pc

, который добавляет еще 4 байта разницы между двумя адресами.

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

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