Little-Endian在x86架构中是字节还是位顺序?

AnA*_*ons 3 cpu x86 assembly

标题说明了一切.我想知道x86指令何时从内存中读取数据是否会将其字节或其位转换为Little-Endian顺序.例如,如果我们在地址"0"(二进制)中有以下数据(以RAW格式写入,则为sequental):

00110010 01010100

如果我按以下方式阅读:

mov ax, word [0]
Run Code Online (Sandbox Code Playgroud)

'ax'包含什么 - "01010100 00110010"或"00101010 01001100"?或者转换为无符号整数(假设x86 intiger指令将寄存器顺序二进制数据解释为Big-Endian二进制数,与阿拉伯数字相同的字节写入)十进制 - "21554"或"10828"?

Rus*_*mov 11

1.3.1位和字节顺序 x86是little-endian.在存储器中的数据结构的图示中,较小的地址出现在图的底部; 地址增加到顶部.位位置从右到左编号.设定位的数值等于2,增加到位位置的功率.IA-32处理器是"小端"机器; 这意味着字的字节从最低有效字节开始编号.图1-1说明了这些约定.

在此输入图像描述

术语字节序和字节序是指当这些字节存储在计算机存储器中时用于解释构成数据字的字节的约定.在计算中,内存通常通过将二进制数据组织成称为字节的8位单元来存储二进制数据.当读取或写入由多个这样的单元组成的数据字时,存储在存储器中的字节的顺序决定了数据字的解释.

内存中的每个数据字节都有自己的地址.Big-endian系统将字的最高有效字节存储在最小地址中,最低有效字节存储在最大地址中(也见最高有效位).相反,小端系统将最低有效字节存储在最小地址中.

右图显示了使用数据字"0A 0B 0C 0D"(使用从左到右位置,十六进制表示法写出的4个字节的集合)和地址为a,a + 1的4个存储单元的示例, a + 2和a + 3; 然后,在大端系统中,字节0A存储在a,0B中的+ 1,0C中的+ 2和0D中的+ 3中.在小端的系统中,顺序被颠倒以0D存储在存储器地址的,0℃在+ 1,0B在+ 2,0A在+ 3.

在此输入图像描述 在此输入图像描述

所以,你可以看到字节序总是关于字节顺序而不是位.


Rud*_*uis 7

AFAIK,字节顺序永远不会有点顺序,它总是一个字节顺序,无论哪个处理器.

最低位始终被认为是在"右"侧而最高位在积分值的"左"侧(是1,2,4或8字节值),因此移位或旋转到"对"始终朝向最低位,向左"始终朝向最高位.这与字节顺序无关.

x86是小端,意味着最低字节首先出现(即在最低地址).这意味着,字节0x01,0x02,0x030x04以该顺序,可以同样好地看作32位值0x04030201,2个16位的值0x02010x04034个单字节(假设字节或八位字节,即8比特值-有字节有其他位大小但不是x86的系统.

  • 相关:向量字节移位(`pslldq`)和元素索引(`pshufd`/`shufps`/`pblend`...)处理向量寄存器的方式与位移处理整数寄存器中的位的方式相同。因此,在注释中,最好(但更难输入)使用诸如 `// [ dcba ]` 之类的符号来跟踪哪些元素在哪里。这就是为什么 `_mm_set_epi32(d, c, b, a);` 的参数与 `int arr = {a, b, c, d};` 的顺序相反 (3认同)
  • 顺便说一句,位顺序字节序有时确实很重要,但 x86 arch 没有可以让您观察它的硬件,因为它没有任何比字节窄的总线。 (3认同)