ATPCS規定arm的資料棧的操作是節對齊,為啥不是節呢?節是正好32位,應該可以滿足需求啊

2021-04-30 02:29:45 字數 979 閱讀 5359

1樓:花巷草弄11號

在armv5te中,批量傳送指令ldrd/strd要求資料棧是8位元組對齊的,以提高數

據的傳送速度.用ads編譯器產生的目標檔案中,外部介面的資料棧都是8位元組對齊的,

並且編譯器將告訴聯結器: 本目標檔案中的資料棧是8位元組對齊的. 而對於彙編程式

來說,如果目標檔案中包含了外部呼叫,則必須滿足以下條件: 外部介面的資料棧一定

是8位對齊的,也就是要保證在進入該彙編**後,直到該彙編程式呼叫外部**之

間,資料棧的棧指標變化為偶數個字; 在彙編程式中使用preserve8偽操作告訴連

接器,本彙編程式是8位元組對齊的.

我查到的,看的不是很懂,如果你查到了麻煩簡訊我下,謝謝了。

arm採用32位也就是4位元組定長指令的問題

2樓:

arm 立即數有3種形式:

1、8 位,這種立即數就包含在指令中,裝入暫存器的最低 8 位,並且可以選擇 0 擴充套件或 符號位擴充套件到整個 32 位。

2、8 位移位+重複,到 32 位,這種立即數也包含在指令中,8 位立即數可以左移任意位,並且重複累加,指令形式比較複雜,可以裝入類似這些資料:0x55000000(8位資料 0x55 左移 24 位),0xe000e000(8 位資料 0xe0 左移 8 位,並且重複到高 16 位)。

3、對於不符合以上兩種格式的立即數,比如 0x12345678 這種,立即數不包含在指令中,而放在**段(通常是函式的結束之後),裝入的指令為 ldr rd, [pc, #offset],即立即數是位於以 pc為基址加上一個偏移量的地址處。

通常理解的立即數,應該是把資料裝入暫存器的那條cpu指令,使用了「立即定址」的定址方式,而嚴格來說,只有前兩種形式的立即數是立即定址,而第3種不算。

由於當前 pc 到函式末尾的長度,人工基本沒法算,所以這個工作(在合適的位置放入立即數,以及計算 offset)一般都由彙編器或編譯器自動安排。

實現順序棧的入棧和出棧

include stdio.h include stdlib.h define stack init size 100 define stackincrement 10typedef struct stackstack void init stack s stack pushstack stack ...

棧的進棧順序是abcde,則棧不可能輸出的序列是ae

一個棧的進棧順序是abcde,則棧不可能輸出的序列是dceab.有關棧的簡介 棧可以說是一種特殊的內線性表,特容 殊之處就在於限定僅在表尾進行插入或刪除的操作。表尾被定義為了棧頂,表頭是棧底。具體的說,如果一個棧 stack 按照一個順序進棧,第一個進棧元素為棧底,最後一個為棧頂。出棧時則要按照相反...

支援子程式呼叫的資料結構是什麼棧?樹?佇列?二叉樹

額 理論上來說所有資料結構都支援子程式的呼叫。這個題的意思應該是子程式呼叫的時候能看成什麼樣的資料結構。嚴格來說是棧 因為遞迴呼叫子程式的時候就是先入後出的而且是線性的。雖然子程式也可以這樣呼叫 f i f i 1 f i 1 看起來像是樹,但是實際上還是深度優先遍歷一棵樹,本質上是個棧。所以說這個...