MIPS汇编生成128个随机数存数组求平均不显示结果问题
问题分析
- 循环计数器初始化位置错误:
addi $t0, $zero, 0放在了loop标签内部,每次进入循环都会将计数器重置为0,程序陷入死循环,永远无法执行到后续的平均值计算和输出逻辑。 - 平均值计算代码不可达:
srl $t8, $t9, 7写在j loop指令之后、exit标签之前,程序永远不会执行到这行代码,平均值根本没有计算。 - 输出寄存器使用错误:打印整数时执行的
move $a0, $a1,取的是之前设置的随机数上限值,而正确的平均值存储在t8寄存器中,就算执行到也无法输出正确结果。 - 累加寄存器未初始化:用来存储累加和的
t9寄存器没有初始清零,初始值为随机垃圾数据,累加得到的总和本身就是错误的。 - 随机数上限设置错误:MIPS syscall 42生成随机数的范围是
[0, $a1),即不包含上限值,你设置$a1=16只会生成0-15的数,要生成≤128的随机数需要将$a1设为129。
修正后的完整代码
# seed the generator # 1 - load the generator ID # 2 - seed the generator # Generate 128 random numbers (loop) # 1 - load the generator ID # 2 - bound the random number generator to less than or equal to 128 # 3 - generate a random number # 4 - store number in array # 4 - go to step 2 until 128 numbers have been generated # Compute the Average # 1 - add all the numbers in the array (loop) # 2 - compute the average (use a right shift) # 3 - Display the average result message # 4 - Display the average .data array: .space 512 genID: .word 1 seed: .word 1235 prompt: .asciiz "the average number generated from the number generator is: " .text .globl main main: lw $a0, genID # loads genID la $t0, seed # loads seed lw $a1, 0($t0) li $v0, 40 # seed the generator syscall # 初始化计数器、累加和,放在循环外面 addi $t0, $zero, 0 add $t9, $zero, $zero la $t8, genID loop: lw $a0, 0($t8) li $a1, 129 # 生成0-128的随机数,上限不包含所以设129 li $v0, 42 # gen a random number syscall sw $a0, array($t0) # store number in array addu $t9, $t9, $a0 # 累加 addi $t0, $t0, 4 # 增量索引 bge $t0, 512, compute_avg # 凑够128个就去算平均值 j loop compute_avg: srl $t8, $t9, 7 # 128=2^7,右移7位相当于除以128 exit: li $v0, 4 la $a0, prompt syscall li $v0, 1 move $a0, $t8 # 输出计算好的平均值 syscall li $v0,10 syscall
内容的提问来源于stack exchange,提问作者anonymousEROS
相关产品推荐
相关产品推荐

