确定寄存器

时间:2016-10-03 18:38:41

标签: 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,但我不知道为什么。你能解释一下吗?谢谢(抱歉我的英语不好)

1 个答案:

答案 0 :(得分:0)

总的来说,最重要的是要注意有两个"加载字节"指令:

  1. lbu [无符号形式]将一个字节加载到寄存器的低8位,并且"零扩展" (用零填充剩余字节)
  2. lb [签名表单]将一个字节加载到寄存器的低8位,"符号扩展" (用加载字节的最高有效位填充剩余字节)(即)fill_byte = (fetch_byte & 0x80) ? 0xFF : 0x00
  3. 这是数据数组的扩展视图。所有数据行都是相同的值,但具有不同的视角。请注意,转换为十六进制后,十六进制字节模式为小端,因此字节的顺序相反。因此,在进行字节操作时,我们应该引用 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
    

    在此之后,$100x000000FE,小数为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

    的说明