您的位置:首页 > 编程语言

ARM汇编编程学习

2016-04-24 16:37 323 查看
在嵌入式程序中,汇编语言多用于bootloader、内核的初始化以及效率要求比较高的程序代码中。

目前常用的ARM汇编指令有两种,一是ARM标准汇编,适用于ARM公司的汇编器适合在Windows平台中使用;二是GNU汇编,适用与交叉编译工具链中的汇编器,适合于Linux开发平台。

       和C语言有程序开发有它的程序框架一样,如包含头文件,宏定义,函数格式等等,汇编语言也有它的开发框架,如:

.section.data

     <初始化的数据>

.section.bss

<为初始化的数据>

.section.text

.global _start

_start:

...

...

_start为汇编语言的程序入口

下面分类介绍ARM指令,这里将ARM汇编指令分为6种:

       1)算数和逻辑指令

MOV 传送指令

       MOV {条件} {S} <dest> ,  <op 1>

     dest = op_1

MOV指令从另一个寄存器、被移位的寄存器或一个立即数装载到目的寄存器

MOV R0, R0, LSL#3

MVN:传送取反的值

 MVN {条件} {S} <dest> ,  <op 1>

dest = !op_1

SUB:减法

SUB   {条件}   {S} <dest>,  <op 1>,  <op 2>

dest = op_1  -   op_ 2

ADD :加法

ADD  {条件}   {S} <dest>,  <op 1>,  <op 2>

dest = op_1 +  op_ 2

AND:逻辑与

AND  {条件}   {S} <dest>,  <op 1>,  <op 2>

dest = op_1 and  op_ 2

ORR:逻辑或

ORR {条件}   {S} <dest>,  <op 1>,  <op 2>

dest = op_1 or  op_ 2

BIC:位清除

BIC {条件}   {S} <dest>,  <op 1>,  <op 2>

BIC 是在一个字中清除位的一个方法, 操作数2是一个32位的位掩码(mask),如在掩码中置1了某一位则清除这一位。

BIC R0, R0, #0b1011

2)比较指令

CMP:比较

CMP {条件}   {P} <op 1>,  <op 2>

status = op_1 - op_2

影响CSPR标志位

TST:测试位

CMP {条件}   {P} <op 1>,  <op 2>

status = op_1 and op_2

结果影响标志位

3)跳转指令

B:分支

B {条件} <地址>

BL:带链接的分支

BL {条件} <地址>

在分支之前R14寄存器中装载上了R15的内容,在分支程序执行结束之后可以将R14中的地址装载到R15中,从而返回分支之前的指令。

·4)移位指令

LSL:逻辑算术左移

左端高位移出数据丢弃,右端最低有效位用0补充

ROR:
4000
循环右移

将右侧移出的数据放在左侧

5)程序状态字访问指令 (对CRSR, SPSR操作的指令)

MSR  :将普通寄存器中的数据写入程序状态字寄存器中

MRS::将程序状态字寄存器中的数据保存至普通寄存器中

6)  存储器访问指令

LDR    Rd, <地址>  ;将内存中的数据传入寄存器中

STR    Rd, <地址> ;将寄存器中的数据存入内存中

STR  Rd, [Rbase, Rindex] !  ;内存中的地址为 Rbase+ Rindex ,   !表示将Rbase+ Rindex 写回至Rbase

下面讲解一下ARM汇编伪指令,首先说明一下什么是伪指令,伪指令本身并没有对应的机器码,只是在编译的时候起作用,或者转化为其他实际指令来运行。这里有必要解释一下机器码。

机器码是我们嵌入式芯片能够识别的代码,我们在编译器中编写的c或者汇编代码最终都要翻译为机器码。下图为机器码格式的说明。



ARM汇编伪指令可分为两类,定义类伪指令和操作类伪指令;

1)定义类伪指令

这里介绍7中定义类伪指令

global   ;全局变量声明

.data   ;数据段声明

.ascii;  数据段中字符串格式声明

.byte ; 数据段中字节格式声明

.word; 数据段中字格式声明

.equ ; 类似于c中的 #define宏定义

.align ; 字节对齐

2)操作类伪指令

nop   ; 空操作

ldr  ;受机器码格式的限制,arm汇编指令的操作数不能超过8位,这里定义ldr伪指令用于处理汇编代码中超过8位的操作数,使用范例    ldr r0, =0xfff

最后说明的指令是协处理器访问指令,为了减轻处理器负担,ARM处理器支持多达16个协处理器用于执行特定的任务,其中CP15是最重要的一个,用到的指令为mrc    mcr具体格式可参阅arm核参考手册
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: