【问题标题】:MIPS Help: Adding arrays and printing their sumMIPS 帮助:添加数组并打印它们的总和
【发布时间】:2013-10-07 13:26:54
【问题描述】:

添加两个数组: 编写一个 MIPS 汇编语言程序,将两个数组相加(逐个元素相加)和 打印他们的总和。

在一行中打印出总和的元素,标记并用空格分隔值。 该行应以 \n" 字符结尾。例如,如果数组 a 和 b 如上所述, 输出将如下所示: 总和为:1 4 7 6 10 14 11 16 21 16

这是我目前的代码

# data segment

.data




size:    .word  10 #Size of first array
$a0:    .word  2, 4, 6, 8, 10, 12, 14, 16, 18, 20 #First array's elements
size2:   .word 10 #Size of second array
$a1:   .word -1, 0, 1, -2, 0, 2, -3, 0, 3, -4 #Second array's elements
size3:   .word 10 #size of third array

main:

la   $t0, $a0   #$t0 points to $a0[0]          
lw   $t1, size   #$t1 equals number of elements in $a0[]  
la   $t2, $a1  #$t2 points to $a1[0] 
lw   $t3, size2  #$t3 equals number of elements in $a1[]


la $t4, $a0 #load base address of array into register $t4
la $t5,  #load base address of array into register $t5


Assigning the array's elements to temp variables:

lw $t6,0($a0)

addiu $a0,$a0,4

lw $t7,0($a0)

addiu $a0,$a0,4

lw $t8,0($a0)

addiu $a0,$a0,4

lw $t9,0($a0)

addiu $a0,$a0,4

lw $t10,0($a0)

addiu $a0,$a0,4






# exit program:

li   $v0, 10      # terminate program
syscall

所以这就是我难过的地方。如何将第一个和第二个数组的每个元素都放入 MIPS 值中,例如 $t0$t1 等。

然后我该如何将它们加在一起并打印出数组的总和?

很抱歉占用您的时间,但我已经搜索了几个小时以获取有关如何在 MIPS 中添加数组然后打印总和的指南,但无济于事

【问题讨论】:

  • lw $t6, 0(list) 不是有效指令(除非您的汇编程序将其转换为lw $t6,list($zero),根据list 的地址,这仍然可能是无效的)。基地址(即你放在括号之间的东西)应该是一个寄存器。在继续本作业之前,您可能应该复习 MIPS 汇编编程的基础知识。
  • “你应该复习一下 MIPS 汇编编程的基础知识” 这个。我什至会说(重新)查看计算机和 CPU 架构。

标签: arrays sum mips


【解决方案1】:

您可以使用a MIPS instruction set reference 来检查哪个指令适合程序的每个步骤。

例如,要将 32 位字从$a0 中给出的地址加载到$t0,您将使用lw $t0,0($a0)

要增加$a0 以指向下一个单词,您可以使用addiu $a0,$a0,4

如果两个值(例如,计数器和数组长度)不相等,要分支到标签,您可以使用 bne $t2,$a1,some_label 之类的东西。

等等..

顺便说一句,我不确定$b0$b1 应该是什么。你是说$t0$t1 吗?

【讨论】:

  • 用您建议的更改对其进行了编辑(没有写出整个部分,想确保我做得正确)。这是你的意思吗?你的示例变量让我有点失望。你能帮我看看你所说的$a0是什么意思吗? $a0 是我的“列表”值,还是我需要声明的全新值?出于好奇而不是使用 addiu $a0, $a0, 4 我可以使用 lw $t1, 4($a0) 吗?
  • @ErichHarkema 嗯 $a0 不是变量,而是 CPU 寄存器。这不是 PHP ......在汇编中正确地说没有“变量”。关于你的第二个问题:不,这些指令没有共同点:addiu 是添加 2 个寄存器,lw 是将一个值从内存加载到寄存器中。看起来你不太明白你在做什么。我建议你阅读this tutorial
  • 就像@m0skit0 所说,$a0CPU registers 之一。在您发布的原始代码中,您将其中一个数组的地址放在$a0 中,所以我以它为例。由您决定要使用哪个寄存器。至于lw $t1,4($a0),这不是合适的使用说明。 lw $t1,4($a0) 将地址 ($a0 + 4) 中的单词加载到 $t1 - 而 addiu $a0,$a0,4 将 4 添加到 $a0
  • @Michael 我调整了它,这是 lw $t10,0($a0) 的正确寄存器吗?
  • @ErichHarkema 你的问题没有多大意义,而且没有$t10 注册。这真的不是从头开始学习组装的地方,而是针对特定问题的地方。恕我直言,您远不了解迈克尔告诉您的任何事情。我强烈建议您查看我在上面给您的链接,然后提出具体问题。很抱歉让你这么开心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多