Массив: вывести следующий элемент после максимального (asm-вставки) - Assembler

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

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

Помогите пожалуйста сделать задачу. нужно вывести следующий элемент после максимального.
#include <conio.h>
#include <iostream>
#include "stdlib.h"
#include <ctime>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int n, max,index=1;
    cout << "Введите кол-во элементов массива: ";
    cin >> n;
    cout << endl;
 
    int *a = NULL;
    a = (int*)malloc(n*sizeof(int));
 
    srand(time(NULL));
    for (int i=0; i<n; i++)
    {
        a[i] = rand() % 100 + 1;
        cout << a[i] << " "; 
    }
    cout << endl;
    
    _asm{
        mov EAX, a
        mov EBX, [EAX]
        mov EDX, EBX
        mov EDI, 1
        mov ECX, n
    M1:
        inc EAX
        inc EAX
        inc EAX
        inc EAX
        inc EDI
        mov EDX, [EAX]
        cmp EBX, EDX
        jg M2
        mov index, EDI
        mov EBX, EDX
    M2: 
        mov max, EBX
        loop M1
 
        ; Нахождение максимального из 2х чисел
        ;mov EAX, a
        ;mov EBX, b
        ;cmp EAX, EBX
        ;jge M1
        ;mov EAX, EBX
        ;M1: 
        ;mov max, EAX

    }
    cout<<endl;
    cout<<"Максимальный элемент = "<<max;
    cout<<endl;
    cout<<"Его индекс = "<<index;
    cout<<endl;
    free(a);
    getch();
    
}

Решение задачи: «Массив: вывести следующий элемент после максимального (asm-вставки)»

textual
Листинг программы
xor ecx,ecx
lea edx,[ecx+1]
mov esi,a
mov ebx,[esi]
mov eax,[esi+4]
cmp ebx,eax
jg m1
xchg eax,ebx
xchg ecx,edx
m1: mov index_max1,ecx
mov index_max2,edx
mov ecx,n
m2: mov edx,[esi+ecx*4]
cmp eax,edx
jg m4
cmp ebx,edx
jl m3
mov eax,edx
mov index_max2,ecx
jmp m4
m3: mov eax,ebx
mov ebx,edx
mov edx,index_max1
mov index_max2,edx
mov index_max1,ecx
m4: loop m2

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

  1. xor ecx,ecx - инициализация счётчика
  2. lea edx,[ecx+1] - получение адреса следующего элемента массива
  3. mov esi,a - получение ссылки на начало массива
  4. mov ebx,[esi] - получение значения первого элемента массива
  5. mov eax,[esi+4] - получение значения второго элемента массива
  6. cmp ebx,eax - сравнение первых двух элементов массива
  7. jg m1 - переход к блоку обработки, если первый элемент больше второго
  8. xchg eax,ebx - обмен значениями первого и второго элементов
  9. xchg ecx,edx - обмен значениями счётчика и указателя на следующий элемент
  10. mov index_max1,ecx - сохранение значения счётчика в переменной index_max1
  11. mov index_max2,edx - сохранение значения указателя на следующий элемент в переменной index_max2
  12. mov ecx,n - инициализация счётчика размерности массива
  13. mov edx,[esi+ecx*4] - получение значения элемента массива по индексу, увеличенному на 4
  14. cmp eax,edx - сравнение текущего элемента и элемента, на который указывает index_max2
  15. jg m4 - переход к блоку обработки, если текущий элемент больше
  16. cmp ebx,edx - сравнение индексов текущего и предыдущего элементов
  17. jl m3 - переход к блоку обработки, если индекс текущего элемента меньше
  18. mov eax,ebx - копирование значения индекса предыдущего элемента
  19. mov ebx,edx - копирование значения индекса следующего элемента
  20. mov edx,index_max1 - восстановление значения счётчика
  21. mov index_max2,edx - восстановление значения указателя на следующий элемент
  22. loop m2 - переход к началу цикла обработки элементов массива

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


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

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

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