ARM AArch64 стековое управление

Нет ли возможности иметь 64-битный стек для ARMv8? Я понимаю, что на AArch64 нет инструкций push и pop, поэтому управление стеками оставлено на AArch32 для передачи параметров и тому подобное? Как мы можем передать 48-битные адреса? Я в целом запутался, как вызовы функций будут работать при работе в AArch64.

1 ответ

Решение

Как и в 32-битном *, SP является допустимым базовым регистром для любой инструкции загрузки / сохранения, поэтому механика не так уж и отличается. Отличие состоит в том, что SP больше не является регистром общего назначения, с которым вы можете делать все, что захотите, у вас больше нет операций с переменной load / store-множеством и нет псевдонимов, удобных для программистов. Таким образом, типичный "толчок" будет:

stp xn, xm, [sp, #-16]!

Обратите внимание, что вы должны обычно использовать stp / ldp в пользу str / ldr чтобы сохранить выравнивание при работе в стеке (особенно если у вас включена проверка аппаратного выравнивания) - если у вас есть только один регистр, который вам нужен, нажмите / нажмите xzr как другой, чтобы заполнить пробел.


* Помните, что, например, "push" в наборе команд ARM - это просто псевдоним ассемблера для stmdb r13!, {rn, ..., rm} или же str rn, [sp, #-4]! в случае необходимости, и такие псевдонимы были введены только с унифицированным языком ассемблера как часть Thumb-2. Конкретные инструкции push/pop появились в оригинальном 16-битном Thumb, так как SP не может быть закодирован в обычных операциях загрузки / сохранения, которые работают только на низких регистрах.

Другие вопросы по тегам