字节顺序取决于处理器还是内存?

问题描述 投票:0回答:1

Endianess 决定字中字节的顺序。让我们考虑以下几点
记忆系统:

enter image description here

所以这是一个字节可寻址的 32 位内存。 如果我将十六进制值

'val = 0x56789A'
移动到字地址为 0 的内存位置,对于大尾数法来说,它将如下所示:
enter image description here
对于小端来说是这样的:
enter image description here

但我们知道在寄存器中,值本身存储为“56789A”,因此如果我们有大端字节序,那么这没有问题,因为可以按正确的顺序加载值。
但如果是小尾数法,则必须颠倒顺序呢?在小尾数中,它将被加载为“9A7856”,这是错误的。
那么我们是否像这样将其存储在内存中,(即)对小端类型排序有不同的组织?例如 : enter image description here
现在我们可以将字地址位置“0”处的值加载到寄存器中以进行进一步的操作。 这是一个可能的解决方案。
但现在这意味着字节顺序将取决于内存单元的排列,而不完全取决于处理器……这到底是如何工作的?
或者字节序根本不受内存架构影响,而仅受处理器影响?最后,字节顺序取决于处理器还是内存?

memory language-agnostic hardware endianness cpu-architecture
1个回答
6
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.