嵌入式开发笔记(五) ARM汇编指令集基础1 原

ARM 302浏览

1.指令与伪指令的概念:

1(汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器   码,可以由CPU读取执行。

 

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

1.1ARM指令的不同风格

两种不同风格的ARM指令

(1)ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如 ADS.MDK等)常用。如: LDR R0, [R1]

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

2.ARM汇编特点

 2.1:LDR/STR架构

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

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

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

(3)ldr/str组合用来实现 ARM CPU和内存数据交换

2.2:8种寻址方式

-------------------------------------------------------------------------------

(1)寄存器寻址 mov r1, r2

(2)立即寻址 mov r0, #0xFF00

(3)寄存器移位寻址 mov r0, r1, lsl #3(左移)

   ---------------------------------------------------------------------------------

(4)寄存器间接寻址 ldr r1, [r2](r2寄存器存放内存的地址所      对应的值)

(5)基址变址寻址 ldr r1, [r2, #4](r2寄存器存放内存的地 址+4)

 

(6)多寄存器寻址 ldmia r1!, {r2-r7, r12}(r1寄存器存放的          内存地址作为首地 址依次存放到后面 寄存器)

 

(7)堆栈寻址 stmfd sp!, {r2-r7, lr}(sp堆指针连续访 问放到寄存器)

-----------------------------------------------------------------------

(8)相对寻址      beq flag (思想类似于GOTO)

               flag:(标号)

 

2.3:指令后缀

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

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

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

    (3)S(signed)功能不变,操作数变为有符号

    如 ldr(加载) ldrb (加载bytel) drh  ldrsb  ldrsh

    (4)S(S标志)功能不变,影响CPSR标志位

    如 mov和movs movs r0, #0

 

 

影响Z。

2.4:条件执行后缀

 

GT greater than

LT less than

例如:

mov r0, r1 @ 相当于C语言中的r0 = r1;

moveq r0, r1     @ 如果eq后缀成立,则直接执行mov r0, r1;如果eq不成立则      本句代码直接作废,相当于没有

@ 类似于C语言中 if (eq){r0 = r1;}

条件后缀执行注意2点:

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

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

2.5:多级指令流水线

 

(1)为增加处理器指令流的速度,ARM使用多级流水线.,下图为3级流水线工作原理示意图。(S5PV210使用13级流水线,ARM11为8级)

允许多个操作同时处理,而非顺序执行。

(2)PC指向正被取指的指令,而非正在执行的指令