assembly 如何在MIPS程序集中将数组传递给函数

3pmvbmvn  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(148)

因此,任务是用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

有什么建议吗?还是我的问题完全是别的?
编辑:我认为我的问题实际上可能是数组没有正确初始化,或者我是如何从数组中获取数据的,但我不能确定是否真的是这样,因为我初始化它们的方式似乎没有任何错误。

lndjwyie

lndjwyie1#

所以这部分是正确的:

# 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"

相关问题