问题描述
.data
array: .word 1 2 3 4 5
mfact: .word 100
dfact: .word 20
.text
main: lui s0,0x10010 # U format 4 cycles
lw t0,20(s0) # I format 5 cycles
lw t1,24(s0) # I format 5 cycles
or s1,zero,zero # R format 4 cycles
ori s2,5 # I format 4 cycles
loop: slli s3,s1,2 # I format 4 cycles
add s4,s3,s0 # R format 4 cycles
lw t2,0(s4) # I format 5 cycles
mul t3,t2,t0 # R format 10 cycles
div t4,t3,t1 # R format 40 cycles
sw t4,0(s4) # S format 4 cycles
addi s1,1 # I format 4 cycles
blt s1,s2,loop # B format 3 cycles
exit: ori a7,10 # I format 4 cycles
ecall # I format 3 cycles
该问题没有更多信息。我认为程序会将数字1-5相除并相乘,直到达到0,然后停止。我对此是否正确?
解决方法
该程序应采用5个单词的数组的每个元素,并将其与数组后的第一个单词相乘,然后将结果除以数组后的第二个元素。但是存在一些问题:
1-您需要在数组的单词之间添加com。
2-您需要将main声明为全局函数,以便链接程序可以找到它。否则,您将遇到未定义的参考错误。
3- lui s0,0x10010
可能有问题。您确定链接器会将数组放在此地址吗?您是否修改了链接脚本以强制执行?如果您不确定链接器将执行的操作。最好将数组声明为对象,然后将其直接与lui + addi一起使用。
代码为:
.data
.type array,@object
.size array,20
array: .word 1,2,3,4,5
mfact: .word 100
dfact: .word 20
.text
.global main
.type main,@function
main:
lui s0,%hi(array) # U format 4 cycles
addi s0,s0,%lo(array) # I format 4 cycles
lw t0,20(s0) # I format 5 cycles
lw t1,24(s0) # I format 5 cycles
or s1,zero,zero # R format 4 cycles
ori s2,5 # I format 4 cycles
loop:
slli s3,s1,2 # I format 4 cycles
add s4,s3,s0 # R format 4 cycles
lw t2,0(s4) # I format 5 cycles
mul t3,t2,t0 # R format 10 cycles
div t4,t3,t1 # R format 40 cycles
sw t4,0(s4) # S format 4 cycles
addi s1,1 # I format 4 cycles
blt s1,s2,loop # B format 3 cycles
exit:
ori a7,10 # I format 4 cycles
ecall # I format 3 cycles
.size main,.-main