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

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

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

Имеется такой код:
Листинг программы
  1. #include <conio.h> // Для работы с функцией _getch()
  2. #include <cstdio> // Для операций ввода-вывода
  3. #include <math.h> // Для математических операций в С++
  4. #include <iostream> // Для работы функций cin, cout
  5. using namespace std; // Для работы функций cin, cout без "std::"
  6.  
  7. int main()
  8. {
  9. setlocale(LC_ALL, "Russian"); // Подключаем русский язык
  10. unsigned int A[3] = { 1, 2, 3 }; // Заводим неотрицательный массив А из трёх элементов: 1, 2, 3
  11. unsigned int B[3] = { 1, 2, 3 }; // Заводим неотрицательный массив В из трёх элементов: 1, 2, 3
  12. unsigned int i = 3, ASM_r=0, C_r=0, x, y; // Объявляем переменные и значение i – счетчик элементов массива
  13. cout << "Вычислите выражение: сумма чисел масива (Ai*X^i) + сумма чисел массива (Bi*X) " << endl;
  14. cout << "Введите через пробел x, y: " << endl; //Ввод значений с клавиатуры
  15. cin >> x >> y;
  16. cout << "x=" << x << " y=" << y << endl; // Выводим введенные значения для проверки
  17. cout << endl;
  18. for (int i = 0; i < 3; i++) C_r += A[i] * pow(x, i + 1) + B[i] * y; // Считаем на С++
  19. _asm // Ассемблерная вставка
  20. {
  21. xor ebx, ebx // Очищаем ebx
  22. xor edx, edx // Очищаем edx
  23. mov ecx, i // Перемещаем i=3 в ecx
  24. l1: // Метка - это начало цикла; точка программы, к которой вернется код по условию
  25. mov eax, x // заносим значение x в eax
  26. cmp ecx, 3 //сравнить счетчик с 3
  27. je x3 // перейти на метку x3
  28. mov eax, x // заносим значение x в eax
  29. cmp ecx, 2 //сравнить счетчик с 2
  30. je x2 // перейти на метку x2
  31. l2: // сюда после вычисления x^i
  32. mul A[ecx * 4 - 4] // Ai*x^i
  33. add ebx, eax // суммируем (Ai-1 * x^(i-1) ) + (Ai * x^i ), результат в ebx i=3,2,1
  34. mov eax, B[ecx * 4 - 4] // Перемещаем в eax содержимое массива Bi
  35. mul y // Умножаем Bi*y, результат в eax
  36. add edx, eax // Bi-1*y + Bi*y, результат в edx при i=3,2,1
  37. dec ecx // Уменьшаем ecx на единицу
  38. jnz l1 // Прыжок по метке
  39. jmp itog // безусловный переход
  40. x3:
  41. mul x //вычисление x^3
  42. x2:
  43. mul x //вычисление x^2
  44. jmp l2 // безусловный переход
  45. Itog:
  46. add ebx, edx // итоговое сложение ∑ (Ai * x^i) + ∑ (Bi * y), результат в ebx
  47. mov ASM_r, ebx // Перемещаем содержимое ebx в r для дальнейшего вывода на экран
  48. }
  49. cout << "Результат ASM: " << ASM_r << endl; // Вывод результата выражения
  50. cout << "Результат C++: " << C_r << endl; // Вывод результата выражения
  51. _getch(); // Ожидание нажатия клавиши после выполнения программы
  52. }
Выражение, которое считает и С++, и ассемблер: ∑ (Ai * x^i) + ∑ (Bi * y), где i = 1,2,3 На выходе при х=1, y=1 значения выходят разные. Считаю в тетрадке - Си оказывается прав. Понятия не имею в каком месте я мог ошибиться... Исправьте, пожалуйста.

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

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

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


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

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

7   голосов , оценка 3.571 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы