2016-10-03 105 views
1

的价值所以我有一个“小尾数” 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

lb说明它可以帮助如果你说什么,你认为他们应该是,为什么。这样,我们就可以更好地了解您遇到的问题,并为您提供更好的答案。 – 8bittree

回答

0

总体而言,需要注意的最重要的事情是,有两个“负载字节”的说明:

  1. lbu [中无符号形式]它加载一个字节到寄存器的低8位和“零扩展”(用零填充剩余的字节)
  2. 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 

记住上面