汇编指令及其特点

基础知识

指令与伪指令

汇编指令:CPU机器指令的助记符,编译后得到1和0组成的机器码,由CPU读取执行

伪指令:本质上不是指令,由编译环境提供,目的在于指导编译过程,最终不会生成机器码

不同的ARM风格

ARM官方汇编风格:指令一般大写,windows IDE开发环境常用。(譬如:LDR、STR)

GNU风格的ARM汇编:指令一般小写,linux中常用。(譬如:ldr、str)

ARM汇编的特点

ARM汇编特点1:LDR和STR架构

ARM采用RISC架构,CPU不能直接读取内存,需要将内存内容加载到CPU通用寄存器才能被CPU处理。

ldr(load register):将内存内容加载到通用寄存器    

str(store register):将指令存取通用寄存器

用ldr和str组合就能很好实现数据交换

ARM汇编特点2:八种寻址方式

寄存器寻址 mov r1, r2             //把r2存入r1
立即寻址 mov r0, #0xFF00           //把后面的数字存入r0
寄存器移位寻址 mov r0, r1, lsl #3      //把r1左移3位后存入r1
寄存器间接寻址 ldr r1, [r2]        //把r2这个内存地址所对应的值赋值给r1
基址变址寻址 ldr r1, [r2, #4]       //把r2+4后的内存地址多对应的值存入r1
多寄存器寻址 ldmia r1!, {r2-r7, r12}   //把r1到r7以及r12依次存在r1,r2,r3,r4,r5,r6,r7,r12
堆栈寻址 stmfd sp!, {r2-r7, lr}      //把堆栈SP中的内容依次存在r2,r3,r4,r5,r6,r7,lr中
相对寻址   beq flag           //跳转到标号flag
     flag:     

ARM汇编特点3:指令后缀

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

经常使用的后缀有:

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

H(half word)功能不变,长度变为16位      //由于我们在32位系统中,依次操作32位的效率是最高的,所以一般用ldr

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

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

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

无后缀:mov r0, r1

有后缀:moveq r0, r1    //如果eq后缀成立则执行mov r0, r1,如果不成立则本句代码作废

注意:(1)条件执行后缀是否成立,不是取决于本句代码,而是取决于之前代码执行的结果

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

常用的一般就是EQ(equal)、NE(not equal)、GT(great than)、LT(less than)

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

 

 

为了让CPU处理起来更加的具有效率,CPU往往是一边执行指令的同时就在提前读取下面的指令了,对于三级流水线,以ARM为例子,在32位系统中,一条指令刚好4个字节。

举例分析:假设有三条指令地址为:0xd002_0040、0xd002_0044、0xd002_0048

当前已经执行到0xd002_0040,为了保证运行流畅高效,实际上CPU指令指针PC已经指向0xd002_0048了,开始做准备工作了。所以对应的,他们的地址分别为:PC-8和PC。

 

posted @ 2017-06-09 11:47  进心进利  阅读(1173)  评论(0编辑  收藏  举报