Я должен выдвинуть аргументы в стеке для передачи параметров в функции.Однако ля ля компилятора 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