2011-03-07 49 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。