//一般ARM官方风格汇编指令为大写,windows/ADS/MDK
//实际运用一般用GNU风格,为小写,linux
(1)
•ARM采用RISC架构,CPU本身不能直接读取内
存,而需要先将内存中内容加载入CPU中通用寄
存器中才能被 CPU处理
•ldr(loadregister)指令
将内存内容加载入通用寄存器。
•str(storeregister)指令将寄存器内容存入内存空间中。
•ldr/str组合用来实现ARM CPU和内存数据交换
ARM模式/thumb模式(16位)
各模式及对应的寄存器(S5PV210):
(2)
•
寄存器寻址 mov r1, r2
•
立即寻址 mov r0, #0xFF00
•
寄存器移位寻址 mov r0, r1, lsl #3
•
寄存器间接寻址 ldr r1, [r2]
•
基址变址寻址 ldr r1, [r2, #4]
•
多寄存器寻址 ldmia r1!, {r2-r7, r12} //保存现场是可用到
•
堆栈寻址 stmfd sp!, {r2-r7, lr} //恢复现场是用到,此时寄存器指的是后者
•
相对寻址 beq flag
常用指令:
算数指令:ADD ,SUB,MVL
逻辑与比较指令:AND,ORR,BIC,EOR
读写CPSR指令:MRS,MSR //MRS中R在前面,用来读CPSR;MSR用来写到CPSR中去
跳转指令:b(不打算返回的),bl(返回地址保存在lr,用于函数调用),bx(并切换ARM模式,用于异常跳转
)
访存指令:LDR(可用作伪指令,=XXX实现立即数合法化),STR,STM,LDM,ADR(伪指令,相对于LDR,短跳转
,编译时以
PC为基准,用ADD/SUB代替;而LDR长跳转,以链接地址为基准,用MOV代替)
软中断指令:SWI陷入,实现系统调用。
伪指令:ADR,LDR,NOP(空操作),ADRL(中等范围地址加载指令),其他伪指令
•
.global _start @ 给_start外部链接属性
•
.section .text @ 指定当前段为代码段
•
.ascii .byte .short .long .word
•
.quad .float .string @ 定义数据
•
.align 4 @以16字节对齐
•
.balignl 16 0xabcdefgh @ 16字节对齐填充
•
.equ @类似于C中宏定义
(3)指令执行后缀
•
同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:
•
B(byte)功能不变,操作长度变为8位
•
H(halfword)功能不变,长度变为16位
•
S(signed)功能不变,操作数变为有符号
•
如 ldr ldrb ldrh ldrsb ldrsh
•
S(S标志)功能不变,影响CPSR标志位
•
如 mov和movs movs r0, #0
常用后缀:
•ia(increaseafter)先传输,再地址+4
•ib(increasebefore)先地址+4,再传输
•da(decreaseafter)先传输,再地址-4
•db(decreasebefore)先地址-4,再传输
•fd(fulldecrease)满递减堆栈
•ed(emptydecrease)空递减堆栈
•fa(
·······
) 满递增堆栈
•ea(
·······
)空递增堆栈
一般使用满减栈,即用ldmia,stmfd操作。
常用符号后缀:^在目标寄存器中有PC寄存器时,会将SPSR写回至CPSR(现场恢复)
LDMIA r0!,{r2-r3} r0的值在ldm过程中发生的改变(+/-)写回到r0中
(4)条件执行后缀
(5)协处理器指令
ARM理论可支持16个协处理器,实际上只实现CP15(coprocessor)
协处理器和MMU、cache、TLB等处理有关,功能上和操作系统的虚拟地址映射、cache管理等有关。
用MRC读,MCR写
•
mcr{<cond>} p15, <opcode_1>, <Rd>,<Crn>, <Crm>, {<opcode_2>}
•
opcode_1:对于cp15永远为0
•
Rd:ARM的普通寄存器
•
Crn:cp15的寄存器,合法值是c0~c15
•
Crm:cp15的寄存器,一般均设为c0
•
opcode_2:一般省略或为0
记住格式:p15 0 普通Disco 后面三个cp15的参数(? c0 0)