Обнаружить переполнение сборки? - PullRequest
1 голос
/ 07 марта 2011

Я пишу программу сборки, которая вычисляет числа Фибоначчи, но мне нужно найти способ обнаружить переполнение, когда числа становятся слишком большими.Мой текущий код:

.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

Ответы [ 2 ]

4 голосов
/ 07 марта 2011

, поскольку вы используете рекурсию, я подозреваю, что стек - это то, что переполняется, вызывая вашу ошибку.Вторая мысль: когда вы нажмете на числовое переполнение, вы 're', не очистив сначала свой стек.вместо этого перейдите к «.end»:


.overflow:
    movl $-1, %eax
    jmp .end
1 голос
/ 07 марта 2011

Не уверен, что это решит вашу проблему, но здесь есть несколько опечаток, где вы говорите push вместо pushl.

...