2

Endianess 确定字中字节的顺序。让我们考虑以下
内存系统:

在此处输入图像描述

所以这是一个字节可寻址的 32 位存储器。如果我将一个十六进制值移动'val = 0x56789A'到字地址为 0 的内存位置,那么对于 big endian,它将如下所示:
在此处输入图像描述
对于 little endian,如下所示:
在此处输入图像描述

但是我们知道,在寄存器中,值存储为“56789A”,所以如果我们有一个大端类型的字节顺序,那没问题,因为可以以正确的顺序加载值。
但是在必须颠倒顺序的小端的情况下呢?在 little endian 中,它将被加载为“9A7856”,这是错误的。
那么我们是否像这样将它存储在内存中,(即)对小端类型排序有不同的组织?例如: 在此处输入图像描述
现在我们可以将字地址位置'0'的值加载到寄存器中以进行任何进一步的操作。这是一个可能的解决方案。
但现在这意味着字节序将取决于存储单元的排列,而不是完全取决于处理器......这究竟是如何工作的?
还是字节序完全不受内存架构影响,而仅受处理器影响?那么最后是否字节序取决于处理器或内存?

4

1 回答 1

3

字节顺序实际上是一个接口问题。对于 32 位寄存器加载,一个接口要求 32 位值,而存储器接口提供一个字节数组。必须解决该接口的问题。如果它将字节数组解析为低位字节进入返回值的最高有效位,则它是大端。如果它通过将低位字节放入返回值的最低有效位来解决它,则它是小端。

所以,真正的问题是谁解决了这些接口。从技术上讲,处理器如何从内存中请求数据很重要。如果它通过说“我想要一个 32 位值”来请求它,那么具有字节数组的内存必须解析它。如果它通过说“我想要 4 个字节”来请求它,那么处理器必须在将它存储到寄存器之前解决它。

按照惯例,处理器解析这个接口。这允许内存与大端和小端处理器一起使用,因为它可以为两种类型的处理器提供相同的接口(字节数组),并让处理器以它想要的任何方式解析它。冒着简单化的风险:处理器在加载/存储单元和内存接口单元中解析它。寄存器永远不必考虑它,因为当它到达它们时,它是一个 32 位的值,已经由内存接口单元从它从内存中请求的字节数组中解析出来。

于 2013-02-23T17:21:56.007 回答