在 ASM 函式中,可以使用堆疊為變數創建本地作業區。
我想知道的是,您可以創建標簽來參考它們還是使用堆疊指標的顯式數字偏移量?
例如:一個人想要ldr r0, sp 4但使用一個符號名稱來代替?這樣做的正確方法是什么?我無法想象人們會記住所有內容的數字偏移量。
uj5u.com熱心網友回復:
我無法想象人們會記住所有內容的數字偏移量。
所有匯編程式都允許為全域變數使用標簽,部分原因是,全域變數通常用于匯編課程編程中,其中命名的區域變數將在高級語言中使用。
也因為全域變數是使用相對簡單的資料宣告來分配和初始化的,而對區域變數使用堆疊存盤需要動態分配、初始化和釋放,當然還有相對于堆疊指標的偏移量,而不是通過命名標簽的絕對尋址。雖然我們傾向于在一般編程中對全域變數不屑一顧,但許多玩具/賦值程式只有 amain和很少或沒有函式,因此全域存盤實際上是合理的。
許多區域變數和引數被映射到大多數現代機器上的暫存器。有必要識別用于變數、臨時和引數傳遞的暫存器,并且使用某種#define 或equate 通常會使這變得更難而不是更容易。許多程式員更喜歡在注釋中描述變數及其映射,而不是使用宏或等式。
記憶體是標量變數映射的最后手段,因為首選暫存器。這些天來,我們在組裝中只做最少的必要量(有時根本沒有)。如前所述,我們可以在撰寫玩具程式時用全域變數代替區域變數。在這些原因中,使用偏移量并沒有你想象的那么嚴重。
還有一個原因是,給定區域變數的映射會在其所在函式的行程中發生變化,因此必須針對這種情況進行調整(例如,有時由于呼叫約定的原因,引數移動到另一個暫存器;其他時候從記憶體到性能暫存器;如果我們不想要幀指標的開銷,那么推送將改變已經在堆疊上的東西的偏移量)。匯編語言是如此的低級,我們通常不想掩蓋細節。
uj5u.com熱心網友回復:
這實際上取決于匯編程式。對于 GNU 工具鏈(帶有 GAS 的 GCC),您可以使用.S檔案(而不是.s),gcc編譯器驅動程式將像 C 源檔案一樣對其進行預處理。所以你可以寫
#define VAR sp 4
然后使用
ldr r0, VAR
請注意,宏的范圍不正確(僅限于當前函式),因此這可能會令人困惑。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424415.html
