Массив: вывести следующий элемент после максимального (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
Объяснение кода листинга программы
- 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 - обмен значениями счётчика и указателя на следующий элемент
- mov index_max1,ecx - сохранение значения счётчика в переменной index_max1
- mov index_max2,edx - сохранение значения указателя на следующий элемент в переменной index_max2
- mov ecx,n - инициализация счётчика размерности массива
- mov edx,[esi+ecx*4] - получение значения элемента массива по индексу, увеличенному на 4
- cmp eax,edx - сравнение текущего элемента и элемента, на который указывает index_max2
- jg m4 - переход к блоку обработки, если текущий элемент больше
- cmp ebx,edx - сравнение индексов текущего и предыдущего элементов
- jl m3 - переход к блоку обработки, если индекс текущего элемента меньше
- mov eax,ebx - копирование значения индекса предыдущего элемента
- mov ebx,edx - копирование значения индекса следующего элемента
- mov edx,index_max1 - восстановление значения счётчика
- mov index_max2,edx - восстановление значения указателя на следующий элемент
- loop m2 - переход к началу цикла обработки элементов массива
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д