Assembly 如何使用阶乘汇编代码设置初始值?
这是我的原始代码Assembly 如何使用阶乘汇编代码设置初始值?,assembly,mips,factorial,mars-simulator,Assembly,Mips,Factorial,Mars Simulator,这是我的原始代码 main: addi $sp, $sp, -8 # adjust stack for 2 items sw $ra, 4($sp) # save return address sw $a0, 0($sp) # save argument slti $t0, $a0, 1 # test for n<1 beq $t0, $zero, L1 addi $v0, $zero, 1 # if
main:
addi $sp, $sp, -8 # adjust stack for 2 items
sw $ra, 4($sp) # save return address
sw $a0, 0($sp) # save argument
slti $t0, $a0, 1 # test for n<1
beq $t0, $zero, L1
addi $v0, $zero, 1 # if so, result is 1
addi $sp, $sp, 8 # pop 2 items from stack
jr $ra # and return
L1: addi $a0, $a0, -1 # else decrement n
jal main # recursive call
lw $a0, 0($sp) # restore original n
lw $ra, 4($sp) # and return address
addi $sp, $sp, 8 # pop 2 items from stack
mul $v0, $a0, $v0 # multiply to get result
jr $ra # and return
main:
addi$sp,$sp,-8#调整2个项目的堆栈
sw$ra,4($sp)#保存回信地址
sw$a0,0($sp)#保存参数
slti$t0,$a0,1#测试n生成一个从main
调用的单独函数,而不是使main
本身递归
或者使用intmain的第一个参数(intargc,char**argv)
作为n
因此,您可以使用/fac$(seq 2 4)
运行程序,以$a0=4
运行程序
Unixseq 2 4
命令打印2 3 4
,因此该命令有3个参数加上隐式的第一个参数(命令名),因此C启动代码将4
作为argc
参数传递给main
使用/foo$(seq number)
是一种方便的方法,可以在手工编写的asm中乱搞,避免编写int解析代码,让程序以寄存器(或某些其他平台上的内存中的二进制整数启动,如在x86-64系统V ABI中使用\u start
而不是main
).不确定您要问什么,可能您想将当前代码移动到一些过程中,如factorial:
(基本上只是重命名main
),然后创建新的main
,将a0
设置为初始值(2?),一个dojal factorial
,然后使用MARS系统调用终止(我认为从头部看,v0=10).你是说这个吗?不要通过删除所有代码来破坏你的问题。这会使问题变得毫无意义/更难理解。@Peter Cordes,对不起,我的教授让我删除它。因为它是作业的一部分,其他学生可以复制它而不必尝试解决…我试图删除问题,但我无法。对不起。。