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 に答える