关于MIPS lb和sb以及endianness

关于MIPS lb和sb以及endianness,mips,endianness,Mips,Endianness,我刚刚读到了@Cheshar的评论 这是我关于他的第一点的推理:$t0中的值应该是0xFFFFFF90(即它的符号扩展),但这不会改变mem(4)的结果(我认为这意味着读取从0x04开始的单词),它仍然是FFFF90FF。我说得对吗 但我不确定他的第二点: [“]lb和sb不在乎结尾。[.] 我在想为什么 从大端到小端的变化是 byte: 0 1 2 3 ----\ 3 2 1 0 00 90 12 A0 ----/ 00 90 1

我刚刚读到了@Cheshar的评论

  • 这是我关于他的第一点的推理:
    $t0
    中的值应该是
    0xFFFFFF90
    (即它的符号扩展),但这不会改变
    mem(4)
    的结果(我认为这意味着读取从
    0x04
    开始的单词),它仍然是
    FFFF90FF
    。我说得对吗

    但我不确定他的第二点:

    [“]
    lb
    sb
    不在乎结尾。[.]

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

    byte:  0   1   2   3   ----\   3   2   1   0
          00  90  12  A0   ----/  00  90  12  A0
    
    所以看起来单个字节的读取方式仍然像big-endian

  • lb/sb
    不在乎是否持久。一个字节没有尾数

    只有当您存储一个大/小的endian[(例如)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


    更新:


    我赞成你的答案,因为它是干净的。但你以前不认为这是违反直觉的吗?因为在little endian中,当从左到右或从右到左一起读取32位时,32位整数没有意义

    一旦数据进入寄存器(通过
    lw
    ),我们将其视为big-endian并对其进行操作(即,左移1等于乘以2)

    十进制值
    123
    为“大端”(一百+二十+三)

    Little endian只是我们从内存中获取或存储到内存中时的字节顺序。硬件将根据需要洗牌字节

    little-endian的优点是,它更适用于大的多精度数字(例如,
    libgmp

    而且,当英特尔首次推出8位8080处理器(只有一个单字节内存总线)时,little endian使速度更快。例如,在执行添加操作时,在获取偏移量0处的LSB后,可以在获取偏移量1处的MSB的同时添加两个LSB字节

    举一个例子:8位(无符号)整数b00100001是33(十进制),但有小尾数,它被逐位存储为b00010010,从从左到右读取时是18(十进制),从从右到左读取时是64+8=72(十进制)

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

    然而,我曾经写过一个多精度数学包,它确实使用了小端字节和字节中的小端字节。但是,它很慢。这有时适用于大位向量(例如500000位宽)

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

    一个字节中的位的尾数是相同的(big-endian),不管该字节是在寄存器中还是在内存单元中

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

    lb/sb
    不关心尾数。一个字节没有尾数

    只有当您存储一个大/小的endian[(例如)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


    更新:


    我赞成你的答案,因为它是干净的。但你以前不认为这是违反直觉的吗?因为在little endian中,当从左到右或从右到左一起读取32位时,32位整数没有意义

    一旦数据进入寄存器(通过
    lw
    ),我们将其视为big-endian并对其进行操作(即,左移1等于乘以2)

    十进制值
    123
    为“大端”(一百+二十+三)

    Little endian只是我们从内存中获取或存储到内存中时的字节顺序。硬件将根据需要洗牌字节

    little-endian的优点是,它更适用于大的多精度数字(例如,
    libgmp

    而且,当英特尔首次推出8位8080处理器(只有一个单字节内存总线)时,little endian使速度更快。例如,在执行添加操作时,在获取偏移量0处的LSB后,可以在获取偏移量1处的MSB的同时添加两个LSB字节

    举一个例子:8位(无符号)整数b00100001是33(十进制),但有小尾数,它被逐位存储为b00010010,从从左到右读取时是18(十进制),从从右到左读取时是64+8=72(十进制)

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

    然而,我曾经写过一个多精度数学包,它确实使用了小端字节和字节中的小端字节。但是,它很慢。这有时适用于大位向量(例如500000位宽)

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

    一个字节中的位的尾数是相同的(big-endian),不管该字节是在寄存器中还是在内存单元中


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

    我希望当我从地址0x101加载一个字节时,我会得到地址处的字节