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

2024-09-01 14:04

本文主要是介绍嵌入式: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 指令的内存特殊小端序

这篇关于嵌入式:Arm v7-M指令集架构中的字节序(大小端)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127145

相关文章

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.