代码示例
.text @代码段起始<br> .code 32 @32位指令<br> .global start @全局函数<br>start:<br> mov r0, #10 @r0=10<br> ldr r1, =3 @r1=3<br> add r0, r0, r1 @r0=r0+r1<br> b . @死循环,跳转到当前<br> .end @start结束
指令
〈opcode〉{〈cond〉} {S} 〈Rd〉,〈Rn〉{,〈operand2〉}<br>
〈opcode〉{〈cond〉} {S} {〈Rd〉,}〈Rn〉,#<const><const></const>
数据处理指令一般格式
<opcode>{<cond>} {S} <Rd>,<Rn>, <shift_operand><const></const>
分支指令
BL
带返回的,CPU自动保存下一条指令的地址到LR
相对跳转前后32M
寄存器加载/存储指令
LDR
LDR{cond} Rd, addressing
加载字
LDR{cond}B Rd, addressing
加载无符号字节
LDR{cond}H Rd, addressing
加载无符号半字
LDR{cond}SB Rd, addressing
加载有符号字节
LDR{cond}SH Rd, addressing
加载有符号半字
STR
STR{cond} Rd, addressing
存储字
STR{cond}B Rd, addressing
存储字节
STR{cond}H Rd, addressing
存储半字
addressing
[r1,#-0x8(12bit)]
r1-0x8作为地址
[r2,r1,lsl #2]
r2+r1*4作为地址
[r1,#0x8]!
r1+0x8作为地址,然后r1=r1+0x8
[r1],#0x20
r1作为地址,然后R1=R1+0x20
栈操作指令
组合栈种类
FD
<font color="#c41230"><b>满减栈</b></font>
适用Linux
满减栈操作指令
举例
STMFD sp!,{r4-r7,lr}
r4~r7和lr保存到栈,并令sp指向栈顶
push {r4-r7,lr}
LDMFD sp!,{r4-r7,pc}
栈中取数据给r4~r7和pc,并令spz指向栈顶
pop {r4-r7,pc}
小标号寄存器会压栈到低地址
状态寄存器访问指令
MRS{cond} Rd, SPSR/CPSR_f/s/x/c
MSR{cond} SPSR/CPSR_f/s/x/c, Rm/#8位立即数
伪指令
ADR
ADR{cond} Rd, expr
+-1020字节
LDR
LDR{cond} Rd,=expr
取expr的值
LDR{cond} Rd,expr
取expr地址(4K)的内容
CPU不能直接识别,需要汇编器翻译
伪操作<br>GNU ARM
常量定义伪操作
.word value
.hword/.short
.ascii/.asciz/.string
字符串,其中ascii需要补\0
.space/.skip
.arm/.code 32/.thumb/.code 16
.section
.text/.data/.bss