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

时间:2014-09-19 16:41:20

标签: assembly x86 cpu

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

00110010 01010100

如果我按以下方式阅读:

mov ax, word [0]

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

3 个答案:

答案 0 :(得分:11)

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

enter image description here

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

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

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

enter image description here enter image description here

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

答案 1 :(得分:6)

AFAIK,字节顺序从不有点顺序,它总是一个字节顺序,无论哪个处理器。

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

x86是小端,意味着最低字节首先出现(即在最低地址)。这意味着按此顺序的字节0x010x020x030x04也可以被视为32位值0x04030201,两个16位值0x02010x0403或4个单字节(假设字节是八位字节,即8位值 - 存在字节具有其他位大小的系统,但不是x86)。

答案 2 :(得分:1)

Binary有点乏味,所以我把它翻译成十六进制;希望没关系。

在这种情况下,您的问题的答案是您将获得21,554(十进制)。

以下是您如何自行确定这一点......

首先,使用Equ $

将这两个字节放在内存中
Some_16_Bit_Value   Equ         $
                    Db          032h
                    Db          054h

好的,现在您的.Data细分受众群已经在.Code细分中添加了这样的内容..

        Mov         Ax, Word Ptr [Some_16_Bit_Value]        ;See what you get

汇编程序将为您生成完整的指令,就像这样......

        mov         ax,word ptr [Some_16_Bit_Value (13FE9A002h)] 

打开调试窗口并查看该内存位置(即13FE9A002h

在那里你会看到前两个字节是:32 54(那些是十六进制,这就是每个人都使用的)

进入mov指令

您会看到AX将包含5432(十六进制,这是您的小数21,554)