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)
- 参数传递:r0-r3(4 个以内),超出走栈
- 返回值:r0(64 位返回用 r0/r1)
- 栈:8 字节对齐
- 调用者保存:r0-r3、r12、lr、cpsr
- 被调用者保存:r4-r11
三、启动代码示例(启动到 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"
);