Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 使用循环递增(MARS)_Loops_Assembly_Mips_Mars Simulator - Fatal编程技术网

Loops 使用循环递增(MARS)

Loops 使用循环递增(MARS),loops,assembly,mips,mars-simulator,Loops,Assembly,Mips,Mars Simulator,因此,我在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 .wor

因此,我在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

我的代码哪里出错了

非常感谢


@罗伯特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 

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

我看到了一些潜在的问题

.text #instructions start below
虽然可执行指令确实是在
.text
之后开始的,但最好在那里定义一个名为
main:
的标签。模拟器看到了这一点,并且清楚地知道从哪里开始(至少,我认为默认情况下是这样配置的)

您在这里做一个很大的、依赖于实现的假设。最好添加指向第一个数据项的标签:

.data  # Maybe the "data segment" starts at address 0x10010000, maybe it doesn't
myData:
.word 1
.word 2
...
现在,您可以将标签的地址加载到$s1中。下面的代码实际上是一个伪操作码,编译器将其扩展为
lui
addi

la $s0, myData
编译器可能会给出您开始时使用的确切代码,指向地址0x10010000。。。但你最好让编译器来做决定

最后,还有一个问题,你为什么要在这里做日航:

jal increment       # call loop procedure
increment:
除非为了清楚起见省略了一些代码,否则您将跳转并链接到下一个地址。那没有多大意义。调用子例程时只需使用
jal
。通过执行
j$ra
,子例程将返回到
jal
之后的行

哦,是的,还有你的教授想要你使用的无限循环。真奇怪。
syscall
10有什么问题

li  $v0, 10 # terminate execution
syscall

我的讲师告诉我,用无限循环结束程序是在MIPS中结束程序的一种方法,上面是我们被告知要使用的约定。我应该在程序中的其他地方使用“无限”吗?@DigiSweep:尽管这可能有效,但这是个坏主意。只需使用exit系统调用。我想是
syscall 10
。请看下面的答案:您从未从数组中加载值(如
lw
)或将其存储回(如
sw
)。不太好。我是否应该将$s0中的值加载到临时寄存器中,将2添加到临时寄存器中,然后将其存储回$s0?我怎样才能找到下一个地址。。下一个词?,嘿。谢谢你的回答。然而,我仍然在这方面遇到问题。我已将我的原始问题如上所述进行了编辑。我的数组在$s0中递增2。但是我如何判断数组元素何时等于0呢?我需要另一个寄存器吗?您的代码
beq$s0,$zero,否则
正在检查
$s0
是否包含值zero。那不会发生。它包含一个地址(如0x10010000)。如果您正在检查地址的内容是否为零,那么是的,您需要使用另一个寄存器。你需要做一些类似于
lw$t0,0($s0)
,然后
beq$t0,$zero,或者
li  $v0, 10 # terminate execution
syscall