写入寄存器的下一个字节
Write into next byte of a register
我知道内存中的寄存器是32位的。我也明白 lb 会将内存中的内容加载到寄存器的低 8 位,如果我这样做
lb $t1, $a3
lb $t1, 4($a3)
第二个 lb 命令将覆盖第一个加载的内容。但是,有没有办法写入寄存器的第二个字节(从内存中的不同部分加载,所以两个字节不是彼此相邻)并保留第一个字节的信息?
我假设你想在这里使用的是 lbu
(加载无符号字节)而不是 lb
因为你不希望寄存器被符号扩展(例如复制字节 AA
在寄存器中将导致 000000AA
,而不是 FFFFFFAA
).
如果你想写入寄存器的第二个字节,你可以先使用lbu
将字节从内存加载到另一个寄存器,然后左移8 bits,然后 addu
到原来的寄存器。
例如:
lbu $t1, $a3 # 0x000000AA
lbu $t2, 4($a3) # 0x000000BB
sll $t2, $t2, 8 # 0x000000BB -> 0x0000BB00
addu $t1, $t1, $t2 # 0x000000AA + 0x0000BB00 = 0x0000BBAA
我知道内存中的寄存器是32位的。我也明白 lb 会将内存中的内容加载到寄存器的低 8 位,如果我这样做
lb $t1, $a3
lb $t1, 4($a3)
第二个 lb 命令将覆盖第一个加载的内容。但是,有没有办法写入寄存器的第二个字节(从内存中的不同部分加载,所以两个字节不是彼此相邻)并保留第一个字节的信息?
我假设你想在这里使用的是 lbu
(加载无符号字节)而不是 lb
因为你不希望寄存器被符号扩展(例如复制字节 AA
在寄存器中将导致 000000AA
,而不是 FFFFFFAA
).
如果你想写入寄存器的第二个字节,你可以先使用lbu
将字节从内存加载到另一个寄存器,然后左移8 bits,然后 addu
到原来的寄存器。
例如:
lbu $t1, $a3 # 0x000000AA
lbu $t2, 4($a3) # 0x000000BB
sll $t2, $t2, 8 # 0x000000BB -> 0x0000BB00
addu $t1, $t1, $t2 # 0x000000AA + 0x0000BB00 = 0x0000BBAA