Ассемблерная вставка работает неправильно - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д