2016-09-30 2 views
0

Можем ли мы хранить и загружать данные из стека с отрицательным смещением адреса, как в следующем фрагменте кода? Безопасно ли записывать и считывать данные из адреса памяти, который фактически находится снаружи ([sp, #-16] или [sp, #-20]) границ стека? Спасибо!ARM сборка. Хранение и загрузка данных из стека с отрицательным смещением

stmdb sp, { r4 - r6 } 

mov r4, #255 
str r4, [sp, #-16] 

mov r3, #127 
str r3, [sp, #-20] 

ldr r4, [sp, #-20] 

sub sp, #12 
ldmia sp, { r4 - r6 } 
+1

В каком смысле «может»? Очевидно, что это строго _possible_, поскольку они являются допустимыми кодировками инструкций и будут получать доступ к указанным адресам, однако независимо от того, является ли это безопасным и надежным (то есть, могут ли они быть повреждены или нет) зависит от ОС/среды и любого ABI, действующего (и, возможно, даже CPU, если мы включим архитектуру M-профиля и ее эффективную диктовку конкретного ABI). – Notlikethat

+0

В настоящее время я пишу код для Android (A - profile) –

ответ

3

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

 Смежные вопросы

  • Нет связанных вопросов^_^