以下代码存在问题。我在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
程序。你能帮帮我吗?
答案 0 :(得分:0)
您的 quater_circle 子例程中丢失了$ra
。
该例程从main调用,它调用另一个子例程( set_pixel_color ),从而丢失原始返回地址。
您应该在 quater_circle 子例程中保留$ra
,方法是将其内容存储到堆栈中(并在返回调用方之前将其恢复)或者将$ra
移动到其他位置注册(例如,$s2
)并使用它返回。
对于第二种选择,您可以添加
move $s2, $ra
在 quater_circle 子程序的开头并更改
jr $ra
带
jr $s2
在子程序结束时。