ARM汇编指令集1(16_08_26_02)

来源:互联网 发布:初中网络辅导班 编辑:程序博客网 时间:2024/05/17 02:36

指令与伪指令

(汇编)指令是CPU机器指令的助记符经过编译后会得到一串10组成的机器码,可以由CPU读取执行。(101010太难记了,用mov,bl这些助记符,人比较容易看懂);

(汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。


两种不同风格的ARM指令

1)ARM官方的ARM汇编风格:指令一般用大写、windows中的IDE开发环境(如MDK)。如 LDRR0,[R1];

2)GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr ro0,[r1] 。

 

ARM汇编的特点1:LDR/STR架构

1)ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理;18:42

2)ldr(load register) 指令将内存内容加载入通用寄存器。

3)str(store register) 指令将寄存器内容存入内存空间中。

4)ldr/str组合来实现ARM CPU和内存数据交换。


ARM汇编特点2:支持8种寻址方式

1)寄存器寻址        mov r1,r2

2)立即寻址          mov r0,#0xff00

3)寄存器移位寻址       mov r0,r1,lsl#3   (r1左移3位的数据赋予r0)

4)寄存器间接寻址       ldr r1,[r2]       (r2是一个寄存器,单论其里面的内容不过只是数据,单加上[]之后,其指向的其实就是内存的地址了,即[r2]的内容即为内存地址。实际上,C语言的指针就是这么个东西。)

5)基址变址寻址      ldr r1,[r2,#4]    ([r2,#4],就类似于[r2+4] )

6)多寄存器寻址      ldmia r1!,{r2-r7,r12}    (将r1地址指向的内存作为起始地址,将内存里面的值依次赋给 r2-r7,和r12,r1就类似于C语言中的数组头)

7)堆栈寻址(其实是栈) stmfd sp!, {r2-r7,lr}    (将sp指向的栈的内容,依次赋给r2-r7和lr)

8)相对寻址          beq flag      (跳转:内含 pc指针 + 一个偏移量flag)

 

ARM汇编特点3:指令后缀

同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:

1)B(byte) 功能不变,操作长度变为8位;

2)H(half word)功能不变,长度变为16位;

3)S(signed)功能不变,操作数变为有符号,如ldr, ldrb,ldrh, ldrsb,lsrsh

4)S(S标志)功能不变,影响CPSR标志位,如mov和movs

 

ARM汇编特点4:条件执行后缀

例子:moveq r0,r1 //如果eq后缀成立,则执行 mov r0,r1

条件后缀注意两点:

1)条件后缀是否成立,不是取决于本剧代码,而是取决于这句代码之前的代码运行后的结果。

2)条件后缀决定了本句代码是否被执行,而不会影响上一句或者下一句代码是否被执行。

 

条件后缀种类及含义


ARM汇编特点5:多级指令流水线

PC指向正被取址的指令,而非正在执行的指令。

流水线越多,运行速度更快(取指令分步执行,所以快),但是越怕跳转!因为跳转后,在流水线中的指令需要重载。

流水线为13级流水线时,当前正在被执行的指令其实就是PC指针指向的指令的前12个指令。
0 0
原创粉丝点击