Есть матрица 3х3. Найти разницу максимального и минимального элемента матрицы - Assembler

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

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

Завтра на зачёт нужно решить задачу : условие "Есть матрица 3х3. Найти разницу максимального и минимального элемента матрицы.". Зачёт не по предмету Assembler...нет( Нас ему даже не учили . Поэтому я полный ноль. Помогите.

Решение задачи: «Есть матрица 3х3. Найти разницу максимального и минимального элемента матрицы»

textual
Листинг программы
.486
.model flat, stdcall
option casemap :none
 
        include d:\masm32\include\windows.inc
 
        include d:\masm32\include\user32.inc
        include d:\masm32\include\kernel32.inc
        include d:\masm32\include\masm32.inc
 
        includelib d:\masm32\lib\user32.lib
        includelib d:\masm32\lib\kernel32.lib
        includelib d:\masm32\lib\masm32.lib
.data
        aszPressLeftAlt db      0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0
        aszMsgResult    db      'Result: ', 0
 
        Matrix          dd      1, 2, 5
                        dd      3, 2, 0
                        dd      3, 3, 4
        Max             dd      ?
        Min             dd      ?
        Result          dd      ?
 
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
 
.code
start:
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
        ;очистка экрана
        invoke  ClearScreen
 
        ;помск минимума и максимума
        lea     ebx,    [Matrix]
        mov     eax,    [ebx]
        mov     [Min],  eax
        mov     [Max],  eax
        mov     edi,    4*3     ;длина строки в байтах (размер элемента умножить на количество)
        mov     ecx,    3
        @@ForI:
                push    ecx
                mov     ecx,    3
                mov     esi,    0
                @@ForJ:
                        mov     eax,    [ebx+4*esi]
                @@TestMin:
                        cmp     eax,    [Min]
                        jge     @@TestMax
                        mov     [Min],  eax
                @@TestMax:
                        cmp     eax,    [Max]
                        jle     @@Next
                        mov     [Max],  eax
                @@Next:
                        inc     esi
                loop    @@ForJ
 
                pop     ecx
                add     ebx,    edi
 
        loop    @@ForI
        ;вычисение разности
        mov     eax,    [Max]
        sub     eax,    [Min]
        mov     [Result],       eax
 
        ;вывод результата
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
        invoke  ltoa, [Result], ADDR Buffer
        invoke  StrLen, ADDR Buffer
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        ;ожидание нажатия Left Alt
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\
                LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL
        @@WaitForLAlt:
                invoke  GetAsyncKeyState, VK_LMENU
                and     eax,    8000h
        jz      @@WaitForLAlt
 
        invoke  ExitProcess, 0
 
end     start

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

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