- 一、立即數
- 在 ARM 架構中,立即數是指在指令中直接編碼的常量值,而不是通過寄存器或內存引用的值
- 立即數的特點
- 編碼限制:ARM指令是固定長度的(32位),因此立即數不能占用太多位數。典型的算術和邏輯指令通常只能編碼8-12位的立即數
- 移位特性:ARM使用一種聰明的編碼方式,允許8位立即數加上4位的移位值(0-30,步長為2),這樣可以表示更大范圍的數值
- 有效性檢查:不是所有32位值都能作為立即數,只有那些可以通過8位值循環右移偶數位得到的數值才是有效的立即數
- 判斷條件
- 這個數的范圍在0~0xFF之間;
- 這個數展開成二進制,這個數的最高位1至最低位1之間的二進制序列的位數不超過8位;
- 這個數展開的二進制序列最低位1右邊必須為偶數個連續的0
- 二、指令
- b指令:類似goto語句,實現無條件跳轉,需要一個label來指定跳轉的方位,實際上就是把待跳轉的那行地址轉入pc寄存器,調用完畢后不會回到調用處的下一行指令;
- bl指令:跳轉時會在lr寄存器中保存返回的地址;
- bx:跳轉到寄存器的地址,不保存返回地址
- 三、棧
- 滿減棧
- 特點:
- 棧指針指向最后一個壓入的數據 (棧已滿)
- 棧向低地址方向增長 (遞減)
- 操作:
- 先減SP,再存儲數據
- 先讀取數據,再加SP
- ARM默認:ARM架構通常使用滿減棧
- 特點:
- 滿增棧
- 特點:
- 棧指針指向最后一個壓入的數據
- 棧向高地址方向增長 (遞增)
- 操作:
- 先加SP,再存儲數據
- 先讀取數據,再減SP
- 特點:
- 空減棧
- 特點:
- 棧指針指向下一個可用位置 (棧為空)
- 棧向低地址方向增長
- 操作:
- 先存儲數據,再減SP
- 先加SP,再讀取數據
- 特點:
- 空增棧
- 特點:
- 棧指針指向下一個可用位置
- 棧向高地址方向增長
- 操作:
- 先存儲數據,再加SP
- 先減SP,再讀取數據
- 特點:
- 滿/空:指SP指向的是有效數據(滿)還是下一個空位(空)
- 增/減:指棧增長方向是地址增加還是減少
- 滿減棧
- 四、匯編與C函數的調用
- arm匯編調用C函數:
- 1.在匯編代碼里用import聲明C函數;
- 2.要注意保護現場;
- 3.傳參時使用寄存器R0-R3,超過四個參數時使用棧來傳參;
- 4.c函數的返回值用R0來返回
- C函數調用arm匯編函數:
- 1.在匯編代碼里用export導出該函數;
- 2.在C函數里用extern來聲明arm函數;
- 3.在C函數里保護現場和恢復現場;
- 4.傳參使用R0-R3寄存器和返回值用R0返回
- arm匯編調用C函數: