如何让我的 MIPS 代码根据随机数字输出特定的案例值?

How can I get my MIPS code to output a specific case value based on a randomized number?

提问人:TheBlinded 提问时间:11/4/2023 最后编辑:Erik EidtTheBlinded 更新时间:11/4/2023 访问量:18

问:

我正在使用MARS为我的一个类用MIPS代码编写一个游戏,我正在尝试使用一个随机数生成器,根据它输出的随机数,打印一个特定的字符串。我的问题是,在选择随机数时,无论值如何,都会打印相同的情况。 这是我当前的代码:

.data
arrayAddress: .word 268501028
array1: .asciiz "first case"
array2: .asciiz "second case"
array3: .asciiz "third case"
array4: .asciiz "fourth case"
array5: .asciiz "fifth case"
ln: .asciiz "\n"

.text
randNum:
    li $a1, 5  # max bound
    li $v0, 42  # rand num based on bounds
    syscall
    add $a0, $a0, 1  # low bound
    li $v0, 1  # print rand val based on bounds
    syscall
    li $v0, 4  # print new line
    la $a0, ln
    syscall
    j caseVal

caseVal:
    beq $v0, 1, caseVal1
    beq $v0, 2, caseVal2
    beq $v0, 3, caseVal3
    beq $v0, 4, caseVal4
    beq $v0, 5, caseVal5
    j main

caseVal1:
    la $t0, array1
       li $v0, 4
    la $a0, array1
    syscall
    j main

caseVal2:
    la $t0, array2
        li $v0, 4
    la $a0, array2
    syscall
    j main

caseVal3:
    la $t0, array3
        li $v0, 4
    la $a0, array3
    syscall
    j main

caseVal4:
    la $t0, array4
        li $v0, 4
    la $a0, array4
    syscall
    j main

caseVal5:
    la $t0, array5
        li $v0, 4
    la $a0, array5
    syscall
    j main

main:
    li $v0, 4
    la $a0, ln
    syscall
    #j randNum
    
    la $t0, ($a0)
    li $v0, 4
    syscall

一个例子是,如果我得到值 2,它也应该打印出“第二种情况”,但它打印出“第四种情况”,这也与每个 sinle 大小写相同,它总是打印“第四种情况”。有没有人了解这里的问题是什么,或者向我指出解释问题的资源?这段代码是我制作的测试器,在我的实际游戏中,输出将是一个选择打印的数组。如果我能得到任何帮助,那就太棒了!

我希望输出打印出生成的随机值和相应的大小写字符串(稍后将是一个数组)。我试图改变案例调用的结构,只是为了看看会发生什么,我试图将相应案例字符串的地址加载到一个变量中,看看我是否可以在我的主函数中使用该值。

MIPS 机器代码 MARS-Simulator

评论

0赞 Erik Eidt 11/4/2023
您的案例语句正在测试 $v 0,它从紧接之前的打印字符串 syscall 中保存 4,您将 4 加载到其中。您是否尝试过使用调试器?您应该能够使用一个步骤来理解问题。
0赞 TheBlinded 11/4/2023
@ErikEidt是的,我刚刚发现了同样的问题,谢谢你的回复!自从它们被覆盖以来,我更改了一些变量。我将用解决方案更新这篇文章,所以如果将来有人发现这一点,他们可以看到解决方案。

答:

0赞 TheBlinded 11/4/2023 #1

这是我自己问题的解决方案,以防有人最终需要类似问题的帮助:

.data
arrayAddress: .word 268501028
array1: .asciiz " first case"
array2: .asciiz " second case"
array3: .asciiz " third case"
array4: .asciiz " fourth case"
array5: .asciiz " fifth case"
ln: .asciiz "\n"

.text
randNum:
    li $a1, 5  # max bound
    li $v0, 42  # rand num based on bounds
    syscall
    add $a0, $a0, 1  # low bound
    li $v0, 1  # print rand val based on bounds
    syscall
    j caseVal

caseVal:
    beq $a0, 1, caseVal1
    beq $a0, 2, caseVal2
    beq $a0, 3, caseVal3
    beq $a0, 4, caseVal4
    beq $a0, 5, caseVal5
    j main

caseVal1:
    la $t0, array1
    li $v0, 4
    la $a0, array1
    syscall
    j main

caseVal2:
    la $t0, array2
        li $v0, 4
    la $a0, array2
    syscall
    j main

caseVal3:
    la $t0, array3
        li $v0, 4
    la $a0, array3
    syscall
    j main

caseVal4:
    la $t0, array4
        li $v0, 4
    la $a0, array4
    syscall
    j main

caseVal5:
    la $t0, array5
        li $v0, 4
    la $a0, array5
    syscall
    j main

main:
    li $v0, 4
    la $a0, ln
    syscall
    #j randNum
    
    la $t0, ($a0)
    li $v0, 4
    syscall

评论

0赞 Community 11/7/2023
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。