1

因此,我目前在 MIPS 中有一项任务。我的任务也是:

1) 编写一个从数组的第一个元素开始的循环 2) 然后依次将每个元素加 1 并将结果存储回数组 3) 如果遇到零,则退出程序

这是我已经拥有的:

.data  #by default, the "data segment" starts at address 0x10010000
.word 1
.word 2
.word 3
.word 4
.word 5
.word 6
.word 7
.word 8
.word 9
.word 0

.text #instructions start below
lui $s0, 0x1001     # $s0 holds base address of the array
addi $s1, $zero, 0  # $s1 holds the index of the array
jal increment       # call loop procedure

increment:
beq $s0, $zero, Exit    # if $s0 value is zero, branch and go to else
addi $s0, $s0, 1    # adds 1 to each element
addi $s1, $s1, 1    # i = i + 1

j increment     # jump back to loop

Exit:
infinite: j infinite 

我运行它时遇到的问题是它一直在运行。而且我知道第 10 个单词 (.word0) 包含值 0。

我的代码哪里出错了?

非常感谢


@Robert B,这就是我现在所拥有的:

main: #instructions start below
la $s0, myData      # $s0 holds base address of the array
addi $s1, $zero, 0  # $s1 holds the index of the array

loop:
beq $s0, $zero, else    # if $s0 value is zero, branch and go to else
addi $s0, $s0, 2    # adds 2 to each element
addi $s1, $s1, 1    # i = i + 1

j loop      # call loop procedure

else:
addi $v0, $zero, 10     # terminate execution
syscall 
4

2 回答 2

0

无限跳转到自身至少是问题的一部分。

于 2014-02-07T17:24:21.620 回答
0

I see a few potential issues.

.text #instructions start below

While it's true that the executable instructions start after .text, it would be a good idea to define a label called main: there. The emulators see that and know unambiguously where to start (at least, I think that's how they're configured by default.)

lui $s0, 0x1001     # $s0 holds base address of the array
addi $s1, $zero, 0  # $s1 holds the index of the array

You're making a big, implementation-dependent assumption here. It's a better idea to add a label that points to your first data item:

.data  # Maybe the "data segment" starts at address 0x10010000, maybe it doesn't
myData:
.word 1
.word 2
...

Now, you can load the address of the label into $s1. The code below is actually a pseudo-opcode that will be expanded into a lui and an addi by the compiler.

la $s0, myData

The compiler will probably come up with the exact code that you started out with, pointing to address 0x10010000... but you're better off letting the compiler make that decision.

Finally, there's the question of why you do a jal here:

jal increment       # call loop procedure
increment:

Unless you've omitted some code for clarity, you're jump-and-linking to the next address. That doesn't make a lot of sense. You only need to use jal when you're calling a subroutine. The subroutine will return to the line after jal by doing a j $ra.

Oh yeah, and there's the infinite loop that your prof wants you to use. That's just strange. What's wrong with a syscall 10?

li  $v0, 10 # terminate execution
syscall
于 2014-02-08T00:14:05.580 回答