Обращение к элементу массива (встроенный 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;
}

Объяснение кода листинга программы

  1. Объявление функции func с двумя аргументами: double *mas (указатель на массив double) и int index (целочисленный индекс).
  2. Объявление переменных: double cp (для хранения результата), а также esi, edi и eax (для работы с памятью и выполнения операций).
  3. Компилятор подключает заголовочный файл iostream, который позволяет использовать функции ввода-вывода из стандартной библиотеки C++.
  4. Вызов функции func в функции main с аргументами A и 2.
  5. Объявление массива A с пятью элементами, инициализированными значениями 0.5, -3, 1.3, 22 и -6.4.
  6. Вывод результата выполнения функции func на экран с помощью функции cout.
  7. Ожидание нажатия клавиши для выхода из программы с помощью функции system(pause).
  8. Возврат значения 0, что означает успешный конец работы программы.

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


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

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

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