解码 BNE MIPS 指令
我在 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
。我在这里缺少什么?
谢谢你,
I am running the following MIPS code in MARS simulator:
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.
In machine code, the bne
instruction is the following: 00010101011000001111111111111001
. In this case, the immediate is: 1111111111111001
which equals to: 0xFFF9
. MIPS will take that, bit shift it to the left by 2 (multiplies it by 4) and takes its program counter to that number. However, 0xFFF9
multiplied by 4 is 0x3FFE4
. How is that possible? The program counter at SLL
should be 0x18 and not 0x3FFE4
. What am I missing here?
Thank you,
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这里有两点需要注意:
There are 2 things to note here: