借鉴MIPS。运行时错误

时间:2015-10-22 12:21:04

标签: drawing mips

以下代码存在问题。我在MARS汇编程序上编写了一个用于绘制四个圆圈的代码。但是发生了错误。程序本身会绘制四分之一圆,但最后会出现错误,因为我无法使用循环执行此过程,代码如下所示

.data
    DISPLAY: .space 65536    
    DISPLAYWIDTH: .word 128
    DISPLAYHEIGHT: .word 128

.text

j main

set_pixel_color:

    mulu $t0 $a1 $s0 
    add $t0 $t0 $a0
    mul $t0 $t0 4

    la $t2 DISPLAY
    add $t2 $t2 $t0

    sw $a2 ($t2)
    jr $ra          

quater_circle:              
    add $a1 $0 0
    add $a0 $0 0
    lw $a2 RED  

        loop2:
                 jal set_pixel_color
             add $a0 $a0 1
             mulu $t3 $a0 $a0
             mulu $t4 $a1 $a1 
             add $t3 $t3 $t4
             mulu $t4 $a3 $a3

             ble $t3 $t4 loop2                       
             add $a0 $0 $0
             add $a1 $a1 1

             ble $a1 $a3 loop2
             jr $ra 

.data
    RED: .word  0xff0000
    GREEN: .word    0x00ff00
    BLUE: .word     0x0000ff 
.text

main:
    lw $s0, DISPLAYWIDTH    # s0 holds MAX x
    lw $s1, DISPLAYHEIGHT   # s1 holds MAX y
    li $a3 1   
    lw $a2 BLUE
    add $a0 $0 $0
    add $a1 $0 $0
         loop:
             jal set_pixel_color
             add $a0 $a0 1
             ble $a0 127 loop
             add $a0 $0 $0 
             add $a1 $a1 1
             ble $a1 127 loop  
         draw:
              jal quater_circle
              add $a3 $a3 1
              ble $a3 128 draw

最终会得到带有蓝色背景的绘制红色四分之一圈,但是它会在程序结束时终止,我无法使用draw程序。你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

您的 quater_circle 子例程中丢失了$ra。 该例程从main调用,它调用另一个子例程( set_pixel_color ),从而丢失原始返回地址。

您应该在 quater_circle 子例程中保留$ra,方法是将其内容存储到堆栈中(并在返回调用方之前将其恢复)或者将$ra移动到其他位置注册(例如,$s2)并使用它返回。

对于第二种选择,您可以添加

  move $s2, $ra

quater_circle 子程序的开头并更改

  jr $ra 

  jr $s2 

在子程序结束时。