Более подробно, чем вы, вероятно, хотели бы знать.
Стеки могут быть как «нисходящими» (растущими), так и «восходящими» (растущими). Стеки также могут быть либо «полными» (SP указывает на «полную», то есть используемую запись в стеке), либо «пустыми» (SP указывает на «пустую», т.е. неиспользуемую запись в стеке.)
Большинство стеков "полностью нисходящие". Я думаю, что некоторые "пустые по возрастанию". Два других (FA, ED) не видят особого смысла, хотя бы потому, что неясно , на какой байт они должны указывать, если вы можете выдвигать / извлекать значения разных размеров.
РЕДАКТИРОВАТЬ: Приведенное выше наименование может быть немного специфичным для ARM, хотя бы в значительной степени потому, что большинство платформ не позволяют вам выбрать направление.
Каноническими мнемониками для соответствующих инструкций ARM на самом деле являются LDMIA (загрузка с несколькими кратными приращениями после) и STMDB (сохранение нескольких приращений перед) для стека «с полным нисходящим потоком», но ARM решила добавить псевдонимы LDMFD / STMFD, поэтому программистам нужно помните тип используемого стека. Увеличение / уменьшение до / после являются каноническими именами, потому что архитектура ARM (в основном) ортогональна; использование стека по соглашению (то есть EABI) вместо того, что предписано самой архитектурой. Исключениями являются r14 (LR), r15 (ПК) и набор регистров, которые затеняются между различными режимами супервизора.
Имена «приращение после» может быть более разумной, если вы используете ldm / stm для реализации чего-то вроде memcpy ().
(я игнорирую Thumb, в котором есть явные инструкции push / pop).