我为一个程序创建了代码,该程序输出给定数字的因子。但它需要向用户询问一个数字,直到他们退出前输入负数。
所以它看起来像这样
输入n的值(或退出的负值):6
6!是720
输入n的值(或退出的负值):9
9!是362880
输入n的值(或退出的负值):11
11!是39916800
输入n的值(或退出的负值):20
20!是-2102132736
输入n的值(或退出的负值):100
100!是0
输入n的值(或退出的负值): - 1
感谢您的测试!
而不是像这样的东西。
输入数字的值(或退出的负数):5
返回的值是120
感谢您的测试!
fact:
slti $t0, $a0, 1 # test for n < 1
beq $t0, $zero, L1 # if n >= 1, go to L1
li $v0, 1 # return 1
jr $ra # return to instruction after jal
L1:
addi $sp, $sp, -8 # adjust stack for 2 items
sw $ra, 4($sp) # save the return address
sw $a0, 0($sp) # save the argument n
addi $a0, $a0, -1 # n >= 1; argument gets (n – 1)
jal fact # call fact with (n – 1)
lw $a0, 0($sp) # return from jal: restore argument n
lw $ra, 4($sp) # restore the return address
addi $sp, $sp, 8 # adjust stack pointer to pop 2 items
mul $v0, $a0, $v0 # return n * fact (n – 1)
jr $ra # return to the caller
main:
la $a0, nreq # get value of n
li $v0, 4
syscall
li $v0, 5 # read value of n
syscall
move $a0, $v0 # place value n in $a0
jal fact # invoke fact
move $s0, $v0 #save value returned by facts
la $a0, ans # display
li $v0, 4
syscall
move $a0, $s0
li $v0, 1
syscall
la $a0, cr #display closing
li $v0, 4
syscall
li $v0, 10 # exit
syscall
.data
nreq:.asciiz“输入n的值(或退出的否定值):” ans:.asciiz“返回的值是” cr:.asciiz“\ n谢谢测试!\ n”
答案 0 :(得分:0)
我将ValueError: invalid literal for int() with base 10: '...'
移到main
上方的顶部,因为有些模拟器从最低fact
地址而不是给定符号.text
开始。例如,在main
中,在我颠倒顺序之前,这似乎不起作用。
mars
错过了负输入的测试,并没有自行循环。
这是一个似乎有效的版本[请原谅无偿的风格清理]:
main