这是我的完整代码:
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”。