Mips 扩展/缩小数据时的Endianness
在使用MIPS几个月后,我再次阅读了有关endianess的文章。当它来临时,我有点困惑 当从内存加载/存储到内存时,有人能验证我的理解是否正确吗?我没有一台Big-Endian机器来测试它,并且由于某种原因无法让qemu工作Mips 扩展/缩小数据时的Endianness,mips,cpu,cpu-architecture,endianness,Mips,Cpu,Cpu Architecture,Endianness,在使用MIPS几个月后,我再次阅读了有关endianess的文章。当它来临时,我有点困惑 当从内存加载/存储到内存时,有人能验证我的理解是否正确吗?我没有一台Big-Endian机器来测试它,并且由于某种原因无法让qemu工作 Example 1: lw $t0,word_ word_: .word 0xAABBCCDD // behaves the same in both Endian and Little Endian Example 2: lw $
Example 1:
lw $t0,word_
word_: .word 0xAABBCCDD // behaves the same in both Endian and Little Endian
Example 2:
lw $t0,bytearr_
bytearr_ : .byte 0xAB, 0xCD, 0xEF, 0xAA // either 0xABCDEFAA on BE or 0xAAEFCDAB on LE (?)
Example 3:
lhw $t0,b2hw
b2hw : .byte 0xAB, 0xCD //can this lead to issues as well? (LE is 0xCDAB, BE is 0xABCD)
如果我错了,或者我错过了任何可能从一端到另一端出错的潜在转换,请纠正我。谢谢
编辑:
如果我试图将一个单词加载到一个半单词中,或者将一个半单词加载到一个单词中,在LE/BE的情况下会发生什么?例如,
lw$t0,hw
wherehw:.half 0xABCD
和lhw$t0,w
wherew:.word 0xAABBCCDD
在示例1中,汇编程序负责如何在内存中排列单词
如果体系结构为小端,则最低地址将保存0xDD
,然后保存0xCC
,然后保存0xBB
,然后保存0xAA
如果体系结构是big-endian,则相反:首先是0xAA
,然后是0xBB
,然后是0xCC
,然后是0xDD
。
因此,当您发出lw$t0时,word
会得到您期望的值(0xAABBCCDD
)
在第二个示例中,您定义了一个字节数组,因此汇编程序必须遵守您的顺序。最低地址将保存0xAB
,然后保存0xCD
,然后保存0xEF
,然后保存0xAA
因此,当您发布lw$t0时,无论您的体系结构是小端还是大端,您都会得到不同的结果
如果您的体系结构是小端的,那么您将得到$t0=0xAAEFCDAB
;如果您的体系结构是大端的,那么您将得到$t0=0xABCDEFAA
第三个例子与第二个相似。您定义了一个字节数组,因此最低地址将容纳0xAB
,然后0xCD
,如果体系结构是小尾端,则发出lhw$t0,b2hw
将以$t0=0xCDAB
结束,如果体系结构是大尾端
如果希望让汇编器管理排列,则可以使用指令.half
,如下所示:
lhw $t0,b2hw
b2hw : .half 0xABCD //let the assembler figure out how to arrange this half word in memory
你的最后一个问题是,当你“试图将一个单词加载到一个半单词中,或者将一个半单词加载到一个单词中”时会发生什么
答案是,你真的不会把一个词装入半个词,也不会把半个词装入一个词。加载一个单词或半单词,从某个地址开始。
因此,如果您有以下示例:
hw_: .half 0xABCD
w_: .word 0xAABBCCDD
此代码:
lw $t0, hw_
将加载一个从hw\uw
指向的地址开始的单词,并且
lhw $t0, w_
将加载从h\u
指向的地址开始的半个字。
内存中的排列(从较小的地址到较大的地址):
如果是小endian:
0xCD ; hw_
0xAB
0xDD ; w_
0xCC
0xBB
0xAA
因此,如果您发行lw$t0,hw
您将获得0xCCDDABCD
,而使用lhw$t0,w
您将获得0xCCDD
如果是big endian:
0xAB ; hw_
0xCD
0xAA ; w_
0xBB
0xCC
0xDD
所以如果你发行lw$t0,hw
你会得到0xABCDAABB
,如果发行lhw$t0,你会得到0xAABB
,我有点困惑。在最后两个例子中,LE和BE不应该是对立的吗?例如,在第二个问题中,0xAB
位于最低地址,因此在LE中,它不应该是最低有效字节吗?还有最后一个(或两个)问题。如果我试图将一个单词加载到一个半单词中,或者将一个半单词加载到一个单词中,在LE/BE的情况下会发生什么?例如,lw$t0,hw_
wherehw:.half 0xABCD
和lhw$t0,w_
wherew:.word 0xAABBCCDD
@pol:你真的没有把一个单词装入半字,也没有把半字装入一个单词。你加载一个单词或半个单词,从某个地址开始。对不起,我的措辞不好。我是指我在编辑中写的东西。这不也取决于endianness吗?非常感谢你的跟进,把一切都搞定了。总而言之,从一种类型转换到另一种类型通常是有风险的,因为从一个端点转换到下一个端点很可能会产生不同的结果。FWIW,通常是加宽和缩小指的是其他内容:将已经是字节的内容转换为字或将字转换为字节。