一. 指令和伪指令
1.1. 指令
a. (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。
1.2. 伪指令
b. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。
二. 两种不同风格的ARM指令
1.1. ARM官方的ARM汇编风格
a. 指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如: LDR R0, [R1]
1.2. GNU风格的ARM汇编
a. 指令一般用小写字母、linux中常用。如:ldr r0, [r1]
三.ARM汇编要点
3.1. LDR/STR架构
3.1.1. ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。
3.1.2. ldr(load register)指令将内存内容加载入通用寄存器。
示例:ldr R0, [R1, #8] 将地址R1 + 8的字数据读入以R0存储器中
ldr R0, [R1], #8 将R1的数据读入到R0,并将R1 + 8的值存入R1
3.1.3. str(store register)指令将寄存器内容存入内存空间中。
示例: str R0, [R1, #8] 将R0中的数据写入以R1 + 8为地址的存储器中
str R0, [R1], #8 将R0的数据 + 8后存入R1地址的存储器中
3.2. 7种寻址方式
3.2.1. 寄存器寻址 mov r1, r2
3.2.2. 立即寻址 mov r0, #0xFF00
3.2.3. 寄存器移位寻址 mov r0, r1, lsl #3
3.2.4. 寄存器间接寻址 ldr r1, [r2]
3.2.5. 基址变址寻址 ldr r1, [r2, #4]
3.2.6. 多寄存器寻址 ldmia r1!, {r2-r7, r12}
3.2.7. 堆栈寻址 stmfd sp!, {r2-r7, lr}
3.3.指令后缀
3.3.1. 同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:
a. B(byte)功能不变,操作长度变为8位
b. H(half word)功能不变,长度变为16位
c. S(signed)功能不变,操作数变为有符号
d. S(S标志)功能不变,影响CPSR标志位
示例: ldrb ldrh ldrsb ldrsh movs
3.4. 条件执行后缀
3.5. 多级指令流水线
3.5.1. 为增加处理器指令流的速度,ARM使用多级流水线.,下图为3级流水线工作原理示意图。(S5PV210使用13级流水线,ARM11为8级) 允许多个操作同时处理,而非顺序执行。
参考《朱老师.1.2ARM裸机课件》