0

这是我的完整代码:

SYSCALL = 0X80
STDIN = 0
STDOUT = 1
SYSREAD = 3
SYSWRITE = 4
SYSEXIT = 1

.section .data

WYBOR_MAXLEN = 2
WYBOR: .space WYBOR_MAXLEN
WYBOR_LEN: .byte


.section .text
.globl _start

_start:

mov $WYBOR_MAXLEN, %edx
mov $WYBOR, %ecx
mov $STDIN, %ebx
mov $SYSREAD, %eax
int $SYSCALL

movl $0, %edi
mov WYBOR(, %edi, 1), %al

pushl %eax
call silnia
addl $4, %esp
movl %eax, %ebx
movl $1, %eax
int $0x80

#To jest rzeczywista definicja funkcji
.type silnia, @function

silnia:

pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
cmpl $1, %eax
je end_silnia

decl %eax
pushl %eax
call silnia
movl 8(%ebp), %ebx
imull %ebx, %eax

end_silnia:
movl %ebp, %esp
popl %ebp
ret

我希望该程序运行并输入值以从中计算阶乘。我可以写值,但它会“分段错误”。如果我将 pushl $LOl 更改为 ecample pushl $4,它将计入正常阶乘。我可以更改代码以从键盘输入值以进行编程吗?

@edit 我改变了这个片段:

movl $0, %edi
mov WYBOR(, %edi, 1), %al

pushl %eax

如果我在键盘上输入任何内容,它每次都会返回值“0”。

4

1 回答 1

0

阶乘函数的退出条件是n == 1n参数在哪里)。因此,如果您调用值为 0 的函数(就像您现在所做的那样,因为您已定义LOL为 0),则需要很长时间才能n达到 1(大约 40 亿次递归调用)。
在此之前,您的程序很可能会耗尽其分配的堆栈空间。

要么将退出条件更改为n <= 1,要么确保永远不会将 0 传递给函数。

于 2013-03-19T18:29:21.247 回答