Функция с ассемблерной вставкой выдает неправильное значение - Assembler

Узнай цену своей работы

Формулировка задачи:

а=1, b=5 Должно выдавать 90, но выдает 216 // сама функция
bool LeftExpr(int a, int b, long *result)
{
    __asm{
        //(a + b) ^ 3 - a ^ 3 - b ^ 3
        mov eax, [ebp + 8]
        mov ebx, [ebp + 12]
            mov ecx, eax//ecx=a
                add ecx, ebx//ecx=a+b
                mov eax, ecx//eax=a+b
                imul ecx//eax=(a+b)^2
                jo ERROR
                imul ecx//eax=(a+b)^3
                jo ERROR
                mov ecx, eax//ecx=(a+b)^3
                mov eax, [ebp + 8]//eax=a
                mov edx, eax//edx=a
                imul edx//eax=a^2
                jo ERROR
                imul edx//eax=a^3
                jo ERROR
                sub ecx, eax//ecx=(a+b)^3-a^3
                mov eax, [ebp + 12]//eax=b
                mov edx, eax//edx=b
                imul edx//eax=b^2
                jo ERROR
                imul edx//eax=b^3
                jo ERROR
                sub ecx, eax//(a+b)^3-a^3-b^3
                mov eax, [ebp + 16]
                mov [eax], ecx
                mov al, 0
                jmp EXIT
            ERROR :
            mov al, 1
            EXIT :
    }
}
Есть сомнения по поводу корректности записи в последний аргумент.

Решение задачи: «Функция с ассемблерной вставкой выдает неправильное значение»

textual
Листинг программы
// Watcom C
bool LeftExpr(int a, int b, long *result)
{
    __asm{
    //(a    + b) ^ 3 - a ^ 3 - b ^ 3
    mov eax, a
    add eax, b
    mov ecx, eax    //ecx=a+b
    imul    eax,ecx
    imul    eax,ecx     // eax = (a+b)^3
    jo  done    
    mov ebx, a
    imul    ebx, ebx
    imul    ebx, a      // ebx = a^3
    jo  done
    mov ecx, b
    imul    ecx, ecx
    imul    ecx, b      // ecx = b^3
    jo  done
    sub eax, ebx
    sub eax, ecx
    mov ebx, result
    mov [ebx], eax
done:   mov eax, 0
    seto    al
    }
};

Объяснение кода листинга программы

Вот список действий, которые выполняются в этом коде:

  1. Переменная a сохраняется в регистре EAX.
  2. Переменная b сохраняется в регистре EBX.
  3. Результат выражения (a + b) сохраняется в регистре ECX.
  4. Результат возведения в куб (a + b) сохраняется в регистре EAX.
  5. Если результат возведения в куб (a + b) больше или равен 255, то выполняется переход к метке done.
  6. Результат возведения в куб переменной a сохраняется в регистре EBX.
  7. Если результат возведения в куб переменной a больше или равен 255, то выполняется переход к метке done.
  8. Результат возведения в куб переменной b сохраняется в регистре ECX.
  9. Если результат возведения в куб переменной b больше или равен 255, то выполняется переход к метке done.
  10. Результат выражения (a + b) уменьшается на результат возведения в куб переменной a.
  11. Результат выражения (a + b) уменьшается на результат возведения в куб переменной b.
  12. Результат сохраняется в памяти по адресу, указанному в переменной result.
  13. Результат очищается до нуля.
  14. Код возвращает управление в вызывающую программу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы