总体而言,需要注意的最重要的事情是,有两个“负载字节”的说明:
lbu
[中无符号形式]它加载一个字节到寄存器的低8位和“零扩展”(用零填充剩余的字节)
lb
[签署的形式],它将一个字节加载到寄存器的低8位和“符号扩展”(填充剩余的字节与加载字节的最高有效位)(即)fill_byte = (fetch_byte & 0x80) ? 0xFF : 0x00
这里是数据阵列的放大图。所有数据行都是相同的值,但有不同的视角。请注意,在转换为十六进制字后,十六进制字节模式为小端,所以字节顺序相反。所以,在做字节操作时,我们应该引用字节线,并应用任何偏移,我们需要:
offset 0 4 8 12 16
dec 12 -2 45 0 0
hexw 0000000C FFFFFFFE 0000002D 00000000 00000000
byte 0C,00,00,00 FE,FF,FF,FF 2D,00,00,00 00,00,00,00 00,00,00,00
这是程序的第一步:
la $8,arr # get address of array
这里是第二步:
lb $9,2($8) # get signed byte (00) -- ignored
lbu $10,4($8) # get unsigned byte (FE) and zero extend
在此之后,$10
具有0x000000FE
,这是十进制
254
这里是第三步:现在
sw $10,12($8) # store into cell
,数据阵列已经被改变[在偏移12]:
offset 0 4 8 12 16
dec 12 -2 45 254 0
hexw 0000000C FFFFFFFE 0000002D 000000FE 00000000
byte 0C,00,00,00 FE,FF,FF,FF 2D,00,00,00 FE,00,00,00 00,00,00,00
这是最后一个st EP:
# get byte from cell (FE)
# sign extend it: FE --> FFFFFFFE
# FFFFFFFE is -2
lb $11,12($8) # get byte and _sign_ extend it
记住上面
为
lb
说明它可以帮助如果你说什么,你认为他们应该是,为什么。这样,我们就可以更好地了解您遇到的问题,并为您提供更好的答案。 – 8bittree