Ассемблерная вставка работает неправильно - Assembler
Формулировка задачи:
Имеется такой код:
Выражение, которое считает и С++, и ассемблер: ∑ (Ai * x^i) + ∑ (Bi * y), где i = 1,2,3
На выходе при х=1, y=1 значения выходят разные. Считаю в тетрадке - Си оказывается прав. Понятия не имею в каком месте я мог ошибиться... Исправьте, пожалуйста.
#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(); // Ожидание нажатия клавиши после выполнения программы }
Решение задачи: «Ассемблерная вставка работает неправильно»
textual
Листинг программы
add ebx, eax
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д