ARM64 / Android: компилятор использует SP вместо X29 в качестве указателя на базовый кадр - PullRequest
2 голосов
/ 17 мая 2019

Я должен выдвинуть аргументы в стеке для передачи параметров в функции.Однако ля ля компилятора Android NDK (64 бита) всегда используется регистр sp в качестве базового адреса для доступа к переменным, тогда как он должен использовать x29 (указатель базового кадра).

У меня есть ldr w11, [sp, #0x30], я хочу ldr w11, [x29, #0x30].

Это беспокоит меня, потому что, если я вставлю asm в мой код c sub sp, sp, x9, чтобы выдвинуть аргумент, я нарушу всессылка, в которой использовался более старый sp.

Знаете ли вы, почему он не использует x29, и если я могу заставить его сделать это?

До сих пор моя идеядолжен был написать аргументы под указателем sp, не перемещая его, и когда это будет сделано, переместите sp непосредственно перед вызовом функции.И сразу после восстановления sp до его более старого значения.

Я не уверен, что запись данных ниже sp - хорошая идея, что вы думаете по этому поводу?

Дополнительная информация: Заметное осложнение: доступ к памяти ниже архитектурного sp (но в области стека) невозможен.Примечательно, что эта область используется обработчиками сигналов, которые выполняются асинхронно (например, прерывания).Если мы просто скопируем sp в какой-либо другой регистр и начнем использовать его как (нисходящий) указатель стека, наша специальная область стека будет в конечном итоге повреждена.https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/using-the-stack-in-aarch64-implementing-push-and-pop

...