为什么这个MIPS汇编语言代码会崩溃我的SPIM模拟器?

时间:2013-10-01 02:08:18

标签: assembly mips spim

如果评论不太清楚,我会描述这应该做什么。采用两个长度为8的数组并将每个对应的元素相乘,并将产品存储到一个新数组中。换句话说,对于array1 [1,2,...,8]和array2 [1,2,...,8],数组3的内容将等于[1,4,...,64]。 / p>

    .data
array1:     .byte 2, 2, 2, 2, 2, 2, 2, 2
array2:     .byte 41, 3, 5, 7, 19, 2, 4, 4
array3:     .space 40 #This must be declared this way
result:     .asciiz "Product = "
    .globl main

    .text
main:
    la  $s0, array1             #Load address of array1 to s0
    la  $s1, array2             #Load address of array2 to s1
    la  $s2, array3             #Load address of array3 to s2
    lb  $t0, 0($s0)             #Load first byte of array1 to t0
    lb  $t1, 0($s1)             #Load first byte of array2 to t1
    li  $t8, 8                  #Load 8 to t0 for our loop. We'll call it N

loop:
    beq $t0, 0, next        #if the variable X is 0, go to next, else
    add $t2, $t1, $t2       #add t2 and Y, store in t2
    addi $t0, $t0, -1       #decrement X
    j loop                  #jump to loop

next:
    sw $t2, 0($s2)          #Store the product into array3 as a word.
    li $t2, 0               #Load 0 to t2 to reset it before jumping back to loop
    addi $t8, $t8, -1       #decrement t8
    add  $s0, $s0, 1        #Shift to next byte in array1
    lb  $t0, 0($s0)         #Load first byte of array1 to t0
    add  $s1, $s1, 1        #Shift to next byte in array2
    lb  $t1, 0($s1)         #Load first byte of array2 to t1
    add  $s2, $s2, 4        #Shift to next word in array3
    bne  $t8, 0, loop       #If t8 is not yet 0 (we haven't interated through all elements of the list), go to loop.
    li $t8, 8               #Load 8 to t8
    add  $s2, $s2, -32      #Shift to first word of array3
    j print1                    #jump to print procedure

print1:
    li $v0, 4               #load system call code for print string
    la $a0, result          #Load address of result to a0
    syscall                 #print result
    j print2                #jump to print2 procedure

print2:
    li $v0, 1                   #Load system call for print integer
    lw $a0, 0($s2)              #Load first word of array3 to a0
    syscall                     #print Integer
    bne $t8, 0, print2          #if t8 is not equal to 8, loop to print2 procedure
    j close                     #Else jump to close

close:
    li $v0, 10                  #load system call code for terminate
    syscall                     #return control to system

1 个答案:

答案 0 :(得分:0)

另一个不太复杂的解决方案:

    .data
    result: .asciiz "Product= "
    space:  .asciiz " "
    .align 2    
    Array1: .word 1, 2, 3, 4, 5,6,7,8
    Array2: .word 1, 2, 3, 4, 5,6,7,8
    Array3: .space 32   
    N: .word 8

    .text
    main:   
        la $a0, Array1
        la $a1, Array2
        la $a2, Array3
        lw $a3, N
        jal mult_array1_array2
        jal print_array3
        jal close

    mult_array1_array2:
        li $t0, 0
    buc1:   bge $t0, $a3, final1
        lw $t4, ($a0)
        lw $t5, ($a1)
        mul $t3, $t4, $t5
        sw $t3, ($a2)
        addi $a0, $a0, 4
        addi $a1, $a1, 4
        addi $a2, $a2, 4
        addi $t0, $t0, 1
        b buc1
    final1: 
        jr $ra

    print_array3:
        li $v0, 4
        la $a0, result
        syscall
        li $t0, 0
        li $t1, 0
    buc2:   bge $t0, $a3, final2
        lw $a0, Array3($t1)
        li $v0, 1                   
        syscall
        la $a0, space
        li $v0, 4                   
        syscall
        addi $t1, $t1, 4
        addi $t0, $t0, 1
        b buc2
     final2:        
        jr $ra              

    close:
        li $v0, 10
        syscall