因此,任务是用MIPS编写一个函数,该函数接受一个数组,将数组中的所有内容相加,然后返回总和。主要问题是,我是汇编语言的新手,不完全确定如何将数组传递给汇编语言中的函数。以下是我目前所掌握的情况:
# Title: homework2.asm
# Author: Jacob Suarez
# Date: 9/28/14
# Purpose: Create a function that can find the sum of the elements in an array, and run two arrays through it
# Text Segment
.text
.globl __start
__start:
li $t0, 0 # $t0 <- sum
li $a0, 0 # $a0 <- array index
# Set arr1 as the argument for the sumArr function
la $t4, arr1
sw $t4, arrx
# Set upper bound of array index
li $t9, 4
# Call function to calculate the sum of arr1
jal sumArr
sw $v0, sum1
la $a0, sum1
# Print sum1 from $a0
li $v0, 1
syscall
la $a0, end1
li $v0, 4
syscall
# Reset function arguments to 0
li $t0, 0 # $t0 <- sum
li $a0, 0 # $a0 <- array index
# Set arr2 as the argument for the sumArr function
la $t4, arr2
sw $t4, arrx
# Set upper bound of array index
li $t9, 5
# Call function to calculate the sum of arr2
jal sumArr
sw $v0, sum2
la $a0, sum2
# Print sum2 from $a0
li $v0, 1
syscall
la $a0, end2
li $v0, 4
syscall
# End program
li $v0, 10
syscall
sumArr:
lw $t2, arrx($a0) # $t2 <- value in the array
add $t0, $t0, $t2 # sum += A[i]
addi $a0, $a0, 4 # i++ in bytes
blt $a0, $t9, sumArr
# Move contents of $t0 to $a0
move $t0, $a0
# Return
jr $ra
# Data Segment
.data
arrx: .space 100
arr1: .word 8,12,20,40
arr2: .word 15,25,35,55,-129
sum1: .word 0
sum2: .word 0
end1: .asciiz " is the sum of arr1.\n"
end2: .asciiz " is the sum of arr2.\n"
# end of file homework2.asm
现在,这一切都运行得很好,但问题是,结果似乎只是从内存中的一个未初始化的空间中提取出来的,所以我得到的只是像4268501128这样的数字,或者其他明显错误的数字,所以我认为我的问题是如何将数组传递给函数,特别是这部分代码:
# Set arr1 as the argument for the sumArr function
la $t4, arr1
sw $t4, arrx
有什么建议吗?还是我的问题完全是别的?
编辑:我认为我的问题实际上可能是数组没有正确初始化,或者我是如何从数组中获取数据的,但我不能确定是否真的是这样,因为我初始化它们的方式似乎没有任何错误。
1条答案
按热度按时间lndjwyie1#
所以这部分是正确的:
但不幸的是这一部分是错误的:
MIPS称为RISC(精简指令集计算机),这意味着它比英特尔x86这样的计算机具有更少的指令。MIPS不能做的一件事是将寄存器直接存储到这样的常量地址。为了将
$t4
存储到地址arrx
,您将需要执行如下操作。(请注意,在本示例中,我选择$t3
只是因为它还没有被使用。)在这一系列指令之后,我们的数据段将如下所示(如果您可以在代码运行时真实的看到源代码的
.data
部分的更新):