ARM 汇编基础

一、常用指令速查

; 数据传送
MOV   r0, #1          ; r0 = 1
MOV   r0, r1          ; r0 = r1
LDR   r0, [r1]        ; r0 = *r1    (32-bit 加载)
LDRB  r0, [r1]        ; r0 = *(u8*)r1
LDRH  r0, [r1]        ; r0 = *(u16*)r1
STR   r0, [r1]        ; *r1 = r0
LDR   r0, [r1, #4]    ; r0 = *(r1+4)
LDR   r0, [r1, r2]    ; r0 = *(r1+r2)

; 算术
ADD   r0, r1, r2      ; r0 = r1 + r2
SUB   r0, r1, #1      ; r0 = r1 - 1
MUL   r0, r1, r2      ; r0 = r1 * r2
SDIV  r0, r1, r2      ; 有符号除法

; 逻辑
AND / ORR / EOR / BIC ; 与/或/异或/位清

; 比较 + 跳转
CMP   r0, r1
BEQ   label           ; 相等则跳
BNE   label           ; 不等则跳
BGT / BLT / BGE / BLE ; 大于/小于
B     label           ; 无条件跳转
BL    func            ; 带链接跳转(保存返回地址到 LR)
BX    lr              ; 返回(Thumb/ARM 切换)

; 栈操作
PUSH  {r4-r11, lr}
POP   {r4-r11, pc}    ; 用 PC 直接返回

; 内存屏障
DMB   ; Data Memory Barrier
DSB   ; Data Sync Barrier
ISB   ; Instruction Sync Barrier

二、ATPCS(ARM-Thumb Procedure Call Standard)

三、启动代码示例(启动到 C 入口)

.global _start
_start:
    /* 关看门狗 */
    ldr r0, =WDT_BASE
    mov r1, #0
    str r1, [r0]

    /* 初始化栈 */
    ldr sp, =0x80200000

    /* 初始化 BSS */
    ldr r0, =__bss_start
    ldr r1, =__bss_end
    mov r2, #0
1:  cmp r0, r1
    strne r2, [r0], #4
    bne 1b

    /* 跳到 C 入口 */
    bl main
1:  b 1b

四、GNU AS 常用伪指令

.equ  CONST, 100        ; 常量定义
.global symbol          ; 导出符号
.section .text          ; 代码段
.section .bss           ; BSS
.word  0x12345678       ; 32位数据
.byte  0xff             ; 8位数据
.quad  0x112233445566  ; 64位数据
.align 2                ; 4字节对齐
.arm                    ; ARM 模式
.thumb                  ; Thumb 模式

五、内联汇编(C 语言中嵌入)

unsigned int val;
asm volatile (
    "mrc p15, 0, %0, c1, c0, 0"
    : "=r"(val)
    :
    : "memory"
);