Ассемблерная вставка работает неправильно - Assembler

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

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

Имеется такой код:
#include <conio.h> // Для работы с функцией _getch()
#include <cstdio> // Для операций ввода-вывода
#include <math.h> // Для математических операций в С++
#include <iostream> // Для работы функций cin, cout
using namespace std; // Для работы функций cin, cout без "std::"

int main()
{
    setlocale(LC_ALL, "Russian"); // Подключаем русский язык
    unsigned int A[3] = { 1, 2, 3 }; // Заводим неотрицательный массив А из трёх элементов: 1, 2, 3
    unsigned int B[3] = { 1, 2, 3 }; // Заводим неотрицательный массив В из трёх элементов: 1, 2, 3 
    unsigned int i = 3, ASM_r=0, C_r=0, x, y; // Объявляем переменные и значение i – счетчик элементов массива  
 
    cout << "Вычислите выражение:  сумма чисел масива (Ai*X^i) +  сумма чисел массива (Bi*X) " << endl;
    cout << "Введите через пробел x, y: " << endl; //Ввод значений с клавиатуры
    cin >> x >> y;
    cout << "x=" << x << " y=" << y << endl; // Выводим введенные значения для проверки
    cout << endl;
 
    for (int i = 0; i < 3; i++) C_r += A[i] * pow(x, i + 1) + B[i] * y; // Считаем на С++
 
    _asm            // Ассемблерная вставка
    {
            xor ebx, ebx // Очищаем ebx
            xor edx, edx // Очищаем edx
            mov ecx, i // Перемещаем i=3 в ecx
 
        l1:             // Метка - это начало цикла; точка программы, к которой вернется код по условию
            mov eax, x  // заносим значение x в eax
            cmp ecx, 3 //сравнить счетчик с 3
            je x3  // перейти на метку x3
            mov eax, x  // заносим значение x в  eax
            cmp ecx, 2 //сравнить счетчик с 2
            je x2  // перейти на метку x2   
 
        l2:            // сюда после вычисления x^i
            mul A[ecx * 4 - 4]  // Ai*x^i
            add ebx, eax   // суммируем (Ai-1 * x^(i-1) )  +   (Ai * x^i  ),    результат в ebx    i=3,2,1
            mov eax, B[ecx * 4 - 4] // Перемещаем в eax содержимое массива Bi 
            mul y // Умножаем Bi*y,  результат в eax
            add edx, eax  // Bi-1*y  + Bi*y,  результат  в edx при i=3,2,1
 
            dec ecx // Уменьшаем ecx на единицу
            jnz l1 // Прыжок по метке 
            jmp itog  // безусловный переход
 
        x3: 
            mul x   //вычисление x^3
 
        x2: 
            mul x   //вычисление x^2
            jmp l2 // безусловный переход
      
    Itog:
            add ebx, edx  // итоговое сложение ∑ (Ai * x^i)  + ∑ (Bi * y), результат в ebx
            mov ASM_r, ebx // Перемещаем содержимое ebx в r для дальнейшего вывода на экран
    }
 
    cout << "Результат ASM: " << ASM_r << endl; // Вывод результата выражения
    cout << "Результат C++: " << C_r << endl; // Вывод результата выражения
 
    _getch(); // Ожидание нажатия клавиши после выполнения программы
}
Выражение, которое считает и С++, и ассемблер: ∑ (Ai * x^i) + ∑ (Bi * y), где i = 1,2,3 На выходе при х=1, y=1 значения выходят разные. Считаю в тетрадке - Си оказывается прав. Понятия не имею в каком месте я мог ошибиться... Исправьте, пожалуйста.

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

textual
Листинг программы
add ebx, eax

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


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

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

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