Какие регистры сохранить в ARM C соглашение о вызовах?

Это было некоторое время, так как я продержался кодированный ассемблер руки, и я немного ржав в деталях. Если я вызываю функцию C от руки, я только должен волноваться о сохранении r0-r3 и lr, правильно?

Если функция C использует какие-либо другие регистры, действительно ли это ответственно за сохранение регистров на стеке и восстановлении их? Другими словами, компилятор сгенерировал бы код, чтобы сделать это для функций C.

Например, если я использую r10 в ассемблерной функции, я не должен продвигать ее значение на стеке, или к памяти, и выталкивать/восстанавливать его после вызова C, не так ли?

Это для arm-eabi-gcc 4.3.0.

50
задан Peter Cordes 28 July 2019 в 14:14
поделиться

1 ответ

Это зависит от ABI для платформы, для которой Вы компилируете. На Linux существует два ARM ABIs; старый и новый. AFAIK, новый (EABI) является на самом деле AAPCS ARM. Полные определения EABI в настоящее время живут здесь на infocenter ARM.

От AAPCS, В§5.1.1 :

  • r0-r3 регистры царапины и аргумент; r0-r1 является также регистрами результата
  • , r4-r8 является регистрами сохранения вызываемый
  • , r9 мог бы быть регистром сохранения вызываемый или не (на некоторых вариантах AAPCS, это - специальный регистр)
  • , r10-r11 является регистрами сохранения вызываемый
  • , r12-r15 является специальными регистрами

, А сохраняют вызываемый регистр, должен быть сохранен вызываемым (против регистра сохранения вызывающая сторона, где вызывающая сторона сохраняет регистр); таким образом , если это - ABI, Вы используете, Вы не должны сохранять r10 прежде, чем вызвать другую функцию (другая функция ответственна за сохранение его).

Редактирование: то, Какой компилятор Вы используете, не имеет никакого значения; gcc в особенности может быть настроен для нескольких различных ABIs, и он может даже быть изменен на командной строке. Рассмотрение кода пролога/эпилога, который это генерирует, не настолько полезно, так как это адаптируется для каждой функции и , компилятор может использовать другие способы сохранить регистр (например, сохраняя его посреди функции).

69
ответ дан Peter Cordes 7 November 2019 в 10:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: