В массиве найти два элемента, стоящих друг за другом, сумма которых больше максимального числа - 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; }
Объяснение кода листинга программы
- Объявлены переменные: — mas[n] - массив на 10 элементов, инициализированный случайными числами от -50 до 50; — i - счётчик для цикла; — max - переменная для хранения максимального числа; — sum - переменная для хранения суммы двух найденных чисел.
- Выполняется цикл по массиву.
- Код на ассемблере начинается с lea esi, mas — указывает, что в качестве стека будет использоваться массив mas.
- mov ebx, [esi] — в переменную ebx записывается значение первого элемента массива.
- mov ecx, n — в переменную ecx записывается общее количество элементов в массиве (n).
- M1: — это метка цикла.
- lodsd — в переменную eax загружается следующий элемент массива.
- cmp eax, ebx — сравниваются текущий и предыдущий элементы массива. Если текущий меньше предыдущего, то цикл продолжается.
- jle M2 - если текущий элемент меньше предыдущего, то происходит переход на метку M2.
- mov ebx, eax — в переменную ebx записывается текущий элемент массива.
- M2: — это метка, на которую происходит переход, если текущий элемент больше предыдущего.
- mov max, ebx — в переменную max записывается текущий элемент массива, который является максимальным.
- loop M1 - происходит переход на метку M1, и так до тех пор, пока не будет найден элемент, меньший предыдущего.
- Выводится сообщение с максимальным числом.
- Выполняется функция _getch(), которая ожидает нажатия клавиши.
- Возвращается 0, что означает успешный конец работы программы.