Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在x86体系结构中,Little Endian是字节顺序还是位顺序?_Assembly_X86_Cpu_Endianness - Fatal编程技术网

Assembly 在x86体系结构中,Little Endian是字节顺序还是位顺序?

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

标题说明了一切。我想知道当x86指令从内存中读取数据时,它是将字节还是位转换为小端顺序。例如,如果我们在地址“0”(二进制)处有以下数据(此处以原始格式,顺序写入):

00110010 01010100

如果我这样读的话:

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
)处理向量寄存器的方法与位移位处理整数寄存器中的位的方法相同。