循环遍历数组 MIPS 程序集

Posted

技术标签:

【中文标题】循环遍历数组 MIPS 程序集【英文标题】:Loop through an array MIPS Assembly 【发布时间】:2013-02-01 17:25:06 【问题描述】:

我正在开发一个循环遍历 10 个数字的数组的程序。前 9 个元素的值大于 0,第 10 个元素的值为 0。遇到 0 时循环应该中断。

i=0;
while(A[i]!=0)

    A[i]=A[i]+1;
    i++;

我知道如果寄存器的值等于 0,我可以使用 'beq' 来中断循环。但是我对在内存中操作值知之甚少。

这是我第一次使用 MIPS,你会发现它一团糟。如果你不能帮我解决它,你能给我一些指点吗?

.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

# MIPS assembly code

lui  $a0, 0x1001           # $a0 = 0x10010000
addi $a1, $zero, 0         # i = 0
jal increment              # call the procedure

这是我最迷茫的地方:

increment:
lui $a0, 0x1001           # $a0 = 0x10010000
beq $a0, $zero, else      # if $a0 holds 0 goto 'else'
addi $a0, $a0, 2          # +2
addi $a1, $zero, 1        # i = i + 1

jr $ra                   #jump to caller

$v0 应该包含所有递增值的总和。

else: 
add $a0, $v0, $zero #copy result as input to syscall
addi $v0,$zero,1 #service 1 for syscall is print integer
syscall

以无限循环结束。

infinite: j infinite

【问题讨论】:

你说 $v0 应该保存所有递增值的总和,但这不是 C 代码所做的。它将数组中的所有值加 1。你想要哪个? 它们都是真的,循环将值递增 1,而 $v0 则存储所有递增值的总和。因此,如果它可以工作,也许我可以在向 $v0 添加 1 后将新值添加到循环中。 【参考方案1】:

要从内存中加载值,您需要调用加载指令之一(lwlhlb 用于字、半字和字节)。例如:

lw $a1, 0($a2) # load a word from the address in $a2 + offset 0 to $a1

要在内存中写入值,请使用其中一个存储命令,例如:

sw $a1, 0($a2) # store the word in $a1 into the address in $a2 + offset

例如,使用 la 将地址加载到寄存器中

la $a2, label_of_array # load the address of the label 'label_of_array' into $a2

现在,要操作数组中的值,您需要结合上面的三个指令:

la $a1, label_of_array   # load the address of the array into $a1
lb $a2, 0($a1)           # load a byte from the array into $a2
addi $a2, $a2, 1         # increment $a2 by 1
sb $a2, 0($a1)           # store the new value into memory
addi $a1, $a1, 1         # increment $a1 by one, to point to the next element in the array

还有一点:

您写了addi $a1, $zero, 1 # i = i + 1,但这是错误的。您所做的是将$zero + 1 的结果(即1)存储到$a1 中。为了增加$a1,您需要编写addi $a1, $a1, 1,即“将$a1 + 1 的结果存储到$a1

【讨论】:

谢谢,这很有帮助。但是如何增加数组的每个循环的偏移量,或者有效地使用索引?编辑:别担心,我明白了。 不要增加偏移量,增加保存数组地址的寄存器(如我贴的代码示例的最后一行) 是的,刚刚注意到。谢谢。

以上是关于循环遍历数组 MIPS 程序集的主要内容,如果未能解决你的问题,请参考以下文章

jQuery$.each循环遍历详解,各种取值对比,$.each遍历数组对象Dom元素二维数组双层循坏类json数据等等

在c ++中使用循环遍历数组并且程序说“退出状态-1”?

用vbscript遍历数组

循环遍历两个对象数组以将匹配值推送到新数组在 React 中不起作用,但在 JS Fiddle 中起作用

循环遍历二维数组的最快方法?

怎么用一个循环遍历二维数组?