Определить сумму максимальных элементов столбцов матрицы - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д