Соглашения о вызовах функции ARMv7
В целом приложения, созданные для среды ARMv7, способны к выполнению в среде ARMv6 и наоборот. Это вызвано тем, что соглашения о вызовах для среды ARMv7 почти идентичны найденным в среде ARMv6. Поэтому эта статья описывает только места, где среда ARMv7 отклоняет или расширяет среду ARMv6.
Для получения дальнейшей информации о соглашениях о вызовах для среды ARMv6, см. Соглашения о вызовах Функции ARMv6.
Вызовы функции
Этот раздел детализирует процесс вызова подпрограммы и передающих параметров к ней, и как возвращаемые значения подпрограмм к их вызывающим сторонам. Следующие разделы выделяют незначительные различия между ARMv6 и средами ARMv7.
Прожурналы и эпилоги
Версия Ползунка, доступного в ARMv7, способна к сохранению и восстановлению содержания регистров VFP. Кроме того, блок ARMv7 использует объединенный набор мнемоники; поэтому, тот же ассемблерный код может использоваться для генерации или ARM или машинного кода Ползунка.
Перечисление 1 показывает пример Пролога, сохраняющего много ключевых регистров, включая несколько регистров VFP. Это также выделяет 36 байтов для локального хранения.
Пролог перечисления 1 В качестве примера к ARM или Ползунку 2 (ARMv7)
push {r4-r7, lr} // save LR, R7, R4-R6 |
add r7, sp, #12 // adjust R7 to point to saved R7 |
push {r8, r10, r11} // save remaining GPRs (R8, R10, R11) |
vstmdb sp!, {d8-d15} // save VFP/Advanced SIMD registers D8 |
// (aka S16-S31, Q4-Q7) |
sub sp, sp, #36 // allocate space for local storage |
Перечисление 2 показывает эпилог в качестве примера, восстанавливающий регистры, сохраненные предыдущим Прологом.
Эпилог перечисления 2 В качестве примера для ARM или Ползунка 2 (ARMv7)
add sp, sp, #36 // deallocate space for local storage |
vldmia sp!, {d8-d15} // restore VFP/Advanced SIMD registers |
pop {r8, r10, r11} // restore R8-R11 |
pop {r4-r7, pc} // restore R4-R6, saved R7, return to saved LR |
Сохранение регистра
Сохранение регистра на архитектуре ARMv7 совпадает с этим для архитектуры ARMv6, за исключением изменений и дополнений, отмеченных в Таблице 1.
Ввести | Имя | Сохраненный | Примечания |
---|---|---|---|
Регистр VFP | D0-D7 | Нет | Также известный как Q0-Q3 на ARMv7. Эти регистры доступны от режима Thumb на ARMv7. |
D8-D15 | Да | Также известный как Q4-Q7 на ARMv7. Эти регистры доступны от режима Thumb на ARMv7. | |
D16-D31 | Нет | Только доступный в ARMv7. Также известный как Q8-Q15. |
Для получения информации обо всех других регистрах посмотрите Таблицу 2.