2011-03-07 56 views
1

我正在寫一個計算斐波納契數字的彙編程序,但我需要找到一種方法來檢測溢出時數字變得太大。我當前的代碼是:檢測裝配體溢出?

.file "fib.c" 
.text 
.globl fib 
    .type fib, @function 
fib: 
    pushl %ebp 
    movl %esp, %ebp 
    movl 8(%ebp), %eax 
    cmpl $0, %eax 
    je .end 
    cmpl $1, %eax 
    je .end 

    pushl %edx 

    subl $1, %eax 
    push %eax 
    call fib 
    popl %ebx 
    movl %eax, %edx 

    movl 8(%ebp), %eax 
    subl $2, %eax 
    push %eax 
    call fib 
    popl %ebx 
    addl %edx, %eax 
    jo .overflow 
    popl %edx 

.end: 
    movl %ebp, %esp 
    popl %ebp 
    ret 
.overflow: 
    movl $-1, %eax 
    ret 

我想我可以只使用祚測試,看看是否有溢出(約25行),但我得到一個分段錯誤,當我輸入的號碼應溢出。

任何想法,我可以做到這一點是否正確? (順便說一句,在32位機器上運行,如果該事項)

謝謝, 邁克

編輯: 對於任何人誰是有興趣,這裏是工作版本。我沒有清除堆棧,並且在第一次計算後我沒有檢查movl上的溢出。

.file "fib.c" 
.text 
.globl fib 
    .type fib, @function 
fib: 
    pushl %ebp 
    movl %esp, %ebp 
    movl 8(%ebp), %eax 
    cmpl $0, %eax 
    je .end 
    cmpl $1, %eax 
    je .end 

    pushl %edx 

    subl $1, %eax 
    pushl %eax 
    call fib 
    popl %ebx 
    movl %eax, %edx 
    jo .overflow 

    movl 8(%ebp), %eax 
    subl $2, %eax 
    pushl %eax 
    call fib 
    popl %ebx 
    addl %edx, %eax 
    jo .overflow 
    popl %edx 

.end: 
    movl %ebp, %esp 
    popl %ebp 
    ret 
.overflow: 
    movl $-1, %eax 
    movl $-1, %edx 
    jmp .end 
+0

您發佈的代碼可以代替您遇到問題的代碼。不是一個好主意。修復代碼片段,並精確地顯示錯誤發生的位置。 – 2011-03-07 07:13:06

+0

該代碼實際上確實導致了分段錯誤,因爲我沒有對「movl%eax,%edx」執行溢出檢查。然而,我確實修復了它,現在正在使用工作代碼進行編輯。 – Swift 2011-03-12 00:54:56

+0

邁克,沒有檢查,我不相信MOV指令設置或重置任何標誌。儘管如此,我不會在程序集中編寫代碼,所以我很可能是錯的。 – 2011-03-12 10:33:20

回答

4

因爲您正在使用遞歸,我懷疑堆棧是什麼溢出,導致您的段錯誤。


第二個想法,當你點擊數字溢出時,你'ret'沒有首先清理你的堆棧。跳轉到'.end'代替:


.overflow: 
    movl $-1, %eax 
    jmp .end 
+0

時間讓我有一些睡眠,我想不起清楚。我相信我的最後一次編輯的答案是正確的。 – 2011-03-07 07:38:54

1

不知道的,這將解決您的問題,但有幾個錯別字的在這兒,你說推,而不是pushl。