Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 汇编程序代码,输入代码时的值错误,阶乘_Linux_Assembly_X86_Segmentation Fault_Push - Fatal编程技术网

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

Linux 汇编程序代码,输入代码时的值错误,阶乘,linux,assembly,x86,segmentation-fault,push,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 $ST

这是我的全部代码:

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更改为例如pushl$4,它将计算正常阶乘。我可以将代码从键盘更改为程序来输入值吗

@编辑 我改变了这个片段:

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

pushl %eax

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

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


要么将退出条件更改为
n,STDIN是否需要为1才能使用键盘?抱歉,已经有一段时间了。嗯,我可以在键盘和程序之间输入一个值。那就是分段错误。你可能是对的,我的装配技术真的很差。我是这样看的:我创建一个变量LOL,将其设置为0。然后我在键盘上输入例如“3”,它进入ecx,我把它放入eax,从eax我把它再次放入LOL,它应该是3。当然不是。。请检查我更改的代码。每次输入任何内容时,我都不会返回值“0”。我也将代码末尾更改为“cmpl$1,%eax jle end_silnia”,但对我来说,唯一的值是“0”,而且我现在尝试输入更简单的数字,比如3/4/5。唯一的问题是“从键盘读取”可能不起作用,因为如果我将静态数字输入PUSH-L,它会工作得很好。我的答案是为了消除分段错误。我不知道为什么你的文本输入不起作用,但是你应该检查每个系统调用的结果。例如,
read
系统调用在
eax
中返回读取的字节数或错误代码。为什么我不能在没有得到分段失败错误的情况下推送示例(%ecx)?