【问题标题】:About MIPS lb and sb and endianness关于 MIPS lb and sb 和 endianness
【发布时间】:2018-11-27 22:31:51
【问题描述】:

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

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

    但我不确定他的第二点:

    ["] lbsb 不关心字节顺序。[."]

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

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

    所以看起来单个字节仍然像大端一样读取?

【问题讨论】:

  • 我希望当我从地址 0x101 加载一个字节时,我得到的是地址 0x101 而不是其他地址的字节。

标签: mips endianness


【解决方案1】:

lb/sb关心字节序。 单个字节没有字节序。

只有当你存储一个大/小端[(例如)4字节]数字然后尝试逐字节访问它时才重要。

byte 偏移量不会 改变,因此更好的图表可能是:

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),我们将其可视化为大端并对其进行操作(即左移 1 是乘以 2)。

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

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

little endian 的优势在于它更适用于大型多精度数字(例如libgmp)。

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

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

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

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

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

一个字节中bits的字节序是相同的(大端序),不管字节是在寄存器中还是在内存单元中。

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

【讨论】:

  • 我赞成你的回答,因为它很干净。但是你以前不认为这是违反直觉的吗?由于在 little endian 中,当从左到右或从右到左逐位读取 32 位时,32 位整数没有任何意义......?
  • 举个例子:8位(无符号)整数b0010000133(十进制),但小端存储为b00010010,即18(十进制) ) 当从右到左读取时,b01001000,当从右到左读取时是64+8=72(十进制),逐位。或者我的想法是完全错误的,因为计算机只能将字节视为底层位的抽象。
  • 非常感谢!哇,我只是注意到你更新了答案......当答案更新时,这个网站没有做任何事情......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多