В заданной конечной последовательности целых чисел найти минимальный и максимальный элементы и поменять их местами - 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

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

  1. Код написан на ассемблере.
  2. Задана последовательность целых чисел, которая хранится в массиве.
  3. Необходимо найти минимальный и максимальный элементы в массиве, а также их индексы.
  4. Минимальный и максимальный элементы помещаются на соответствующие позиции в массиве.
  5. Для поиска минимума и максимума используется цикл, который перебирает все элементы массива.
  6. Внутри цикла используются команды сравнения и переходов для определения минимального и максимального элементов.
  7. После нахождения минимума и максимума выполняется обмен местами этих элементов.
  8. Результат выводится на экран.
  9. Пользователю предлагается нажать ENTER для выхода из программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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