我正在寫一個計算斐波納契數字的彙編程序,但我需要找到一種方法來檢測溢出時數字變得太大。我當前的代碼是:檢測裝配體溢出?
.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
您發佈的代碼可以代替您遇到問題的代碼。不是一個好主意。修復代碼片段,並精確地顯示錯誤發生的位置。 – 2011-03-07 07:13:06
該代碼實際上確實導致了分段錯誤,因爲我沒有對「movl%eax,%edx」執行溢出檢查。然而,我確實修復了它,現在正在使用工作代碼進行編輯。 – Swift 2011-03-12 00:54:56
邁克,沒有檢查,我不相信MOV指令設置或重置任何標誌。儘管如此,我不會在程序集中編寫代碼,所以我很可能是錯的。 – 2011-03-12 10:33:20