我正在编写一个计算Fibonacci数的汇编程序,但我需要找到一种方法来检测数字过大时的溢出。我目前的代码是:
.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
我以为我可以使用jo测试来查看是否有溢出(第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 :(得分:4)
因为你正在使用递归,我怀疑堆栈是溢出的,导致你的段错误。
<小时/> 第二个想法,当你点击数字溢出时,你'先退后'而不先清理你的筹码。改为跳转到'.end':
.overflow:
movl $-1, %eax
jmp .end
答案 1 :(得分:1)
不确定这会解决你的问题,但是这里有一些拼写错误,你说push而不是pushl。