【问题标题】:Detect assembly overflow?检测程序集溢出?
【发布时间】:2011-07-10 03:51:49
【问题描述】:

我正在编写一个计算斐波那契数的汇编程序,但我需要找到一种方法来检测当数字太大时是否溢出。我当前的代码是:

.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

【问题讨论】:

  • 您发布了有效的代码,而不是您遇到问题的代码。不是一个好主意。修复 sn-p 并显示确切故障发生的位置。
  • 该代码确实导致了分段错误,因为我没有对“movl %eax, %edx”进行溢出检查。但是我确实修复了它,现在我正在使用工作代码进行编辑。
  • 迈克,未经检查,我不相信 MOV 指令设置或重置任何标志。不过,我不再在汇编中编写代码了,所以我很可能是错的。

标签: assembly overflow


【解决方案1】:

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


再想一想,当您遇到数字溢出时,您会在没有先清理堆栈的情况下“退出”。改为跳转到“.end”:

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

【讨论】:

  • 该睡觉了,我想不明白。我相信在我上次编辑时答案是正确的。
【解决方案2】:

不确定这是否能解决您的问题,但这里有几个拼写错误,您说 push 而不是 pushl。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多