检测组件溢出?

时间:2011-03-07 06:59:37

标签: assembly overflow

我正在编写一个计算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

2 个答案:

答案 0 :(得分:4)

因为你正在使用递归,我怀疑堆栈是溢出的,导致你的段错误。

<小时/> 第二个想法,当你点击数字溢出时,你'先退后'而不先清理你的筹码。改为跳转到'.end':


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

答案 1 :(得分:1)

不确定这会解决你的问题,但是这里有一些拼写错误,你说push而不是pushl。