这是我的完整代码:
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"每一次。
答案 0 :(得分:0)
您的阶乘函数的退出条件是n == 1
(其中n
是参数)。因此,如果您调用值为0的函数(正如您现在所做的那样,因为您已将LOL
定义为0),n
达到1之前需要很长时间(大约40亿)递归调用。)在此之前,您的程序很可能耗尽其分配的堆栈空间。
将退出条件更改为n <= 1
,或确保永远不会将0传递给函数。