【问题标题】:Why is this MIPS assembly language code crashing my SPIM simulator?为什么这个 MIPS 汇编语言代码会使我的 SPIM 模拟器崩溃?
【发布时间】:2013-10-01 02:08:18
【问题描述】:

如果 cmets 不太清楚,我将描述它应该做什么。取两个长度为 8 的数组并将每个对应的元素相乘并将乘积存储到一个新数组中。换句话说,对于 array1 [1,2,...,8] 和 array2 [1,2,...,8] 数组 3 的内容将等于 [1,4,...,64]。

    .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

【问题讨论】:

  • 在我的 SPIM 模拟器中运行良好——不起作用,但运行良好。考虑到您如何说它已崩溃但没有提供错误消息,这是任何人都可以说的最多。
  • 在您的print2 循环中,您没有推进$s2,也没有递减$t8。这应该会导致无限循环,但不会崩溃。除此之外,我没有发现任何明显的错误。更新:哦,$t2 第一次进入loop 时并没有归零。
  • @Jester 你是对的。令人惊奇的是,8 小时的睡眠可以为清晰起见。感谢您的意见。

标签: assembly mips spim


【解决方案1】:

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

    .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

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2013-11-21
    • 2017-12-29
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多