Assembly 在x86体系结构中,Little Endian是字节顺序还是位顺序?
标题说明了一切。我想知道当x86指令从内存中读取数据时,它是将字节还是位转换为小端顺序。例如,如果我们在地址“0”(二进制)处有以下数据(此处以原始格式,顺序写入): 00110010 01010100 如果我这样读的话:Assembly 在x86体系结构中,Little Endian是字节顺序还是位顺序?,assembly,x86,cpu,endianness,Assembly,X86,Cpu,Endianness,标题说明了一切。我想知道当x86指令从内存中读取数据时,它是将字节还是位转换为小端顺序。例如,如果我们在地址“0”(二进制)处有以下数据(此处以原始格式,顺序写入): 00110010 01010100 如果我这样读的话: mov ax, word [0] “ax”将包含什么-“01010100 00110010”或“00101010 01001100”?或转换为十进制的无符号整数(假设x86 intiger指令将寄存器顺序二进制数据解释为大端二进制数,与阿拉伯数字写入相同的端),即“2155
mov ax, word [0]
“ax”将包含什么-“01010100 00110010”或“00101010 01001100”?或转换为十进制的无符号整数(假设x86 intiger指令将寄存器顺序二进制数据解释为大端二进制数,与阿拉伯数字写入相同的端),即“21554”或“10828”
x86是little endian。
在存储器中数据结构的图示中,较小的地址出现在图的底部;地址向顶部增加。位位置从右向左编号。设定位的数值等于提升到位位置幂的2。IA-32处理器是“小端”机器;这意味着
字从最低有效字节开始编号。图1-1说明了这些约定
术语endian和endianness是指当组成数据字的字节存储在计算机内存中时,用于解释这些字节的约定。在计算中,内存通常通过将二进制数据组织成称为字节的8位单元来存储二进制数据。当读取或写入由多个这样的单元组成的数据字时,存储在存储器中的字节顺序决定了数据字的解释
内存中的每个数据字节都有自己的地址。Big-endian系统将字的最高有效字节存储在最小地址中,最低有效字节存储在最大地址中(另请参见最高有效位)。相反,Little endian系统将最低有效字节存储在最小地址中
右边的插图显示了一个使用数据字“0A 0B 0C 0D”(使用从左到右的位置十六进制表示法写出的一组4字节)和地址为a、a+1、a+2和a+3的四个内存位置的示例;然后,在big-endian系统中,字节0A存储在a中,字节0B存储在a+1中,字节0C存储在a+2中,字节0D存储在a+3中。在little endian系统中,顺序相反,存储在内存地址a中的是0D,存储在a+1中的是0C,存储在a+2中的是0B,存储在a+3中的是0A
因此,正如您所看到的,endianness总是关于字节而不是位的顺序。二进制有点乏味,所以我将其转换为十六进制;希望没问题 在本例中,您的问题的答案是您将得到21554(十进制) 以下是你如何自己确定这一点 首先,用
eq$
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
)
在这里,您将看到前两个字节是:3254
(这些是十六进制,几乎每个人都使用十六进制)
进入mov
指令
您将看到,AX
随后将包含5432
(十六进制,即十进制21554)好的,endianness从来不是位顺序,它始终是字节顺序,无论对于哪个处理器
最低位始终被认为位于整数值的“右”端,最高位始终位于整数值的“左”端(可以是1、2、4或8字节的值),因此“右”的移位或旋转始终朝向最低位,而“左”的移位或旋转始终朝向最高位。这与endianness无关
x86是little endian,这意味着最低字节排在第一位(即在最低地址)。这意味着按该顺序排列的字节
0x01
、0x02
、0x03
和0x04
,可以被视为32位值0x04030201
,0x0201
和0x0403
的两个16位值或4个单字节(假设字节是八位字节,即8位值——有些系统中字节有其他位大小,但x86没有).endianness通常处于多字节级别。您不必担心单个字节中的位顺序。处理器读取和写入这些位,顺序从来都不重要。虽然他们无法就鸡蛋的哪一侧最重要达成一致,但程序员通常会将最重要的位写入左边。-1表示零储备拱努力shown@xmojmr-我认为这对经验不足的人来说是一个公平的问题。据我所知,只有在同时查看寄存器和内存时,他才会看到endian ness的效果。他可能不知道如何做到这一点。@jww我认为这个问题显示了零研究努力(尽管它可能有用)。谷歌:“x86 endian”给我第一个链接,上面写着“…英特尔x86和x86-64系列处理器使用little-endian格式,因此,little-endian格式也称为英特尔公约…”。显示研究成果(也是由经验较少的人进行的)列为第一点(“搜索和研究”)这是一个很好的图形,但你没有回答他的问题。这是又一次:“在x86体系结构中,Little Endian是字节顺序还是位顺序?”。这是一个很好的答案,但你没有回答他的问题。这是又一次:“Little Endian在x86体系结构中是字节顺序还是位顺序?”@jww“…你没有回答他的问题。这是又一次:…”我必须做得更好,因为这是我在原始帖子中读到的,“……ax’将包含……十进制--“21554”或“10828”…”相关:向量字节移位(pslldq
)和元素索引(pshufd
/shufps
/pblend
)处理向量寄存器的方法与位移位处理整数寄存器中的位的方法相同。