Обращение к элементу массива (встроенный Assembler)
Формулировка задачи:
Изучаю ассемблер. В этой задаче хочу в переменную ср положить какой-то элемент массива(массив и индекс элемента передаю в функцию), но выводит неверно. Например, если index=2, то выводит -9.22596e+61, хотя второй элемент равен 44(если с нуля считать).Где ошибка?
#include "stdafx.h" #include "iostream" using namespace std; double func(double *mas1, double index) { double cp; _asm { lea esi, mas1//кладу в esi адрес первого элемента массива mas1 mov edx, dword ptr [index]//в edx помещаю индекс элемента, который хочу положить в cp mov eax, mas1[edx * 4]//заношу нужный элемент массива в регистр mov dword ptr [cp], eax } cout << cp << endl; return *mas1; } int main() { int n; cout << "enter n: "; cin >> n; double mas1[10] = { 22, 100, 44, 15, 2, 36, 53, 23, 82, 5 }; func(mas1, 2); for (int i = 0; i < n; i++) cout << mas1[i] << " "; return 0; }
Решение задачи: «Обращение к элементу массива (встроенный Assembler)»
textual
Листинг программы
#include <iostream> using namespace std; double func(double *mas, int index) { double cp; _asm { push esi push edi push eax mov esi,mas mov eax,index shl eax,3 add esi,eax lea edi,cp cld movsd movsd pop eax pop edi pop esi } return cp; } int main() { double A[5]={0.5, -3, 1.3, 22, -6.4}; cout<<func(A,2)<<endl; system("pause"); return 0; }
Объяснение кода листинга программы
- Объявление функции func с двумя аргументами: double *mas (указатель на массив double) и int index (целочисленный индекс).
- Объявление переменных: double cp (для хранения результата), а также esi, edi и eax (для работы с памятью и выполнения операций).
- Компилятор подключает заголовочный файл iostream, который позволяет использовать функции ввода-вывода из стандартной библиотеки C++.
- Вызов функции func в функции main с аргументами A и 2.
- Объявление массива A с пятью элементами, инициализированными значениями 0.5, -3, 1.3, 22 и -6.4.
- Вывод результата выполнения функции func на экран с помощью функции cout.
- Ожидание нажатия клавиши для выхода из программы с помощью функции system(
pause
). - Возврат значения 0, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д