ARM-伪操作

目录

协处理器指令

伪操作

安装交叉编译工具

  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;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值