1.2ARM汇编指令集的特点

8种寻址方式

寄存器寻址   mov r1,r2
立即寻址        mov r#0xFF00
寄存器移位寻址 mov r0,r1,lsl #3 
寄存器间接寻址 ldr r1,[r2] 
基址变址寻址  ldr r1,[r2,#4]
多寄存器寻址  ldmia r1!,{r2-r7,r12} 
堆栈寻址        stmfd sp!,(r2-r7,lr)

相对地址        flag:beq flag

指令后缀

B(byte)     功能不变,操作长度变为8位
H(half word)    功能不变,操作长度变为16位
S(signed)       功能不变,操作长度变为有符号
    如ldr、ldrb、drh、ldrsb、
S(S标志)      功能不变,影响CPSR标志位
    如mov和movs

条件执行后缀

mov r0,r1   0 相当于C语言当中的r0=r1
moveq   r0,r1   0 如果eq后缀成立,则直接执行mov r0,r1;如果eq不成立,相当于没有
        0 类似于   C语言当中的if(eq){r0=r1}

多级指令流水线

cpsr

:程序状态寄存器,整个CPU只有一个;而SPSR有5个,分别在五种异常模式下,作用是当普通模式进入异常模式

时,用来保存之前普通模式的CPSR的,以在返回普通模式是复原原来的CPSR.

跳转指令

b   直接跳转
bl  跳转前将返回地址保存到lr寄存器,一般用于子程序调用
bx  跳转同时切换到ARM模式,一般用于异常处理的跳转

访存指令

单个字/半字/字节访问ldr/str
多字节访问 ldm/stm
8中后缀
ia  (increase after)    先传输,再地址加4
ib  (increase before)   先地址加4,再传输
da  (dacrease after)    先传输,再地址减4
db  (decrease before)   先地址减4,再传输

gun汇编中的一些符号

@用来作注释,可以在行首也可以在代码后面同一行直接跟,和C语言中//类似
#做注释,一般放在行首,表示这一行都是注释而不是代码
:以冒号结尾的是标号
 .点号在gun汇编中表示当前指令的地址
#立即数前面要加#或$

常见的gun伪指令

.global_start   @给_start外部链接属性
.section.text   @指定当前段为代码段
.ascii.byte.short.long.word 
.quad.float.string  @定义数据
.align 4        @以16字节对齐    2^4
.balignl    16,0xabcdefgh   @对齐+(位)填充
.equ        @类似于C中宏定义   
.end        @文件结束
.arm/.code 32   @声明以下为arm指令
.thumb/code 16  @声明以下为thumbm指令

最重要的伪指令

ldr     大范围的地址加载指令
adr     小范围的地址加载指令
adrl        中等范围的地址加载指令     

ARM中有一个ldr指令,还有一个ldr的伪指令
adr和ldr的差别,ldr加载的地址在链接时确定,而adr加载的地址在运行时确定,所以可以通过adr和ldr加

载的地址来判断程序是否在链接时指定的地址执行

你可能感兴趣的:(1.2ARM汇编指令集的特点)