目录
协处理器指令
伪操作
安装交叉编译工具
Makefile
进入命令:vi ASM-ARM.s
宏定义
make之后查看ASM-ARM.dis反汇编文件
预编译指令
申请一个字的空间 .word
申请多个字节空间
嵌套编程
方式一:汇编跳转到C
方式二:C跳转到汇编
方式三:C内嵌汇编
协处理器指令
- 数据运算
- 内存访问
- 与主处理器通信
协处理器指令
1.协处理器数据运算指令
CDP
2协处理器储存器访问指令
STC 将协处理器中的数据储存到存储器
LDC 将存储器中的数据读取到协处理器中
3.协处理器寄存器传送指令
MRC 将协处理器中寄存器的数据传送到ARM处理器中的寄存器
MCR 将ARM处理器寄存器中的数据读取到协处理器寄存器中
- 协处理器CP15
CP15管内存的
如果ARM直接操作内存,就操作到物理内存了。
ARM不直接操作内存,arm找一个助理,这个助理是CP15。这时候ARM想访问内存怎么办?
ARM先把想访问的内存地址(虚拟地址)给CP15,CP15将这个地址转换为物理地址。然后去物理地址取数据,取出数据之后,再返给ARM
->指令
LDR R1,[R2]
->伪指令
LDR R1,=0X12345678
LDR R1,=STOP 把STOP的地址给R1
LDR R1,STOP 把STOP的地址中的内容给R1
问:伪操作是谁规定的
伪操作
1、不同编译器的伪操作语法不同
安装交叉编译工具
A)说明
交叉编译工具链:arm-none-linux-gnueabi-gcc
注:arm-none-linux-gnueabi-:交叉编译工具链的名字,名字就是一个代号,在工作中用的不一定是这个,不同的公司用的交叉编译工具链的名字不同
B)获取
自己去gnu官网获取交叉编译工具链的源码,自己进行编译生成对应的交叉编译工具链。不推荐:编译过程很繁琐
直接从芯片厂家获取交叉编译工具链
直接跟开发板的生成厂家获取交叉编译工具链
直接找主管获取交叉编译工具链(单位)
C)安装:
- 在ubuntu的家目录(~)下,创建toolchain
mkdir toolchain
- 拷贝gcc-4.6.4.tar.xz到toolchain目录下
cp 目录/gcc-4.6.4.tar.xz ~/toolchain
- 解压缩交叉编译工具链
tar -xvf gcc-4.6.4.tar.xz
- 配置环境变量
打开 sudo vi /etc/bash.bashrc
- 在最后一行添加以下内容:
export PATH=$PATH:/home/hq/toolchain/gcc-4.6.4/bin/
- 修改为自己的路径
- 使环境变量立即生效
source /etc/bash.bashrc
- 测试交叉编译工具链是否安装成功
arm-none-linux-gnueabi-gcc -v
- 打印以下内容,表示成功
gcc version 4.6.4 (crosstool-NG hg+default-2685dfa9de14 - tc0002)
3、使用工程模板
Makefile
- Makefile的一些基本概念
目标 : 依赖 命令
- Makefile的基本工作原理
(1)当我们make xx时,Makefile会自动执行xx这个目标下的命令语句。
(2)当我们make xx时,是否执行命令是取决于依赖的,依赖如果成立才可以执行。
(3)当直接make时,和make 第一个目标 效果是一样的。第一个目标实际就是默认目标。
- make的依赖性
make会一层又一层的去找文件的依赖关系。直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会退出,并报错,而对于所定义的命令的错误或是编译不成功,make根本不care。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后边的文件还是不在,那么对不起,我就不工作啦。、
- Makefile分析
cc编译 ld 链接 objdump反汇编 -g gdb调试 -00 表示优化 -c 表示生成目标文件
elf是编译好的链接文件 是个可执行文件
- VI 打开文件
进入命令:vi ASM-ARM.s
宏定义
.text @代码段
.global _start @将_start声明成一个全局的符号,其他.s文件也可以引用
_start: @汇编的入口
.EQU PI,12 @汇编的宏定义
MOV R1,#PI
.end
make之后查看ASM-ARM.dis反汇编文件
预编译指令
MOV R1,#1
.if 1 @预编译:0不会编译此段 1编译此段
MOV R2,#2
.endif
申请一个字的空间 .word
MOV R1,#1
.word 0x12345678
MOV R2,#2
申请多个字节空间
MOV R1,#1
.SPACE 20,0XFF
MOV R2,#2
嵌套编程
方式一:汇编跳转到C
------------S----------
MOV R1,#1
BL Func
MOV R2,#2
------------C----------
void Func(void);编译器最后一句话会自动编译为MOV PC,LR
{
}
方式二:C跳转到汇编
------C------------ 把汇编的标号看做C的函数
extern Func1(void);
void Func(void
{
int a;
a++;
Func1();
a=0;
}
----------s--------
Func1
MOV R1,#1
MOV PC,LR
方式三:C内嵌汇编
-----C-----
void Func1(void)
{
int a;
a=1;
asm
{
"MOV R1,#1\n"
"MOV R2,#2\n"
};
a=2;
}