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