ARMv7 汇编指令学习实例(指令速查表)

一、指令格式说明

符号含义
{cond}条件后缀(EQ、NE、GT、LT 等),可选
{S}更新 CPSR 标志位(N、Z、C、V)
Rd目标寄存器
Rn第一个源寄存器
Rm第二个源寄存器
Rs移位值寄存器
operand2灵活的第二操作数(立即数、寄存器、移位寄存器)
label代码标签
imm立即数
reglist寄存器列表,如 {R0-R3, LR}

灵活的第二操作数(operand2)

格式说明示例
#imm立即数ADD R0, R1, #0x10
Rm寄存器ADD R0, R1, R2
Rm, LSL #n逻辑左移 n 位ADD R0, R1, R2, LSL #2
Rm, LSL Rs逻辑左移 Rs 位ADD R0, R1, R2, LSL R3
Rm, LSR #n逻辑右移 n 位ADD R0, R1, R2, LSR #4
Rm, ASR #n算术右移 n 位ADD R0, R1, R2, ASR #8
Rm, ROR #n循环右移 n 位ADD R0, R1, R2, ROR #16
Rm, RRX带进位的循环右移ADD R0, R1, R2, RRX

二、数据处理指令

2.1 数据传送

指令格式操作示例
MOVMOV{cond}{S} Rd, operand2Rd = operand2MOV R0, #0x12
MVNMVN{cond}{S} Rd, operand2Rd = ~operand2MVN R0, #0x0F

2.2 算术运算

指令格式操作示例
ADDADD{cond}{S} Rd, Rn, operand2Rd = Rn + operand2ADD R0, R1, #10
ADCADC{cond}{S} Rd, Rn, operand2Rd = Rn + operand2 + CADC R0, R1, R2
SUBSUB{cond}{S} Rd, Rn, operand2Rd = Rn - operand2SUB R0, R1, #5
SBCSBC{cond}{S} Rd, Rn, operand2Rd = Rn - operand2 - (1-C)SBC R0, R1, R2
RSBRSB{cond}{S} Rd, Rn, operand2Rd = operand2 - RnRSB R0, R1, #0

2.3 逻辑运算

指令格式操作示例
ANDAND{cond}{S} Rd, Rn, operand2Rd = Rn & operand2AND R0, R1, #0xFF
ORRORR{cond}{S} Rd, Rn, operand2Rd = Rn | operand2ORR R0, R1, #0x01
EOREOR{cond}{S} Rd, Rn, operand2Rd = Rn ^ operand2EOR R0, R1, R2
BICBIC{cond}{S} Rd, Rn, operand2Rd = Rn & ~operand2BIC R0, R1, #0x0F

2.4 比较测试

指令格式操作更新标志示例
CMPCMP{cond} Rn, operand2Rn - operand2N、Z、C、VCMP R0, #10
CMNCMN{cond} Rn, operand2Rn + operand2N、Z、C、VCMN R0, R1
TSTTST{cond} Rn, operand2Rn & operand2N、ZTST R0, #0x01
TEQTEQ{cond} Rn, operand2Rn ^ operand2N、ZTEQ R0, R1

2.5 乘法指令

指令格式操作示例
MULMUL{cond}{S} Rd, Rm, RsRd = Rm * Rs(低 32 位)MUL R0, R1, R2
MLAMLA{cond}{S} Rd, Rm, Rs, RnRd = Rm * Rs + RnMLA R0, R1, R2, R3
UMULLUMULL{cond}{S} RdLo, RdHi, Rm, Rs(RdHi,RdLo) = Rm * Rs(无符号)UMULL R0, R1, R2, R3
SMULLSMULL{cond}{S} RdLo, RdHi, Rm, Rs(RdHi,RdLo) = Rm * Rs(有符号)SMULL R0, R1, R2, R3
UMLALUMLAL{cond}{S} RdLo, RdHi, Rm, Rs(RdHi,RdLo) += Rm * RsUMLAL R0, R1, R2, R3
SMLALSMLAL{cond}{S} RdLo, RdHi, Rm, Rs(RdHi,RdLo) += Rm * Rs(有符号)SMLAL R0, R1, R2, R3

2.6 移位操作(作为 operand2)

