Ассемблерная вставка "Произведение массивов" - Assembler

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

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

Помогите пожалуйста сделать ассемблерную вставку части "Произведение массивов"
#include "iostream"
#include "time.h"
#include "iomanip"
#include "conio.h"
 
using namespace std;
void selectSort(int*, int);
int main()
{
    float fTimeStart = clock() / (float)CLOCKS_PER_SEC;
    setlocale(LC_ALL, "Russian");
    int n = 20;
    const int p = 7;
    int *mas = new int[n];
    int *mas2 = new int[n];
    int *mas3 = new int[n];
    srand(time(NULL));
    cout << "Первый массив +7: ";
 
    for (int i = 0; i < n; i++)
    {
        mas[i] = rand() % 50 ;
        mas[i] += p;
        cout << mas[i] << " ";
    }
    cout << "\n\n";
    cout << "Второй массив: ";
    for (int i = 0; i < n; i++)
    {
        mas2[i] = rand() % 50;
        cout << mas2[i] << " ";
    }
    cout << "\n\n";
    cout << "Произведение массивов: ";
    for (int i = 0; i < n; i++)
    {
        mas3[i] = mas[i] * mas2[i];
        cout << mas3[i] << " ";
    }
    cout << "\n\n";
 
    selectSort(mas3, n);
    cout << "Отсортированный массив: ";
    for (int i = 0; i < n; i++)
    {
        cout << mas3[i] << " ";
    }
    cout << "\n";
    float fTimeStop = clock() / (float)CLOCKS_PER_SEC;
    printf("Длительность процесса %f секунд\n", fTimeStop - fTimeStart);
    getchar();
    system("pause");
    return 0;
}

void selectSort(int* perestanovka, int length) 
{
    for (int j = 0; j < length; j++)
    {
        int temp = perestanovka[0]; 
        for (int z = j + 1; z < length; z++)
        {
            if (perestanovka[j] > perestanovka[z])
            {
                temp = perestanovka[j];
                perestanovka[j] = perestanovka[z];
                perestanovka[z] = temp;
            }
        }
    }
}

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

textual
Листинг программы
    mov ecx, n      //ecx = размер массива 
    mov esi, mas    //esi = адрес mas
    mov edi, mas2   //edi = адрес mas2
    mov ebx, mas3   //ebx = адрес mas3
@l: lodsd           //eax = mas[i], esi += 4
    imul    dword ptr [edi] // eax = eax*mas2[i]
    mov [ebx], eax  // mas3[i] = eax
    add edi, 4      // следующий
    add ebx, 4      // элемент
    loop    @l      // цикл по n элементам

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

В данном коде выполняется произведение массивов.

  1. Сначала в регистр ecx записывается размер массива (n).
  2. Затем в регистр esi записывается адрес первого массива (mas), в регистр edi — адрес второго массива (mas2), а в регистр ebx — адрес третьего массива (mas3).
  3. Далее выполняется цикл, в котором каждый элемент первого массива (mas) умножается на соответствующий элемент второго массива (mas2) и записывается в третий массив (mas3).
  4. После каждой итерации к регистрам esi, edi и ebx прибавляется 4, чтобы перейти к следующим элементам массивов.
  5. Цикл продолжается до тех пор, пока не будет выполнено условие завершения цикла (loop).

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


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

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

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