Я пишу программу сборки, которая вычисляет числа Фибоначчи, но мне нужно найти способ обнаружить переполнение, когда числа становятся слишком большими.Мой текущий код:
.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