我正在写一个计算斐波纳契数字的汇编程序,但我需要找到一种方法来检测溢出时数字变得太大。我当前的代码是:检测装配体溢出?
.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
您发布的代码可以代替您遇到问题的代码。不是一个好主意。修复代码片段,并精确地显示错误发生的位置。 – 2011-03-07 07:13:06
该代码实际上确实导致了分段错误,因为我没有对“movl%eax,%edx”执行溢出检查。然而,我确实修复了它,现在正在使用工作代码进行编辑。 – Swift 2011-03-12 00:54:56
迈克,没有检查,我不相信MOV指令设置或重置任何标志。尽管如此,我不会在程序集中编写代码,所以我很可能是错的。 – 2011-03-12 10:33:20