在驱动程序中创建循环检查

时间:2017-02-07 00:04:09

标签: mips

我为一个程序创建了代码,该程序输出给定数字的因子。但它需要向用户询问一个数字,直到他们退出前输入负数。

所以它看起来像这样

输入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”

1 个答案:

答案 0 :(得分:0)

总的来说,非常接近。但是,有一两件事。

我将ValueError: invalid literal for int() with base 10: '...' 移到main上方的顶部,因为有些模拟器从最低fact地址而不是给定符号.text开始。例如,在main中,在我颠倒顺序之前,这似乎不起作用。

mars错过了负输入的测试,并没有自行循环。

这是一个似乎有效的版本[请原谅无偿的风格清理]:

main