当前位置: 首页 > news >正文

嵌入式:Arm v7-M指令集架构中的字节序(大小端)

相关阅读

嵌入式icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12768532.html?spm=1001.2014.3001.5482


        本文来源于博主无意之中的一个发现,虽然之前就知道Cortex-M3默认为小端模式,但是偶然发现了一些出乎意料的情况。

        首先来看看Arm v7-M指令集架构中相关的定义。

        假设存在一个地址A,则该处的规则为:

  • 一个地址为A的字,由地址A,A+1,A+2,A+3处的字节组成。
  • 一个地址为A的半字,由地址A,A+1处的字节组成。
  • 一个地址为A+2的半字,由地址A+2,A+3处的字节组成。
  • 一个地址为A的字,由地址A,A+2处的半字组成。

        然而,这并未完全指定字(word)、半字(halfword)和字节(byte)之间的映射关系。一个内存系统使用以下映射方案之一。这个选择被称为内存系统的字节序(endianness)。

小端序

        在小端字节序的内存系统中,内存中的字节与Arm通用寄存器(32位)之间的映射如图1所示。

图1 小端序映射

        在图1中,一个32位的数据的最低字节(即0到7位)保存在地址A处;次低字节(即8到15位)保存在地址A+1处;次高字节(即16到23位)保存在地址A+2处;最高字节(即24到31位)保存在地址A+3处。总结来说就是,高字节存高地址,低字节存低地址。

        同时从图2中可以看出,A既是最低字节的地址,也是低半字的地址,还是整个字的地址;A+2既是次高字节的地址,,也是高半字的地址。

图2  字,半字,字节在小端序中的地址

大端序

        在大端字节序的内存系统中,内存中的字节与Arm通用寄存器(32位)之间的映射如图3所示。

图3 大端序映射

        在图3中,一个32位的数据的最低字节(即0到7位)保存在地址A+3处;次低字节(即8到15位)保存在地址A+2处;次高字节(即16到23位)保存在地址A+1处;最高字节(即24到31位)保存在地址A处。总结来说就是,高字节存低地址,低字节存高地址。

        同时从图4中可以看出,A既是最低字节的地址,也是高半字的地址,还是整个字的地址;A+2既是次低字节的地址,也是低半字的地址。

图4  字,半字,字节在大端序中的地址

注意

        大端和小端决定了字或半字中字节的解释顺序。举个例子,从地址0x1000读取一个字(4 个字节)将会访问位于内存地址0x1000、0x1001、0x1002 和0x1003的字节,无论使用何种字节序,字节序只决定了如何将这四个字节解释为一个32位的字。

        字节序设置仅适用于数据访问,指令获取始终为小端模式。所有对系统控制空间(CSC)的访问都是小端模式。

特殊情况

        图5是一条32位的指令,而图6是其对应的存储情况。

图5 MOV指令

图6 指令的存储情况

        这似乎有些问题,按照上面的大小端序的定义。从存储情况来说,如果是小端序,这个32位指令应该被解释为0800F04F而不是F04F0800。

        这是因为对于Thumb指令而言,要求它们是16位对齐。这意味着一个32位指令被视为两个半字,高半字位hw1,低半字位hw2,但是此时hw1位于较低地址,而hw2位于较低地址,如图7所示,这看起来就像是指令只在半字层面才是小端序。

图7 指令的内存特殊小端序

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java 入门指南:Java 并发编程 —— Synchronized 实现悲观锁(Pessimistic Locking)
  • 【Spring Boot 3】【Web】全局异常处理
  • 安卓开发环境搭建1
  • 在使用React Hooks中,如何避免状态更新时的性能问题?
  • 3.Redis高级特性和应用(慢查询、Pipeline、事务、Lua、限流原理)
  • 笔记 12 : 彭老师课本第 6 章, PWM ,代码实践
  • 位图 —— 哈希思想的产物
  • 网站开发:XTML+CSS - 网页文档结构
  • 【代码随想录训练营第42期 Day46打卡 - 回文问题 - LeetCode 647. 回文子串 516.最长回文子序列
  • 革命性架构:如何用命令模式彻底革新手游后端设计
  • mysql 修改用户密码
  • C++:类和对象(二)
  • 顶级 SSD 硬盘数据恢复工具探讨:最佳 SSD 硬盘数据有哪些
  • web渗透:XXE漏洞
  • python(9) : docker方式运行python程序(自启动,守护)
  • SegmentFault for Android 3.0 发布
  • 【Linux系统编程】快速查找errno错误码信息
  • C学习-枚举(九)
  • dva中组件的懒加载
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Mybatis初体验
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python_网络编程
  • react 代码优化(一) ——事件处理
  • Redis中的lru算法实现
  • STAR法则
  • Swoft 源码剖析 - 代码自动更新机制
  • Vultr 教程目录
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 前端存储 - localStorage
  • 日剧·日综资源集合(建议收藏)
  • 时间复杂度与空间复杂度分析
  • 王永庆:技术创新改变教育未来
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一份游戏开发学习路线
  • 用简单代码看卷积组块发展
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • # Maven错误Error executing Maven
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #Java第九次作业--输入输出流和文件操作
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口