MIPS - 在输出旁边打印输入
MIPS - Prints the input next to output
我正在学习 MI,试图用 MIPS 汇编代码编写阶乘程序,
3! = 6 (my output shows it 36)(input next to output)
4! = 24(my output shows it as 424)
这是我的代码。我应该怎么做才能摆脱打印输入?
.data
num: .asciiz "\nPlease enter a number: "
num2: .asciiz"\nPlease give your second number : "
respon: .asciiz "\nThe factorial of the entered number is: "
nl: .asciiz"\n"
.text
fact:
beqz $a0,return1
li $v0, 1
li $t0, 1
fact_loop:
bgt $t0, $a0, end_fact_loop
mul $v0, $v0, $t0
addi $t0, $t0, 1
j fact_loop
end_fact_loop:
jr $ra
return1:
li $v0, 1
jr $ra
main:
li $v0, 4
la $a0, num
syscall
li $v0, 5
syscall
move $t0, $v0
li $v0, 4
la $a0, respon
syscall
li $v0, 1
move $a0, $t0
syscall
jal fact
move $t0, $v0
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, nl
syscall
################################
li $v0, 4
la $a0, num2
syscall
li $v0, 5
syscall
move $t0, $v0
li $v0, 4
la $a0, respon
syscall
li $v0, 1
move $a0, $t0
syscall
jal fact
move $t0,$v0
li $v0, 1
move $a0, $t0
syscall
li $v0, 10
syscall
几点建议:
- 为每个功能代码块添加注释。
- 使用单步调试,这样您就可以看到发生了什么。
- 将代码简化为最小的失败示例。如果您有两段代码都表现出相同的问题,请删除其中一个并专注于第一个,而不会受到第二个的干扰和干扰。
- 删除不必要的代码。例如,
return1:
块和 beqz $a0,return1
是多余的,因为主阶乘循环会自动表现出相同的行为——您不需要专门处理 $a0 == 0
。
按照这些提示,我完成了以下程序:
.data
num: .asciiz "\nPlease enter a number: "
num2: .asciiz "\nPlease give your second number : "
respon: .asciiz "\nThe factorial of the entered number is: "
nl: .asciiz "\n"
.text
fact:
li $v0, 1
li $t0, 1
fact_loop:
bgt $t0, $a0, end_fact_loop
mul $v0, $v0, $t0
addi $t0, $t0, 1
j fact_loop
end_fact_loop:
jr $ra
main:
# print prompt "Please enter a number: "
li $v0, 4
la $a0, num
syscall
# get user input for first fact call
li $v0, 5
syscall
move $t0, $v0
# call fact(n)
move $a0, $t0
jal fact
move $t0, $v0
# print "factorial is..."
li $v0, 4
la $a0, respon
syscall
# print the result of fact(n)
li $v0, 1
move $a0, $t0
syscall
# print newline
li $v0, 4
la $a0, nl
syscall
# exit program
li $v0, 10
syscall
重复打印的问题是由这段代码引起的:
li $v0, 1
move $a0, $t0
syscall
move $a0, $t0
是设置 fact
调用所必需的,但我们不需要 li $v0, 1
和 syscall
,它们在前面打印没有换行符的参数fact
的结果,导致您不需要的输出。
将来防止这种情况发生的一个好方法是确保为 fact
函数调用设置的参数恰好发生在 jal
.
之前
我将把它留作练习以适应您的第二段代码,它具有相同的额外 syscall
服务 1
(打印整数)。
要取消打印输入,您必须删除要打印它们的 syscall
。
也就是说,在 jal
-ing fact
(两次)之前,您发出这些指令:
li $v0, 1
move $a0, $t0
syscall
只是,删除第一条和第三条指令并保留 move
,因为您在 fact
例程中使用它:
move $a0, $t0
我正在学习 MI,试图用 MIPS 汇编代码编写阶乘程序,
3! = 6 (my output shows it 36)(input next to output)
4! = 24(my output shows it as 424)
这是我的代码。我应该怎么做才能摆脱打印输入?
.data
num: .asciiz "\nPlease enter a number: "
num2: .asciiz"\nPlease give your second number : "
respon: .asciiz "\nThe factorial of the entered number is: "
nl: .asciiz"\n"
.text
fact:
beqz $a0,return1
li $v0, 1
li $t0, 1
fact_loop:
bgt $t0, $a0, end_fact_loop
mul $v0, $v0, $t0
addi $t0, $t0, 1
j fact_loop
end_fact_loop:
jr $ra
return1:
li $v0, 1
jr $ra
main:
li $v0, 4
la $a0, num
syscall
li $v0, 5
syscall
move $t0, $v0
li $v0, 4
la $a0, respon
syscall
li $v0, 1
move $a0, $t0
syscall
jal fact
move $t0, $v0
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, nl
syscall
################################
li $v0, 4
la $a0, num2
syscall
li $v0, 5
syscall
move $t0, $v0
li $v0, 4
la $a0, respon
syscall
li $v0, 1
move $a0, $t0
syscall
jal fact
move $t0,$v0
li $v0, 1
move $a0, $t0
syscall
li $v0, 10
syscall
几点建议:
- 为每个功能代码块添加注释。
- 使用单步调试,这样您就可以看到发生了什么。
- 将代码简化为最小的失败示例。如果您有两段代码都表现出相同的问题,请删除其中一个并专注于第一个,而不会受到第二个的干扰和干扰。
- 删除不必要的代码。例如,
return1:
块和beqz $a0,return1
是多余的,因为主阶乘循环会自动表现出相同的行为——您不需要专门处理$a0 == 0
。
按照这些提示,我完成了以下程序:
.data
num: .asciiz "\nPlease enter a number: "
num2: .asciiz "\nPlease give your second number : "
respon: .asciiz "\nThe factorial of the entered number is: "
nl: .asciiz "\n"
.text
fact:
li $v0, 1
li $t0, 1
fact_loop:
bgt $t0, $a0, end_fact_loop
mul $v0, $v0, $t0
addi $t0, $t0, 1
j fact_loop
end_fact_loop:
jr $ra
main:
# print prompt "Please enter a number: "
li $v0, 4
la $a0, num
syscall
# get user input for first fact call
li $v0, 5
syscall
move $t0, $v0
# call fact(n)
move $a0, $t0
jal fact
move $t0, $v0
# print "factorial is..."
li $v0, 4
la $a0, respon
syscall
# print the result of fact(n)
li $v0, 1
move $a0, $t0
syscall
# print newline
li $v0, 4
la $a0, nl
syscall
# exit program
li $v0, 10
syscall
重复打印的问题是由这段代码引起的:
li $v0, 1
move $a0, $t0
syscall
move $a0, $t0
是设置 fact
调用所必需的,但我们不需要 li $v0, 1
和 syscall
,它们在前面打印没有换行符的参数fact
的结果,导致您不需要的输出。
将来防止这种情况发生的一个好方法是确保为 fact
函数调用设置的参数恰好发生在 jal
.
我将把它留作练习以适应您的第二段代码,它具有相同的额外 syscall
服务 1
(打印整数)。
要取消打印输入,您必须删除要打印它们的 syscall
。
也就是说,在 jal
-ing fact
(两次)之前,您发出这些指令:
li $v0, 1
move $a0, $t0
syscall
只是,删除第一条和第三条指令并保留 move
,因为您在 fact
例程中使用它:
move $a0, $t0