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