在 MIPS 上绘图。运行时错误

Drawing on MIPS. Runtime error

以下代码有问题。我写了一段代码,用于在 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 [=10=] 0
    add $a0 [=10=] 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 [=10=] [=10=]
             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 [=10=] [=10=]
    add $a1 [=10=] [=10=]
         loop:
             jal set_pixel_color
             add $a0 $a0 1
             ble $a0 127 loop
             add $a0 [=10=] [=10=] 
             add $a1 $a1 1
             ble $a1 127 loop  
         draw:
              jal quater_circle
              add $a3 $a3 1
              ble $a3 128 draw

它以蓝色背景绘制的红色四分之一圆结束,但它在程序结束时终止,我不能使用 draw 程序。你能帮帮我吗?

您正在 quater_circle 子程序中丢失 $ra。 该例程是从 main 调用的,它调用另一个子例程 (set_pixel_color),因此丢失了原始 return 地址。

您应该在 quater_circle 子例程中保留 $ra,方法是将其内容存储到堆栈中(并在 return 到调用者)或者将 $ra 移动到其他寄存器(例如 $s2)并将其用于 return.

对于第二种选择,您将添加

  move $s2, $ra

quater_circle子程序的开头并改变

  jr $ra 

  jr $s2 

在子例程结束时。