Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
Mips 扩展/缩小数据时的Endianness_Mips_Cpu_Cpu Architecture_Endianness - Fatal编程技术网

Mips 扩展/缩小数据时的Endianness

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 $

在使用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 $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
where
hw:.half 0xABCD
lhw$t0,w
where
w:.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_
where
hw:.half 0xABCD
lhw$t0,w_
where
w:.word 0xAABBCCDD
@pol:你真的没有把一个单词装入半字,也没有把半字装入一个单词。你加载一个单词或半个单词,从某个地址开始。对不起,我的措辞不好。我是指我在编辑中写的东西。这不也取决于endianness吗?非常感谢你的跟进,把一切都搞定了。总而言之,从一种类型转换到另一种类型通常是有风险的,因为从一个端点转换到下一个端点很可能会产生不同的结果。FWIW,通常是加宽和缩小指的是其他内容:将已经是字节的内容转换为字或将字转换为字节。