完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
ARM 编程模型
编程模型是所有用户可见的寄存器的集合。 ARM寄存器简介 在ARM用户模式下,用户可见寄存器共有17个,包括r0-r15和程序状态寄存器CPSR。ARM寄存器字长和数据总线宽度一致,都是是32位的。
好多关于ARM7的博文中都提到 ARM7 有 7 种工作模式。但是我找到的ARM7的中文数据手册上只有六种,缺了系统模式(SYS)。
汇编指令 ARM 指令集可以划分为若干子类,每类指令具有相同的编码方式,下面介绍三类常见指令。 数据处理指令 数据处理指令的编码格式如下图: 该指令编码的注解如下:
下图是 ARM7 中文数据手册中关于数据处理指令的描述。其中SBC和RSC写错了,改为: SBC - Rd := Op1 - Op2 -1 + C RSC - Rd := Op2 - Op1 -1 + C ps1:TEQ 命令描述中的 EOR 是异或运算。 ps2:BIC 命令的作用是按位清 0,找到 Op2 中的 1 所在的位,把Op1中相应的位清 0。(Bit Clear) 补充知识点 ① ARM寻址方式 这部分内容参考了博主 dongdong0071 的文章,想要详细了解可以移步 ARM的寻址方式 ARM 指令集都是32位宽的,同时地址总线也是32位,所以在汇编指令里无法直接指定内存的绝对地址(进不去,怎么想都塞不进去吧,何况好多指令都是三操作数),想要访问内存就必须借助一些技巧。 ARM 的寻址方式共有八种。
补充知识点 ② 关于第二操作数 ARM 的数据处理指令是三操作数指令。( 按照ARM7手册的分类,MUL/MLA不属于数据处理指令,它是根据编码格式分类的 )分别是目的操作数、第一操作数、第二操作数。其中目的操作数和第一操作数使用 4 位二进制编址,因此只能使用只有16种地址选择的寄存器直接寻址。第二操作数的变址空间有12位,因此它的使用更加灵活。在数据处理指令中,还可以使用寄存器偏移寻址和立即数寻址。寄存器偏移寻址 如前所述,寄存器偏移寻址是对第二操作数的移位。所以第二操作数的 12 位要指明三件事: ① 操作数所在的寄存器(4位) ② 移位方式 (四种:逻辑左或右, 算术右或循环右、2位) ③ 移位次数 (0-31、5位) 共需要11位,所以可以在单个指令编码中塞下。具体实现见下图。 ARM7手册种还给出了另一种编码方式,感兴趣的朋友可以参阅 ARM7数据手册 立即数寻址 这部分内容强烈推荐在到处之间找我的博文:ARM 立即寻址之立即数的形成 —— 如何判断有效立即数 ARM的数据总线有 32 位,但是留给第二操作数的空间只有 12 位。所以立即数的范围必须有所限制。在这 12 位中,0 ~ 7位是数值部分;8~11 位乘以 2 是 0~7 位要进行右移位操作的次数。因此,立即数的表示范围是:(0 - 255)* 22N 。 一个判断立即数是否合法的简便方法:将它写成二进制,观察是否能通过右移偶数次,使得所有的 “1” 都位于低八位上。 数据传送指令 数据传送指令用于在寄存器和内存中传输数据。ARM 处理器的Load-Store结构要求参与运算的操作数如果保存在内存中,那么应该在运算前从内存中取出,或者在运算后将结果保存在内存里。 单寄存器传送 LDR r0, [r1] ; 将r1 指向的内存单元的内容加载到 r0 寄存器。 STR r0, [r2] ; 将 r0 寄存器的值存入 r2 指向的内存单元。 前面提到的数据处理指令要求第一个操作数是目的操作数,但在数据传送指令中不是这样。数据传送指令中,使用寄存器间接寻址来访问内存的永远是第二个操作数,与它是否是源操作数无关。单寄存器传送的第二操作数不仅支持寄存器间接寻址,它的编码方式使它还支持基地址变址的寻址方式。下图是 LDR / STR 指令的机器码编码方式。
多寄存器传送 批量数据传送时,寻址方式可分为多寄存器寻址和堆栈寻址两种类型。每种寻址方式都对应了一些特定的多寄存器传送命令。不同于单寄存器传送和寄存器交换,这两种寻址方式不需要在作为指针的寄存器两侧加中括号。
I : 地址递增;D:地址递减;A:后变址;B:前变址
E:栈顶指针指向的内存单元没有有效数据;ARM 只提供入栈出栈的指令,至于编写程序时使用的堆栈是向上还是向下,是满栈还是空栈,取决于程序员自己的规定。 寄存器交换 SWP Rd, Rm, [Rn] 作用:将 Rm 的值存入 Rn 指向的内存,将 Rn 指向的内存中的原数据取出,并装载到 Rd 里。 使用场景:信号量的置位。 在多任务实时操作系统中,为了避免两个进程同时访问同一个内存块,通常会设置一个表示该内存是否正在被占用的信号量。当它为 0,内存块空闲;为 1,内存被占用,其他进程不得访问。当进程成功访问到内存块时,应该将相应的信号量置1。控制流指令 控制流指令包括 B 和 BL,调用格式:BL init ; B init
上图是控制流指令的编码,编码注解如下:
注意这里的相对地址,并不是相对于 B/BL 命令,而是相对于 PC 指针。因为 ARM 是 3 级流水线架构,如果采用延迟分支的方法解决控制阻滞问题,那么执行到跳转指令时,PC 指针应为当前执行的指令地址加 8。 伪指令 伪指令并不是 ARM 指令集的一部分,而更像是编译器提供给汇编程序开发人员的语法糖。伪指令可以改变编译器的编译方式,也可以将许多麻烦的操作使用一条伪指令解决。编译器会将伪指令替换成优化的 ARM 汇编指令。一方面,伪指令独立于 ARM 指令集;另一方面,伪指令也和具体的编译环境紧密相关。编译环境大体分为两类——我们常用的 keil 属于 ARM 编译环境,在 linux 环境下常用的 gcc 编译器属于 GNU 编译环境。两种环境下的伪指令集合从功能上来讲大同小异,不过书写风格不同。keil 环境的伪指令通常全部大写,gcc 编译器的伪指令通常全部小写且前面有个小数点。不过指令的大小写并无严格限制,只是要求要么全都大写,要么全都小写。
第一次写博客,感觉文章里有不少多余的东西,而且肯定有地方写得不严谨或者有错误。欢迎评论区指出 ^ ^ |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1609 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1540 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
681 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1587 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
503浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 01:35 , Processed in 0.758934 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号