2013-03-19 91 views
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」每次值。

+0

STDIN不需要是1來使用鍵盤嗎?對不起,這是一段時間。 – 2013-03-19 17:39:44

+0

那麼,我可以從鍵盤到程序的價值。然後是分段錯誤。 – 2013-03-19 17:44:06

回答

0

因子函數的退出條件是n == 1(其中n是參數)。因此,如果您調用值爲0的函數(就像您現在這樣做,因爲您已將LOL定義爲0),在n達到1(大約40億次遞歸調用)之前需要很長時間。
您的程序很可能會在這種情況發生之前耗盡其分配的堆棧空間。

要麼將​​退出條件更改爲n <= 1,要麼確保永不將0傳遞給函數。

+0

你可能是對的,我在會議上真的很糟糕。我是這樣看的:我做了一個可變的LOL,將它設置爲0.然後,我在鍵盤上輸入例如「3」,它進入ecx,我把它放入eax,然後從eax再次將它放到LOL上應該是3.這當然不是。請檢查我改變的代碼。每次輸入任何東西時都會返回值「0」。 – 2013-03-19 18:33:51

+0

我改變了代碼的結尾以及「cmpl $ 1,%eax jle end_silnia」但仍然只有它的回聲我的值是「0」 – 2013-03-19 18:39:07

+0

而且更多的事情我嘗試把現在的簡單數字,比如3/4/5。唯一的問題是「從鍵盤讀取」可能不起作用,因爲如果我將靜態數字輸入到pushl中 - 它將工作得很完美。 – 2013-03-19 18:41:04