汇编代码,输入代码时的错误值,阶乘

时间:2013-03-19 17:31:10

标签: linux assembly x86 segmentation-fault push

这是我的完整代码:

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"每一次。

1 个答案:

答案 0 :(得分:0)

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

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