factorial.s

#PURPOSE - Given a number, this program computes the
#		factorial. For example, the factorial of
#		3 is 3 * 2 * 1, or 6. The factorial of
#		4 is 4 * 3 * 2 * 1, or 24, and so on.
#

#This program shows how to call a function recursively.

.section .data

#This program has no global data

.section .text

.global _start
.global factorial		#this is unneeded unless we want to share
						#this function among other programs

_start:
	pushl $4			#The factorial takes one argument - the
						#number we want a factorial of. So, it
						#gets poushed
	call factorial		#run the factorial function
	addl $4, %esp		#Scrubs the parameter that was pushed on
						#the stack
	movl %eax, %ebx		#factorial returns the answer in %eax, but
						#we want it in %ebx to send it as our exit
						#status
	movl $1, %eax		#call the kernel's exit function
	int $0x80


#This is the actual function definition
.type factorial, @function
factorial:
	pushl %ebp			#standard function stuff - we have to
						#restore %ebp to its prior state before
						#returning, so we have to push it
	movl %esp, %ebp		#This is because we don't want to modify
						#the stack poionter, so we use %ebp.

	movl 8(%ebp), %eax	#This moves the first argument to %eax
						#4(%ebp) holds the return address, and
						#8(%ebp) holds the first parameter
	cmpl $1, %eax		#If the number is 1, that is our base
						#case, and we simply return (1 is
						#already in %eax as the return value)
	je end_factorial
	decl %eax			#otherwise, decrease the value
	pushl %eax			#push it for our call to factorial
	call factorial		#call factorial
	movl 8(%ebp), %ebx	#%eax has the return value, so we
						#reload our parameter into %ebx
	imull %ebx, %eax	#multiply that by the result of the
						#last call to factorial (in %eax)
						#the answer is stored in %eax, which
						#is good since that's where return
						#values go.
end_factorial:
	movl %ebp, %esp		#standard function return stuff - we
	popl %ebp			#have to restore %ebp and %esp to where
						#they were before the function starded
	ret					#return to the function (this pops the
						#return value, too)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值