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核参考手册
目前常用的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核参考手册
相关文章推荐
- php在记事本中换行的问题
- 用python实现矩阵转置
- 关于Spring中的<context:annotation-config/>配置
- c++:warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
- Java读取properties文件
- 在 Qt 中搭建 qwt (超详版)
- Spring总结2—IOC
- 20145317彭垚 《Java程序设计》第8周学习总结
- 1052. 卖个萌 (20)
- 【FTP】C# System.Net.FtpClient库连接ftp服务器(下载文件)
- JavaWeb学习总结(十二)——Session
- [疯狂Java]I/O:文件随机读写专用类——RandomAccessFile
- C#详解struct和class的区别
- 浅析java语言中的垃圾回收机制
- java中链表的操作
- Java主要特性
- Java中回调函数编写
- Java中回调函数编写
- C++new实现机制
- PCA人脸识别学习及C语言实现