iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
Arm Platforms

30天從0開始探索嵌入式世界系列 第 13

Day13.進入 ARM 世界: ARM Instruction Sets

學組語的目的,不見得是為了改善效能,而是:

  • 判斷 optimizing compiler 產生的機械碼是否正確
  • gcc 和 clang/llvm 引入大量的最佳化技術,已很難光看原始程式碼,去推知最終生成的機械碼
    [ARM 指令 Jserv 筆記中有提起]

在開始深入探討前,先來看看ARM 的 Memory system

ARM Memory Systeam

  • memory 是一個 linear array of bytes addressed,範圍從 0 ~ 2^32^ -1
  • 有 word, half-word, byte 三種形式
  • 採用Little Endian

Assebbler Language:Basic Syntax

label
    opcode operand1, operand2, ...; Comments
  • lable 可有可無,通常用來當作地址的標記
  • opcode 指令的操作碼
  • operand 第一個operand是指令結果的destination,不同指令則有所不同個operand,例如立即數表示為 #number
MOV R0, #0x12 ; Set R0 = 0x12 (hexadecimal)
MOV R1, #'A' ; Set R1 = ASCII character A
  • Comments 為註解,使用";" 開頭
  • 使用 EQU 來定義常數
NVIC_IRQ_SETEN0 EQU 0xE000E100 
NVIC_IRQ0_ENABLE EQU 0x1
  • Pseudo-instruction 是一個簡單版的組語指令,沒有直接等價於機器語言,在組譯過程中會被翻譯成一或多個機器指令
LDR R0,=NVIC_IRQ_SETEN0; ; LDR here is a pseudo-instruction that
                         ; convert to a PC relative load by
                         ; assembler.
MOV R1,#NVIC_IRQ0_ENABLE ; Move immediate data to register
STR R1,[R0]              ; Enable IRQ 0 by writing R1 to address
                         ; in R0

ARM Instruction Sets

可分成三大項:

  • Data processing
    • move
    • arithmetic
    • logical
    • comparison
    • multiply
  • Data movement (memory access)
  • Flow control

Data processing

資料處理指令包含對資料做 移動、算數、邏輯、比較、乘法 的指令

Arithmetic operations

  • ADD 指令將 Operand2 或 imm12 的值與 Rn 中的值相加。
  • ADC 指令將 Rn 和 Operand2 中的值與進位標誌相加。
  • SUB 指令從 Rn 中的值中減去 Operand2 或 imm12 的值。
  • SBC 指令從 Rn 中的值中減去 Operand2 的值。 如果進位標誌清零,則結果減一。
  • RSB 指令從 Operand2 的值中減去 Rn 中的值。
  • Example:
ADD    r0, r1, r2    ; r0 := r1 + r2
ADC    r0, r1, r2    ; r0 := r1 + r2 + C
SUB    r0, r1, r2    ; r0 := r1 - r2
SBC    r0, r1, r2    ; r0 := r1 - r2 + C - 1
RSB    r0, r1, r2    ; r0 := r2 - r1
RSC    r0, r1, r2    ; r0 := r2 - r1 + C - 1

Bit-wise logical operations

  • Bitwise intersection (and)
    • AND r0, r1, r2 ; r0 := r1 and r2
  • Bitwise union (or)
    • ORR r0, r1, r2 ; r0 := r1 or r2
  • Bitwise exclusive (xor)
    • EOR r0, r1, r2 ; r0 := r1 xor r2
  • Unary bitwise inverse
    • BIC r0, r1, r2 ; r0 := r1 and not r2

Register movement operations:

  • 在 register 和 register 之間移動數據
  • 在 register 和 memory 之間移動數據
  • 在 special register 和 register 之間移動數據
  • 將立即值移入 register

在ARM 的指令中加了許多條件執行的後綴

Comparison operations:

  • 大多數的ARM 的Banch指令都是根據APSR/CPSR 決定是否轉移

data processing 指令可以更新 PSR

  • Example:
CMP R0, R1 ; Calculate R0 – R1 and update flag
CMP R0, #0x12 ; Calculate R0 – 0x12 and update flag
CMN R0, R1 ; Calculate R0 – (-R1) and update flag
CMN R0, #0x12 ; Calculate R0 – (-0x12) and update flag
TST R0, R1 ; Calculate R0 AND R1 and update flag
TST R0, #0x12 ; Calculate R0 AND 0x12 and update flag

Immediate operands:

  • Example:
ADD    r3, r3, #1    ; r3 := r3 + 1
AND    r8, r7, #&ff  ; r8 := r7[7:0]
  • 我們知道指令都是 32 bit 當我們想載入32-bit 該怎麼做?
load_32bit:
ldr r0, [pc #0] ;請注意: pc 位於目前位址向前 8 bytes 的地方
bx lr
.word 0xDEADBEEF
  • 在 ARMv7 後,引入兩個步驟的指令來載入數值: movw, movt
movw r0, #0xbeef  ; r0 = 0x0000beef
movt r0, #0xdead ; r0 = deadbeef
  • GNU as 給予便利的寫法
.equ label, 0xDEADBEEF
movw r0, #:lower16:label
movt r0, #:upper16:label

Shifted register operands:

  • Logical Shitf Right/Left 一律都是把多出來的位數填0
  • Arithmetic Shift Right 需考慮到singed的屬性,假設最高是1,則填補1,反之最高是0,則填補0。
  • ROR 按值循環的Register內容的值
  • RRX 被移位指令拋出的bit被放入 C Flag中,C Flag 的值會被移入 bit[31]中。

先介紹到這 明天繼續介紹剩下的指令集

參考資料

ARM指令

ARM Instruction Set

Definitive Guide To the ARM Cortex-M3


上一篇
Day12.進入 ARM 世界: ARM Cortex-M Exception Behavior
下一篇
Day14.進入 ARM 世界: ARM Instruction Sets
系列文
30天從0開始探索嵌入式世界15

尚未有邦友留言

立即登入留言