Определить сумму максимальных элементов столбцов матрицы - Assembler/MASM

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

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

Определить сумму максимальных элементов столбцов матрицы A(3,5). не получается вывезти, поправьте в коде , где ошибка
mov AX,0 ; обнуляем сумму
         mov EBX,0 ; смещение элемента столбца в строке
         mov ECX,5 ; количество столбцов
         CYCL1: push ECX ; сохраняем счетчик
         
         mov ECX,2 ; счетчик элементов в столбце
         mov EDX,D[EBX] ; заносим первый элемент столбца
 
         mov ESI,10 ; смещение второго элемента столбца
         
         CYCL2: cmp EDX,D[EBX]+[ESI] ; сравниваем
         
         jge NEXT ; если больше или равно - к следующему
         mov EDX,D[EBX]+[ESI] ; если меньше, то сохранили
     
         NEXT: add ESI,10 ; переходим к следующему элементу
         
         loop CYCL2 ; цикл по элементам столбца
         add AX,DX ; просуммировали максимальный элемент
         mov result,EAX ;переносим в результат для вывода 
         pop ECX ; восстановили счетчик
         add EBX,2 ; перешли к следующему столбцу
         
         Invoke StdOut,ADDR Msg4         
         Invoke dwtoa, result, ADDR result  ;preobrazuem result iz Sdword v ascii dlya vivoda v konsol'
         Invoke StdOut, ADDR result  ;vivodim result v konsol'
         Invoke StdOut,ADDR resstr2 ;resstr2 = vivod v konsol' s novoy stroki

         loop CYCL1 ; цикл по столбцам

         ;The End

Решение задачи: «Определить сумму максимальных элементов столбцов матрицы»

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
        aszMsgInstant   db      0Dh, 0Ah, 'Matrix:', 0Dh, 0Ah, 0
        aszMsgResult    db      0Dh, 0Ah, 'Result:', 0Dh, 0Ah, 0
        aszInteger      db      '%6d', 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
        aszCrLf         db      0Dh, 0Ah, 0
        aszPromptRows   db      'Matrix rows    = ', 0
        aszPromptCols   db      'Matrix columns = ', 0
        aszInpMatrix    db      'Matrix[%d, %d] = ', 0
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        N               dd      ?
        M               dd      ?
        Matrix          dd       100*100 dup(?)
        Result          dd      ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
 
.code
 
;ввод целого числа
ReadSInt        proc    lptrPrompt:DWORD, iLengthPrompt:DWORD, lptrUInt:DWORD
        pushad
        invoke  WriteConsole, hConsoleOutput, lptrPrompt,\
                iLengthPrompt, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
        lea     esi,    [Buffer]        ;удаление из буфера
        add     esi,    [BufLen]        ;символов перевода строки
        mov     [esi-2],word ptr 0
        invoke  atol,   ADDR Buffer
        mov     esi,    [lptrUInt]
        mov     [esi],  eax
        popad
        ret
ReadSInt        endp
 
ShowMatrix      proc    lpMatrix:DWORD, uiRows:DWORD, uiCols:DWORD
        pushad
        cmp     [uiRows],       0
        je      @@Exit
        cmp     [uiCols],       0
        je      @@Exit
 
        mov     ecx,    [uiRows]
        mov     esi,    [lpMatrix]
        @@ForI:
                push    ecx
                mov     ecx,    [uiCols]
                @@ForJ:
                        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    @@ForJ
                invoke  WriteConsole, hConsoleOutput, ADDR aszCrLf,\
                        LENGTHOF aszCrLf - 1, ADDR BufLen, NULL
                pop     ecx
        loop    @@ForI
@@Exit:
        popad
        ret
ShowMatrix      endp
 
InputMatrix     proc    lpMatrix:DWORD, lpRows:DWORD, lpCols:DWORD
        pushad
        ;ввод количества строк
        invoke  ReadSInt,       ADDR aszPromptRows, \
                                LENGTHOF aszPromptRows - 1, \
                                [lpRows]
        mov     esi,    [lpRows]
        cmp     [esi],  dword ptr 0
        je      @@Exit
        ;ввод количества столбцов
        invoke  ReadSInt,       ADDR aszPromptCols, \
                                LENGTHOF aszPromptCols - 1, \
                                [lpCols]
        mov     esi,    [lpCols]
        cmp     [esi],  dword ptr 0
        je      @@Exit
        ;ввод матрицы
        mov     ebx,    [lpMatrix]
        mov     ecx,    [lpRows]        ;N
        mov     ecx,    [ecx]
        mov     edx,    [lpCols]        ;M
        mov     edx,    [edx]
        mov     esi,    1               ;i
        @@ForI:
                mov     edi,    1       ;j
                @@ForJ:
                        push    ebx
                        push    ecx
                        push    edx
                        push    esi
                        push    edi
                        invoke  wsprintf,       ADDR Buffer, \
                                ADDR aszInpMatrix, esi, edi
                        pop     edi
                        pop     esi
                        pop     edx
                        pop     ecx
                        pop     ebx
                        invoke  ReadSInt,       ADDR Buffer, \
                                eax, \
                                ebx
                        add     ebx,    4
                        inc     edi
                        cmp     edi,    edx
                jbe     @@ForJ
 
                inc     esi
                cmp     esi,    ecx
        jbe     @@ForI
 
@@Exit:
        popad
        ret
InputMatrix     endp
 
main    proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
 
        ;ввод исходных данных
        invoke  InputMatrix,    ADDR Matrix, ADDR N, ADDR M
 
        ;вывод исходных данных
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgInstant,\
                LENGTHOF aszMsgInstant - 1, ADDR BufLen, NULL
        invoke  ShowMatrix,      ADDR Matrix, [N], [M]
        ;обработка: сумма максимальных элементов столбцов
        mov     ecx,    [M]
        lea     esi,    [Matrix]
        xor     ebx,    ebx             ;сумма
        @@ForJ:
                push    esi
                push    ecx
                mov     ecx,    [N]
                mov     edx,    [esi]   ;max
                @@ForI:
                        ;edx := max (edx, Matrix[i,j])
                        mov     eax,    [esi]
                        cmp     eax,    edx
                        cmovg   edx,    eax
                        ;i := i+1
                        mov     eax,    [M]
                        lea     esi,    [esi+4*eax]
                loop    @@ForI
 
                pop     ecx
                pop     esi
                add     esi,    4       ;j := j+1
 
                add     ebx,    edx     ;Sum:=Sum+max
        loop    @@ForJ
        mov     [Result],       ebx
        ;вывод результата
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
        invoke  wsprintf, ADDR Buffer, ADDR aszInteger, [Result]
        invoke  StrLen, ADDR Buffer
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        ;ожидание нажатия 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

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


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

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

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