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 中,int 或 short)。