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[无符号形式],它将

所以我有一个“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
    [无符号形式],它将一个字节加载到寄存器的低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
    的描述,如果你能说出你认为应该是什么以及为什么,这可能会有所帮助。这样,我们就能更好地了解你到底遇到了什么问题,并能给你一个更好的答案。如果你能说出你认为他们应该是什么,以及为什么,这可能会有所帮助。这样,我们就可以更好地了解您到底遇到了什么问题,并为您提供更好的答案。