所以我有一个" little-endian" MIPS计划:
.data
arr: .word 12, -2, 45, 0, 0
.text
la $8,arr
lb $9,2($8)
lbu $10,4($8)
sw $10,12($8)
lb $11,12($8)
问题是要确定$10
和$11
的值。答案是254和-2,但我不知道为什么。你能解释一下吗?谢谢(抱歉我的英语不好)
答案 0 :(得分:0)
总的来说,最重要的是要注意有两个"加载字节"指令:
lbu
[无符号形式]将一个字节加载到寄存器的低8位,并且"零扩展" (用零填充剩余字节)lb
[签名表单]将一个字节加载到寄存器的低8位,"符号扩展" (用加载字节的最高有效位填充剩余字节)(即)fill_byte = (fetch_byte & 0x80) ? 0xFF : 0x00
这是数据数组的扩展视图。所有数据行都是相同的值,但具有不同的视角。请注意,转换为十六进制字后,十六进制字节模式为小端,因此字节的顺序相反。因此,在进行字节操作时,我们应该引用 byte 行并应用我们需要的任何偏移量:
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
以下是最后一步:
# get byte from cell (FE)
# sign extend it: FE --> FFFFFFFE
# FFFFFFFE is -2
lb $11,12($8) # get byte and _sign_ extend it
请记住上面lb