Как обнаружить условия переполнения в Assembly Langauge X86 - PullRequest
0 голосов
/ 21 марта 2012

У меня есть задание, в котором мы должны написать две функции. Также необходимо определить условия переполнения, используя коды состояния процессора и вернуть 0, чтобы указать, что произошла ошибка. Я был в состоянии написать функции.

 .file  "formula.c"  
    .text
.globl _nCr  
    .def    _nCr;   .scl    2;  .type   32; .endef  
_nCr:  
        pushl   %ebp  
    movl    %esp, %ebp  
    subl    $56, %esp  
    movl    8(%ebp), %eax  
    movl    %eax, (%esp)  
    testl %eax, %eax  
    call    _factorial  
    movl    %eax, -12(%ebp)  
    movl    12(%ebp), %eax  
    addl    $1, %eax  
    movl    %eax, (%esp)  
    call    _factorial  
    movl    %eax, -16(%ebp)  
    movl    12(%ebp), %eax  
    notl    %eax  
    addl    8(%ebp), %eax  
    movl    %eax, (%esp)  
    call    _factorial  
    movl    %eax, -20(%ebp)  
    movl    -16(%ebp), %eax  
    movl    %eax, %edx  
    imull   -20(%ebp), %edx  
    movl    %edx, -28(%ebp)  
    movl    -12(%ebp), %eax  
    movl    %eax, %edx  
    sarl    $31, %edx  
    idivl   -28(%ebp)  
    leave  
    ret  
.globl _factorial   
    .def    _factorial;  .scl    2;     .type   32;     .endef   
_factorial:  
    pushl   %ebp  
    movl    %esp, %ebp  
    subl    $16, %esp  
    movl    $1, -8(%ebp)  
    movl    $1, -4(%ebp)  
    jmp L3  
L4:   
    movl    -8(%ebp), %eax   
    imull   -4(%ebp), %eax  
    movl    %eax, -8(%ebp)  
    addl    $1, -4(%ebp)   
L3:
    movl    -4(%ebp), %eax  
    cmpl    8(%ebp), %eax  
    jle L4  
    movl    -8(%ebp), %eax  
    leave  
    ret  
    .def    ___main;    .scl    2;  .type   32; .endef  
    .section .rdata,"dr"  
    .align 4  

Эта функция в основном делает n!/r!(n-r)!. Переполнение происходит в факториале, когда числа становятся больше. Я просто не понимаю, как бы я установил условия переполнения.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

1) Ваши арифметические команды - это операции, которые потенциально могут установить бит переполнения

2) «JO» (переход при переполнении) и «JNO» (переход при переполнении) позволяют переходить в зависимости от того, произошло переполнение или нет

3) Вы, вероятно, просто установите "% eax" в 0 после "JO".

4) Отлично, отличный ресурс, если вы еще не знакомы с ним:

Программирование с нуля, Джонатан Бартлетт

1 голос
/ 21 марта 2012

В архитектуре x86, когда выполняется арифметическая инструкция, такая как addl 8(%ebp), %eax, коды состояния задаются в слове состояния CPU. Существуют инструкции, поведение которых зависит от кодов условий.

При заданном условии код может иметь альтернативный путь (выполнить ветвь). У x86 есть семейство инструкций условного ветвления под мнемоникой Jxx: JA, JAE, JB, JBE, JC, JCXZ, ..., JZ. Например, JZ означает переход, если ноль: взять ветвь, если инструкция дала нулевой результат, установив флаг нуля. JO - прыжок при переполнении.

Условие также может быть преобразовано в байтовые данные и сохранено в регистр или память. Это полезно для компиляции выражений C, таких как:

 x = (y != 3); /* if (y != 3) x = 1; else x = 0 */

Это выполняется группой инструкций SETx, которые также многочисленны, как условные ветви: SETA, SETAE, SETB, ..., SETZ. Например, SETZ установит данный байт в 1, если нулевое условие истинно. Э.Г.

 seto %bl  /* set bottom byte of B register to 1 if overflow flag set */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...