簡體   English   中英

ARM程序集。 使用負偏移量存儲和加載堆棧中的數據

[英]ARM assembly. Storing and loading data from stack with negative offset

我們可以使用負地址偏移量來存儲和加載堆棧中的數據,如下面的代碼片段所示嗎? 從堆棧邊界外部( [sp, #-16][sp, #-20] )的內存地址寫入和讀取數據是否安全? 謝謝!

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 }

這是ABI的問題,而不是架構或語言,所以最終它取決於運行環境和有效的ABI。

雖然您可以訪問SP以下的地址,但是基本寄存器r13和負偏移的加載或存儲是完全有效的指令,只有ABI指示您的數據是否安全,以及是否這樣的訪問保證不會首先出現段錯誤。 當前使用的大多數系統可能正在使用ARM EABI的一些變體,其程序調用標准稱,作為“通用堆棧約束”的一部分:

進程只能訪問(用於讀取或寫入)由[SP,stack-base-1]分隔的整個堆棧的閉合間隔(其中SP是寄存器r13的值)。

即雖然沒有什么能夠真正阻止你違反這一限制,但試試吧,所有的賭注都會被取消。

既然你提到了Android,它肯定是EABI(特別是GNU變體),那么最明顯的問題就是Linux內核提供信號的方式。 如果您的進程恰好在str r3, [sp, #-20]之后立即發出信號,則信號處理程序可以使用進程堆棧運行,因此當(if)正常執行恢復時,SP本身將返回相同的值之前,誰知道ldr r4, [sp, #-20]實際上會加載什么。

請注意, 某些環境可能會對堆棧指針下方的內容提供某些額外的保證,如果您處於裸機場景或完全控制,那么您可以做任何您喜歡的事情,但通常情況下,除非您不知道然后假設答案是“不”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM