免费h5生成网站,出色的网站设计,安卓app下载安装,威海高新园区建设运营有限公司网站我们要编写的是 ARM 汇编#xff0c;编译使用的是 gcc 交叉编译器#xff0c;所以要符合 GNU 语法。
1、汇编指令
汇编由一条条指令构成#xff0c;ARM 不能直接访问存储器#xff0c;比如 RAM 中的数据#xff0c;I.MX6UL 中的寄存器就是 RAM 类型的#xff0c;我们用…我们要编写的是 ARM 汇编编译使用的是 gcc 交叉编译器所以要符合 GNU 语法。
1、汇编指令
汇编由一条条指令构成ARM 不能直接访问存储器比如 RAM 中的数据I.MX6UL 中的寄存器就是 RAM 类型的我们用汇编来配置 I.MX6UL 寄存器的时候需要借助存储器访问指令一般先将要配置的值写入到 Rx(x0~12)寄存器中然后借助存储器访问指令将 Rx 中的数据写入到 I.MX6UL 寄存器读取 I.MX6UL 寄存器也是一样的只是过程相反。
常用的存储器访问指令有两种LDR 和 STR LDR 指令
LDR Rd, [Rn , #offset] 从存储器 Rnoffset 的位置读取数据存放到 Rd 中LDR 主要用于从存储加载数据到寄存器 Rx 中LDR 也可以将一个立即数加载到寄存器 Rx 中LDR 加载立即数的时候要使用“”而不是“#”。在嵌入式开发中LDR 最常用的就是读取 CPU 的寄存器值比如 I.MX6UL 有个寄存器 GPIO1_GDIR其地址为 0X0209C004我们现在要读取这个寄存器中的数据示例代码如下
LDR R0, 0X0209C004 将寄存器地址 0X0209C004 加载到 R0 中即 R00X0209C004
LDR R1, [R0] 读取地址 0X0209C004 中的数据到 R1 寄存器中上述代码就是读取寄存器 GPIO1_GDIR 中的值读取到的寄存器值保存在 R1 寄存器中上面代码中 offset 是 0也就是没有用到 offset 。
STR 指令
STR Rd, [Rn, #offset] 将 Rd 中的数据写入到存储器中的 Rnoffset 位置LDR 是从存储器读取数据STR 就是将数据写入到存储器中以 I.MX6UL 寄存器GPIO1_GDIR 为例现在我们要配置寄存器 GPIO1_GDIR 的值为 0X20000002示例代码如下
LDR R0, 0X0209C004 将寄存器地址 0X0209C004 加载到 R0 中即 R00X0209C004
LDR R1, 0X20000002 R1 保存要写入到寄存器的值即 R10X20000002
STR R1, [R0] 将 R1 中的值写入到 R0 中所保存的地址中LDR 和 STR 都是按照字进行读取和写入的也就是操作的 32 位数据如果要按照字节、半字进行操作的话可以在指令“LDR”后面加上 B 或 H比如按字节操作的指令就是 LDRB 和 STRB按半字操作的指令就是 LDRH 和 STRH 。
其他指令比如处理器内部数据传输指令MOV、MRS、MSR等、压栈和出栈指令PUSH、POP、跳转指令B、BL等、算数运算指令ADD、ADC、SUB、SBC、MUL、UDIV、SDIV等、逻辑运算指令AND、ORR等等不一一列举了。
2、LDR、STR 为什么用的是 R0、R1
这就涉及到 Cortex-A 寄存器组了首先 Cortex-A7 处理器有 9 种处理模式如下图 ARM 架构提供了 16 个 32 位的通用寄存器(R0 ~ R15)供软件使用前 15 个(R0~R14)可以用作通用的数据存储R15 是程序计数器 PC用来保存将要执行的指令。ARM 还提供了一个当前程序状态寄存器 CPSR 和一个备份程序状态寄存器 SPSRSPSR 寄存器就是 CPSR 寄存器的备份。 每一种模式可见的寄存器包括 15 个通用寄存器(R0~R14)、一两个程序状态寄存器和一个程序计数器 PC。在这些寄存器中有些是所有模式所共用的同一个物理寄存器有一些是各模式自己所独立拥有的。 因为 ARM 指令不能直接读取 RAM 中的数据必须借助内部的寄存器来完成数据的读取所以使用 R0、R1、R2等通用寄存器都是可以的。