操作语法效果
逻辑左移LSL #n左移 n 位,低位补 0
逻辑右移LSR #n右移 n 位,高位补 0
算术右移ASR #n右移 n 位,高位补符号位
循环右移ROR #n循环右移 n 位
带进位循环右移RRX通过 C 位循环右移 1 位

三、加载/存储指令

3.1 单寄存器传输

指令格式操作示例
LDRLDR{cond} Rd, [Rn {, #offset}]Rd = *(Rn + offset)LDR R0, [R1, #4]
LDRLDR{cond} Rd, [Rn, #offset]!Rn += offset; Rd = *RnLDR R0, [R1, #4]!
LDRLDR{cond} Rd, [Rn], #offsetRd = *Rn; Rn += offsetLDR R0, [R1], #4
STRSTR{cond} Rd, [Rn {, #offset}]*(Rn + offset) = RdSTR R0, [R1]
LDRBLDRB{cond} Rd, [Rn]Rd = *(unsigned char*)RnLDRB R0, [R1]
LDRSBLDRSB{cond} Rd, [Rn]Rd = *(signed char*)RnLDRSB R0, [R1]
LDRHLDRH{cond} Rd, [Rn]Rd = *(unsigned short*)RnLDRH R0, [R1]
LDRSHLDRSH{cond} Rd, [Rn]Rd = *(signed short*)RnLDRSH R0, [R1]
STRBSTRB{cond} Rd, [Rn]*(unsigned char*)Rn = RdSTRB R0, [R1]
STRHSTRH{cond} Rd, [Rn]*(unsigned short*)Rn = RdSTRH R0, [R1]

3.2 多寄存器传输

指令格式操作示例
LDMIALDMIA{cond} Rn{!}, reglist从 Rn 加载,地址递增LDMIA R0!, {R1-R4}
LDMDBLDMDB{cond} Rn{!}, reglist从 Rn 加载,地址递减LDMDB R0, {R1-R4}
STMIASTMIA{cond} Rn{!}, reglist存储到 Rn,地址递增STMIA R0!, {R1-R4}
STMDBSTMDB{cond} Rn{!}, reglist存储到 Rn,地址递减STMDB SP!, {R0-R3, LR}
PUSHPUSH{cond} reglist压栈(STMDB SP!)PUSH {R0-R3, LR}
POPPOP{cond} reglist出栈(LDMIA SP!)POP {R0-R3, PC}

3.3 栈操作别名

别名真实指令方向说明
PUSH {reglist}STMDB SP!, {reglist}满递减压栈
POP {reglist}LDMIA SP!, {reglist}满递减出栈

四、分支指令

指令格式操作范围示例
BB{cond} labelPC = label±32MBB loop
BLBL{cond} labelLR = PC+4; PC = label±32MBBL function
BXBX{cond} RmPC = Rm & 0xFFFFFFFE; CPSR.T = Rm & 1任意BX LR
BLXBLX RmLR = PC+4; PC = Rm & 0xFFFFFFFE; CPSR.T = Rm & 1任意BLX func

五、条件码速查表

条件码含义标志条件C 语言等价
EQ相等Z == 1if (a == b)
NE不等Z == 0if (a != b)
CS/HS进位/无符号≥C == 1if (a >= b) 无符号
CC/LO无进位/无符号<C == 0if (a < b) 无符号
MI负数N == 1if (a < 0)
PL非负数N == 0if (a >= 0)
VS溢出V == 1if (overflow)
VC无溢出V == 0if (!overflow)
HI无符号大于C == 1 && Z == 0if (a > b) 无符号
LS无符号小于等于C == 0Z == 1if (a <= b) 无符号
GE有符号≥N == Vif (a >= b) 有符号
LT有符号<N != Vif (a < b) 有符号
GT有符号>Z == 0 && N == Vif (a > b) 有符号
LE有符号≤Z == 1N != Vif (a <= b) 有符号
AL无条件任何goto

六、程序状态寄存器指令

指令格式操作示例
MRSMRS{cond} Rd, CPSRRd = CPSRMRS R0, CPSR
MRSMRS{cond} Rd, SPSRRd = SPSRMRS R1, SPSR
MSRMSR{cond} CPSR_<fields>, RnCPSR_<fields> = RnMSR CPSR_c, R0
MSRMSR{cond} CPSR_<fields>, #immCPSR_<fields> = immMSR CPSR_f, #0x80000000

CPSR 域后缀

后缀含义位位置用途
_c控制域[7:0]模式、中断使能
_x扩展域[15:8]保留
_s状态域[23:16]Thumb 状态等
_f标志域[31:24]N、Z、C、V 标志

七、异常与协处理器指令

指令格式操作示例
SVCSVC{cond} #imm24触发 SVC 异常SVC #0x01
BKPTBKPT #imm16触发断点异常BKPT #0
SMCSMC #imm安全监控调用SMC #0
HVCHVC #imm虚拟化调用HVC #0
MRCMRC{cond} p15, op1, Rd, CRn, CRm, op2CP → ARMMRC p15, 0, R0, c0, c0, 0
MCRMCR{cond} p15, op1, Rd, CRn, CRm, op2ARM → CPMCR p15, 0, R0, c12, c0, 0

八、伪指令速查表

伪指令格式翻译结果示例
LDRLDR Rd, =constantMOV/MVN 或 LDR+文字池LDR R0, =0x12345678
LDRLDR Rd, =labelLDR Rd, [PC, #offset]LDR R0, =array
ADRADR Rd, labelADD Rd, PC, #offsetADR R0, str
ADRLADRL Rd, label多条 ADD/SUBADRL R0, far
NOPNOPMOV R0, R0NOP
ALIGNALIGN {n}插入填充字节ALIGN 4
LTORGLTORG强制插入文字池LTORG

九、数据定义伪指令

伪指令格式用途示例
DCBDCB byte1, byte2, ...定义字节常量DCB 0x12, 'A', 0x34
DCWDCW half1, half2, ...定义半字常量DCW 0x1234, 0x5678
DCDDCD word1, word2, ...定义字常量DCD 0x12345678
DCQDCQ quad1, quad2, ...定义双字常量DCQ 0x123456789ABCDEF0
SPACESPACE bytes预留空间SPACE 256
FILLFILL bytes, unit, value填充空间FILL 64, 1, 0xFF
EQUname EQU value定义符号常量GPIO_BASE EQU 0x40020000
ASCIZ.asciz "string"定义字符串(自动加 0).asciz "Hello"

十、CP15 常用寄存器地址

寄存器CRnopc1CRmopc2功能
MIDRc00c00处理器 ID
MPIDRc00c05多核 ID
SCTLRc10c00系统控制
ACTLRc10c01辅助控制
CPACRc10c02协处理器访问
TTBR0c20c00页表基址 0
TTBR1c20c01页表基址 1
TTBCRc20c02页表控制
DACRc30c00域访问控制
DFSRc50c00数据异常状态
IFSRc50c01指令异常状态
DFARc60c00数据异常地址
VBARc120c00向量表基址
CBARc154c00外设基址

十一、内存屏障指令

指令功能说明
DSBData Synchronization Barrier等待所有内存访问完成
DMBData Memory Barrier保证内存访问顺序
ISBInstruction Synchronization Barrier冲刷流水线,重新取指

十二、处理器模式号

模式缩写模式号
UserUSR0x10
FIQFIQ0x11
IRQIRQ0x12
SupervisorSVC0x13
MonitorMON0x16
AbortABT0x17
HypHYP0x1A
UndefinedUND0x1B
SystemSYS0x1F

十三、常用指令组合模板

函数调用与返回

; 函数调用
    BL function_name

; 简单函数返回
    MOV PC, LR

; 保存 LR 的嵌套函数
    PUSH {LR}
    BL sub_function
    POP {PC}

; 保存多个寄存器的函数
    PUSH {R4-R11, LR}
    ; ... 函数体 ...
    POP {R4-R11, PC}

条件判断

; if (a == b)
    CMP R0, R1
    BEQ equal_label

; if (a > b) 有符号
    CMP R0, R1
    BGT greater_label

; if (a > b) 无符号
    CMP R0, R1
    BHI greater_label

循环结构

; for (i = 0; i < n; i++)
    MOV R0, #0          ; i = 0
loop:
    CMP R0, R1          ; i < n?
    BGE loop_end
    ; ... 循环体 ...
    ADD R0, R0, #1      ; i++
    B loop
loop_end:

数组访问

; int arr[],R0 = 数组地址,R1 = 索引
; 读取 arr[index]
    LDR R2, [R0, R1, LSL #2]   ; arr[index]

; 写入 arr[index]
    STR R2, [R0, R1, LSL #2]   ; arr[index] = value

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万法若空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值