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

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

Ответ 1

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

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 не может быть закодирован в обычных операциях загрузки/хранения там, которые работают только с низкими регистрами.