9、ARM 彙編與 C 的混合編程

9.1 ARM 彙編與 C 的混合編程

9.1.1 內嵌彙編 __asm

__asm("指令")
例如關閉/打開總中斷開關 CPSR編程

__asm //使用 C 中變量名代替寄存器
{ MOV var,x ADD y,var,x/y }

內聯彙編語言中的寄存器名被編譯器視爲 C 或 C++語言中的變量,因此內聯彙編中出現的寄存器名不必定和同名的物理寄存器相對應。
這些寄存器名在使用前必須聲明, 不然編譯器將提示警告信息app

 

9.1.2 彙編訪問 C 中的全局變量

【1】用 IMPORT 聲明全局變量編碼

【2】利用 LDR 獲得其地址spa

AREA globals, CODE, READONLY EXPORT asmadd IMPORT gvar; 聲明外部變量 gvar asmadd LDR R1, =gvar; 裝載變量地址 LDR R0, [R1] ; 讀出數據 ADD R0, R0, #1; 加 1 操做 STR R0, [R1]; 保存變量值 MOV PC, LR END

 

9.1.3 ATPS(ARM-Thumb Produce Call Standard)

  • ATPCS(ARM-Thumb Produce Call Standard): ARM 程序和 Thumb 程序中子程序調用的基本規則
  • 子程序調用過程當中寄存器的使用規則
    • 利用 R0-R3 來傳遞參數, R4-R11 用來保存局部變量。
  • 數據棧的使用規則
    • 棧採用的是滿遞減(FD),當參數超過 4 個時, 超過的部分使用棧來傳遞參數, 返回值存於 R0

9.2 ARM 彙編 THUMB2 指令集

9.2.1 ARM THUMB THUMB2

  • ARM 指令: 32 位, 支持全部功能, 全部指令均可以條件執行
  • THUMB: 16 位, 不能訪問協處理器, 特權指令和特殊功能指令, 只有 B 指令才能條件執行
  • THUMB2: Thumb-2 是 16 位 Thumb 指令集的一個超集, 指令是 32 位或者是 16 位。與 ARM 指令 32 位編碼格式是不一樣的。由彙編器來決定使用 16 位指令仍是 32 位指令。

9.2.2 ARMV8(64bit 體系結構)

  • ARMv8 提供 AArch32state 和 AArch64 state 兩種 Execution State, 不在區分 ARM 狀態與 THUMB 狀態。
  • 在 AArch32 狀態下, 提供兩個指令集 A32(32bit)、 T32(16/32bit), 兩種指令是經過 BX 切換的。
  • 在 AArch64 狀態下, 只支持 A64 指令集, 固定長度爲 32bit.
  • ARMV8 提供了不一樣的運行級別: Exception Level 與 Security (EL0(app), EL1, EL2,EL3) 類比於 X86 的 Ring0-ring3(app)

9.2.3 CORTEX-M3

  • Cortex-M3 只支持 Thumb-2 指令, 在 STM32 單片機課程中會詳細講解 Thumb-2 指令集。
相關文章
相關標籤/搜索