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

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

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

Помогите пожалуйста сделать задачу. нужно вывести следующий элемент после максимального.
Листинг программы
  1. #include <conio.h>
  2. #include <iostream>
  3. #include "stdlib.h"
  4. #include <ctime>
  5. using namespace std;
  6. int main()
  7. {
  8. setlocale(LC_ALL,"Russian");
  9. int n, max,index=1;
  10. cout << "Введите кол-во элементов массива: ";
  11. cin >> n;
  12. cout << endl;
  13. int *a = NULL;
  14. a = (int*)malloc(n*sizeof(int));
  15. srand(time(NULL));
  16. for (int i=0; i<n; i++)
  17. {
  18. a[i] = rand() % 100 + 1;
  19. cout << a[i] << " ";
  20. }
  21. cout << endl;
  22. _asm{
  23. mov EAX, a
  24. mov EBX, [EAX]
  25. mov EDX, EBX
  26. mov EDI, 1
  27. mov ECX, n
  28. M1:
  29. inc EAX
  30. inc EAX
  31. inc EAX
  32. inc EAX
  33. inc EDI
  34. mov EDX, [EAX]
  35. cmp EBX, EDX
  36. jg M2
  37. mov index, EDI
  38. mov EBX, EDX
  39. M2:
  40. mov max, EBX
  41. loop M1
  42. ; Нахождение максимального из 2х чисел
  43. ;mov EAX, a
  44. ;mov EBX, b
  45. ;cmp EAX, EBX
  46. ;jge M1
  47. ;mov EAX, EBX
  48. ;M1:
  49. ;mov max, EAX
  50.  
  51. }
  52. cout<<endl;
  53. cout<<"Максимальный элемент = "<<max;
  54. cout<<endl;
  55. cout<<"Его индекс = "<<index;
  56. cout<<endl;
  57. free(a);
  58. getch();
  59. }

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

textual
Листинг программы
  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. m1: mov index_max1,ecx
  11. mov index_max2,edx
  12. mov ecx,n
  13. m2: mov edx,[esi+ecx*4]
  14. cmp eax,edx
  15. jg m4
  16. cmp ebx,edx
  17. jl m3
  18. mov eax,edx
  19. mov index_max2,ecx
  20. jmp m4
  21. m3: mov eax,ebx
  22. mov ebx,edx
  23. mov edx,index_max1
  24. mov index_max2,edx
  25. mov index_max1,ecx
  26. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы