Mips 确定寄存器的值
所以我有一个“little endian”MIPS程序:Mips 确定寄存器的值,mips,Mips,所以我有一个“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,但我不知道为什么。你能给我解释一下吗?谢谢(抱歉我的英语不好)总之,最重要的是要注意有两条“加载字节”指令: lbu[无符号形式],它将
.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,但我不知道为什么。你能给我解释一下吗?谢谢(抱歉我的英语不好)总之,最重要的是要注意有两条“加载字节”指令:
lbu
[无符号形式],它将一个字节加载到寄存器的低8位并“零扩展”(用零填充剩余字节)lb
[有符号形式]将一个字节加载到寄存器的低8位并“符号扩展”(用加载字节的最高有效位填充剩余字节)(即fill_byte=(fetch_byte&0x80)?0xFF:0x00
这是数据数组的展开视图。所有数据行的值相同,但透视图不同。请注意,在转换为十六进制字之后,十六进制字节模式是little endian,因此字节顺序相反。因此,在执行字节操作时,我们应该引用字节行并应用我们需要的任何偏移量:
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
的描述总体而言,最重要的是要注意有两条“加载字节”指令:
lbu
[无符号形式],它将一个字节加载到寄存器的低8位并“零扩展”(用零填充剩余字节)lb
[有符号形式]将一个字节加载到寄存器的低8位并“符号扩展”(用加载字节的最高有效位填充剩余字节)(即fill_byte=(fetch_byte&0x80)?0xFF:0x00
这是数据数组的展开视图。所有数据行的值相同,但透视图不同。请注意,在转换为十六进制字之后,十六进制字节模式是little endian,因此字节顺序相反。因此,在执行字节操作时,我们应该引用字节行并应用我们需要的任何偏移量:
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
的描述,如果你能说出你认为应该是什么以及为什么,这可能会有所帮助。这样,我们就能更好地了解你到底遇到了什么问题,并能给你一个更好的答案。如果你能说出你认为他们应该是什么,以及为什么,这可能会有所帮助。这样,我们就可以更好地了解您到底遇到了什么问题,并为您提供更好的答案。