【发布时间】: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 指令设置或重置任何标志。不过,我不再在汇编中编写代码了,所以我很可能是错的。