В заданной конечной последовательности целых чисел найти минимальный и максимальный элементы и поменять их местами - Assembler
Формулировка задачи:
В заданной конечной последовательности целых чисел найти минимальный и максимальный элементы и поменять их местами.
Помогите пожалуйста, MASM Решение задачи: «В заданной конечной последовательности целых чисел найти минимальный и максимальный элементы и поменять их местами»
textual
Листинг программы
.686 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data N dd 16 Array dd 6, -51, 87, 3, -90, -23, 60, 8, -36, -51, -71, -95, 2, 98, -15, -25 aszMsgInstant db 0Dh, 0Ah, 'Instant:', 0Dh, 0Ah, 0 aszMsgResult db 0Dh, 0Ah, 'Result:', 0Dh, 0Ah, 0 aszInteger db '%4d', 0 aszPressEnter db 0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0 dwColor dd FOREGROUND_RED dwCursorPosition COORD <20, 10> .data? hConsoleOutput HANDLE ? hConsoleInput HANDLE ? Result dd ? Buffer db 1024 dup(?) BufLen dd ? .code ShowArray proc lpArray:DWORD, uiAmount:DWORD pushad mov ecx, [uiAmount] mov esi, [lpArray] @@ForI: push ecx lodsd invoke wsprintf, ADDR Buffer, ADDR aszInteger, eax invoke StrLen, ADDR Buffer mov [BufLen], eax invoke WriteConsole, hConsoleOutput, ADDR Buffer,\ BufLen, ADDR BufLen, NULL pop ecx loop @@ForI popad ret ShowArray endp main proc ; получение описателей ввода и вывода консоли invoke GetStdHandle, STD_INPUT_HANDLE mov hConsoleInput, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov hConsoleOutput, eax invoke ClearScreen ;вывод исходных данных invoke WriteConsole, hConsoleOutput, ADDR aszMsgInstant,\ LENGTHOF aszMsgInstant - 1, ADDR BufLen, NULL invoke ShowArray, ADDR Array, [N] ;обработка: поиск минимального и максимального элементов массива ;а также их индексов mov ecx, [N] mov eax, 0 mov ebx, [Array] ;min mov edx, ebx ;max mov esi, eax ;Imin mov edi, eax ;Imax @@ForI: ;ebx=min(ebx, Array[eax])=((ebx) < (Array[eax]) ? (ebx) : (Array[eax])) ;esi=((ebx) < (Array[eax]) ? (esi) : (eax)) cmp ebx, Array[eax*4] cmovg ebx, Array[eax*4] cmovg esi, eax ;edx=max(edx, Array[eax])=((edx) < (Array[eax]) ? (edx) : (Array[eax])) ;edi=((edx) < (Array[eax]) ? (edi) : (eax)) cmp edx, Array[eax*4] cmovl edx, Array[eax*4] cmovl edi, eax inc eax loop @@ForI ;обмен местами минимального и максимального элементов lea esi, Array[esi*4] lea edi, Array[edi*4] push [esi] mov eax, [edi] mov [esi],eax pop [edi] ;вывод результата invoke WriteConsole, hConsoleOutput, ADDR aszMsgResult,\ LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL invoke ShowArray, ADDR Array, [N] ;ожидание нажатия ENTER invoke WriteConsole, hConsoleOutput, ADDR aszPressEnter,\ LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL invoke ReadConsole, hConsoleInput, ADDR Buffer,\ LENGTHOF Buffer, ADDR BufLen, NULL invoke ExitProcess, 0 main endp end main
Объяснение кода листинга программы
- Код написан на ассемблере.
- Задана последовательность целых чисел, которая хранится в массиве.
- Необходимо найти минимальный и максимальный элементы в массиве, а также их индексы.
- Минимальный и максимальный элементы помещаются на соответствующие позиции в массиве.
- Для поиска минимума и максимума используется цикл, который перебирает все элементы массива.
- Внутри цикла используются команды сравнения и переходов для определения минимального и максимального элементов.
- После нахождения минимума и максимума выполняется обмен местами этих элементов.
- Результат выводится на экран.
- Пользователю предлагается нажать ENTER для выхода из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д