В массиве найти два элемента, стоящих друг за другом, сумма которых больше максимального числа - Assembler

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

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

В массиве D[0..N-1] найти, есть ли два элемента, стоящих друг за другом, сумма которых больше максимального числа (максимальное значение массива при этом не должно совпадать с одним из этих элементов). Вывести на экран эти значения и их номера. Если таких нет, то сообщить об этом. Помогите кто может, только начал ассемблер изучать, возможно задача и простая, но у меня не выходит ее сделать.

Решение задачи: «В массиве найти два элемента, стоящих друг за другом, сумма которых больше максимального числа»

textual
Листинг программы
#include "stdafx.h"
# include <conio.h>
# include <stdio.h>
# include <stdlib.h>
const int n = 10;
int main()
{
    int mas[n], i, max, sum;
    for (i = 0; i<n; i++)
    {
        mas[i] = rand() % 100 - 50;
        printf("%d\n", mas[i]);
    }
    _asm {
            lea esi, mas
            mov ebx, [esi]
            mov ecx, n
        M1 :
            lodsd
            cmp eax, ebx
            jle M2
            mov ebx, eax
        M2 :
            mov max, ebx
            loop M1
    
 
    }
    printf("\nMax: %d\n\n", max);
    _getch();
    return 0;
}

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

  1. Объявлены переменные: — mas[n] - массив на 10 элементов, инициализированный случайными числами от -50 до 50; — i - счётчик для цикла; — max - переменная для хранения максимального числа; — sum - переменная для хранения суммы двух найденных чисел.
  2. Выполняется цикл по массиву.
  3. Код на ассемблере начинается с lea esi, mas — указывает, что в качестве стека будет использоваться массив mas.
  4. mov ebx, [esi] — в переменную ebx записывается значение первого элемента массива.
  5. mov ecx, n — в переменную ecx записывается общее количество элементов в массиве (n).
  6. M1: — это метка цикла.
  7. lodsd — в переменную eax загружается следующий элемент массива.
  8. cmp eax, ebx — сравниваются текущий и предыдущий элементы массива. Если текущий меньше предыдущего, то цикл продолжается.
  9. jle M2 - если текущий элемент меньше предыдущего, то происходит переход на метку M2.
  10. mov ebx, eax — в переменную ebx записывается текущий элемент массива.
  11. M2: — это метка, на которую происходит переход, если текущий элемент больше предыдущего.
  12. mov max, ebx — в переменную max записывается текущий элемент массива, который является максимальным.
  13. loop M1 - происходит переход на метку M1, и так до тех пор, пока не будет найден элемент, меньший предыдущего.
  14. Выводится сообщение с максимальным числом.
  15. Выполняется функция _getch(), которая ожидает нажатия клавиши.
  16. Возвращается 0, что означает успешный конец работы программы.

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

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