在 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
在子例程结束时。
以下代码有问题。我写了一段代码,用于在 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
在子例程结束时。