gpt4 book ai didi

arrays - 如何将数组传递给 MIPS 汇编中的函数

转载 作者:行者123 更新时间:2023-12-05 07:57:56 24 4
gpt4 key购买 nike

因此作业是在 MIPS 中编写一个函数,该函数接受一个数组,将数组的所有内容加在一起,然后返回总和。主要问题是我是 Assembly 的新手,不完全确定如何将数组传递给 Assembly 中的函数,这是我目前所知道的:

# 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

有什么建议吗?还是我的问题完全不同?

编辑:我认为我的问题实际上可能是数组没有正确初始化,或者我是如何从中获取数据的,但我无法弄清楚是否确实如此,因为似乎没有我如何初始化它们有什么问题。

最佳答案

所以你的这部分是正确的:

# Set arr1 as the argument for the sumArr function
la $t4, arr1

但不幸的是这部分是错误的:

sw  $t4, arrx

MIPS 被称为 RISC(精简指令集计算机),这意味着它的指令少于英特尔 x86 等计算机。 MIPS 不能做的一件事是像这样将寄存器直接存储到常量地址。为了将 $t4 存储在地址 arrx 中,您需要执行以下操作。 (请注意,对于此示例,我选择了 $t3 只是因为它尚未被使用过。)

la $t4,arr1    ;load the address of arr1 into $t4
la $t3,arrx ;load the address of arrx into $t3
sw $t4,0($t3) ;store the address of arr1 at the first 4 bytes of arrx

在这一系列指令之后,我们的数据段将如下所示(如果您能以某种方式看到源代码的 .data 部分在代码运行时实时更新):

.data 
arrx: .word arr1
.space 96
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"

关于arrays - 如何将数组传递给 MIPS 汇编中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com