Массив: вывести следующий элемент после максимального (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 - переход к началу цикла обработки элементов массива
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д