关于MIPS lb和sb以及字节序

时间:2018-11-27 22:31:51

标签: mips endianness

我刚刚在this answer - Loading and storing bytes in MIPS中阅读了@Cheshar的评论。

  1. 这是我关于他的第一点的理由:$t0中的值应为0xFFFFFF90(即,用符号扩展),但这不会改变{{1} }(我认为这是指从mem(4)开始的单词),现在仍然是0x04。我说得对吗?

    但是我不确定他的第二点:

      

    [“] FFFF90FFlb不在乎字节序。[。”]

  2. 我在想为什么 从大端到小端的变化是

    sb

    所以似乎单个字节仍像大字节序一样被读取?

1 个答案:

答案 0 :(得分:2)

lb/sb不在乎对疾病的抵抗力。 单个字节没有字节序。

仅当存储大/小尾数[(例如4字节)]编号,然后尝试逐字节访问它时,才有意义。

字节的偏移量发生变化,因此更好的图可能是:

byte:  0   1   2   3   ----\   0   1   2   3
      00  90  12  A0   ----/  A0  12  90  00

如果$t1指向您存储的整数,则执行以下操作:

lb  $t0,1($t1)

对于小端,您将获得90;对于大端,您将获得12


更新:

  

我赞成您的回答,因为它很干净。但是您以前不认为这是反直观的吗?因为在小尾数法中,从左向右或从右向左一起读取32位整数时,32位整数没有意义...?

一旦数据位于寄存器中(通过lw),我们就会以大字节序(即左移1乘以2)的方式可视化并对其进行操作。

十进制值123是“ big endian”(一百+二十+三)。

当我们从内存中获取或存储到内存时,小尾数仅是字节顺序。硬件将根据需要重新排列字节。

little endian的优点是,它对于较大的多精度数(例如libgmp)更有效。

而且,当英特尔首次推出8位8080处理器(仅具有单字节内存总线)时,小字节序使事情变得更快。例如,当执行add时,在获取偏移量为0的LSB之后,它可以与获取偏移量为1的MSB并行添加两个LSB字节。

  

举个例子:8位(无符号)整数b00100001是33(十进制),但是具有小的字节序,它存储为b00010010,当从从左到右读取时,它是18(十进制)。 >,以及b01001000,即从从右向左逐位读取时为64 + 8 = 72(十进制)。

虽然[em] 可能使[理论]计算机体系结构像您描述的那样运行,但[我所知道的]现代计算机体系结构却没有。部分原因是要做到这一点需要更复杂的电路。

但是,我曾经编写了一个多精度数学程序包,其中 did 使用小字节序字节 字节内的小字节序位。但是,它。有时对于大位向量(例如500,000位宽)很有用

  

或者我的想法是完全错误的,因为计算机只能将字节视为基础位的抽象。

字节中 bits 的字节序相同(大字节序),而不管字节是在寄存器中还是在存储单元中。

不同的字节序仅适用于多字节整数(例如,在C,intshort中)。