Это вопрос о ABI, а не архитектуры или языка, так что в итоге зависит от условий эксплуатации и ABI в силу.
Пока вы можете адреса доступа ниже SP, в том смысле, что нагрузка или магазин с базовым регистром r13 и отрицательным смещением является вполне допустима инструкцией, это только ABI, который диктует, будут ли ваши данные в безопасности там или нет, и гарантируется ли такой доступ не к segfault в первую очередь. Большинство систем используемых в настоящее время, вероятно, будет использовать некоторые вариант ARM EABI, чьи procedure call standard говорит, как часть «универсальных ограничений стека»:
Процесс может только доступ (для чтения или записи) в замкнутом интервале весь стек, ограниченный [SP, stack-base - 1] (где SP - значение регистра r13).
В то же время ничто не помешает вам нарушить это ограничение, попробуйте его, и все ставки будут отключены.
Поскольку вы упоминаете Android, который определенно является EABI (в частности, вариантом GNU), наиболее очевидной проблемой является то, как ядро Linux поставляет сигналы. Если ваш процесс принимает сигнал сразу после str r3, [sp, #-20]
, обработчик сигнала может запускаться с использованием стека процессов, поэтому, когда (если) нормальное выполнение возобновляется, в то время как сам SP вернется к тому же значению, которое было раньше, кто знает, что ldr r4, [sp, #-20]
будет фактически груз.
Обратите внимание, что some environments может предоставить определенные дополнительные гарантии относительно того, что происходит ниже указателя стека, и если вы находитесь в сценарии с открытым планом или иным образом полностью контролируете, вы можете делать все, что захотите, но обычно, если только вы знайте иначе, тогда принимайте ответ как «нет».
В каком смысле «может»? Очевидно, что это строго _possible_, поскольку они являются допустимыми кодировками инструкций и будут получать доступ к указанным адресам, однако независимо от того, является ли это безопасным и надежным (то есть, могут ли они быть повреждены или нет) зависит от ОС/среды и любого ABI, действующего (и, возможно, даже CPU, если мы включим архитектуру M-профиля и ее эффективную диктовку конкретного ABI). – Notlikethat
В настоящее время я пишу код для Android (A - profile) –