簡體   English   中英

解碼BNE MIPS指令

[英]Decoding BNE MIPS Instruction

我在MARS模擬器中運行以下MIPS代碼:

add $t0, $zero, $zero        # i = 0
        add $t4, $zero, $zero        # initialize the sum to zero
        add $t5, $zero, $zero        # initialize temporary register to zero

        la $a0, array                 # load address of array
        la $a1, array_size            # load address of array_size
        lw $a1, 0($a1)                # load value of array_size variable

loop:
        sll  $t1, $t0, 2              # t1 = (i * 4)
        add $t2, $a0, $t1             # t2 contains address of array[i]
        sw $t0, 0($t2)                # array[i] = i

        addi $t0, $t0, 1              # i = i+1
        add $t4, $t4, $t0             # sum($t4) = ($t4 + array[i])

        slt $t3, $t0, $a1             # $t3 = ( i < array_size)
        bne $t3, $zero, loop          # if ( i < array_size ) then loop

        add $t5, $a0, $zero           # save contents of $a0 in temporary reg $t5
        nop                           # done.

在機器代碼中, bne指令如下: 00010101011000001111111111111001 在這種情況下,立即數是: 1111111111111001 ,等於: 0xFFF9 MIPS將采用該方法,將其向左移2(乘以4)並將其程序計數器移至該數字。 但是, 0xFFF9乘以4就是0x3FFE4 那怎么可能? SLL處的程序計數器應為0x18而不是0x3FFE4 我在這里想念什么?

謝謝,

這里有兩件事要注意:

  1. 立即數以2的補數表示; 由於符號位為1,因此為負值
  2. 在MIPS上,分支的目標表示為偏移量(該值的平方乘以負值,因為循環位於bne之前)。 該值乘以4 b / c,指令的大小均為4個字節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM