Определить столбец в матрице сумма элементов, которого максимальна. заменить элементы этого столбца на 0 - Assembler
Формулировка задачи:
Задать с клавиатуры матрицу размером 4х4
Определить столбец сумма элементов, которого максимальна. Заменить элементы этого столбца на 0. Предусмотреть:
1 - Приглашение к вводу матрицы
2 - Проверку на разрядность вводимых элементов матрицы, разрядность не больше 2.
3 - Вывод новой матрицы
Решение задачи: «Определить столбец в матрице сумма элементов, которого максимальна. заменить элементы этого столбца на 0»
textual
Листинг программы
- model small
- .486
- LOCALS @@
- .stack 256
- .data
- Rows equ 4 ;максимальное количество строк
- Columns equ 4 ;максимальное количество столбцов
- iSize equ Rows*Columns ;максимальный размер матрицы
- m dw Rows ;текущее количество строк
- n dw Columns ;текущее количество столбцов
- Matrix dw iSize dup(?) ;матрица
- asCR_LF db 0dh, 0ah, '$' ;"перевод строки"
- asTitle0 db 'Input matrix', '$'
- asTitle1 db 'Current matrix', '$'
- asTitle2 db 'Result matrix', '$'
- asPrompt1 db 'a[ ', '$' ;строка приглашения
- asPrompt2 db ', ', '$'
- asPrompt3 db ']= ', '$'
- kbMaxLen equ 6+1 ;буфер ввода с клавиатуры Fn 0ah
- kbInput db kbMaxLen, 0, kbMaxLen dup(0)
- .code
- ; преобразования строки в число
- ; на входе:
- ; ds:[si] - строка с числом
- ; ds:[di] - адрес числа
- ; на выходе
- ; ds:[di] - число
- ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
- Str2Num PROC
- push ax
- push bx
- push cx
- push dx
- push ds
- push es
- push si
- push ds
- pop es
- mov cl, ds:[si]
- xor ch, ch
- inc si
- mov bx, 10
- xor ax, ax
- ;если в строке первый символ '-'
- ; - перейти к следующему
- ; - уменьшить количество рассматриваемых символов
- cmp byte ptr [si], '-'
- jne @@Loop
- inc si
- dec cx
- @@Loop:
- mul bx ; умножаем ax на 10 ( dx:ax=ax*bx )
- mov [di], ax ; игнорируем старшее слово
- cmp dx, 0 ; проверяем, результат на переполнение
- jnz @@Error
- mov al, [si] ; Преобразуем следующий символ в число
- cmp al, '0'
- jb @@Error
- cmp al, '9'
- ja @@Error
- sub al, '0'
- xor ah, ah
- add ax, [di]
- jc @@Error ; Если сумма больше 65535
- cmp ax, 8000h
- ja @@Error
- inc si
- loop @@Loop
- pop si ;проверка на знак
- push si
- inc si
- cmp byte ptr [si], '-'
- jne @@Check ;если должно быть положительным
- neg ax ;если должно быть отрицательным
- jmp @@StoreRes
- @@Check: ;дополнительная проверка, когда при вводе положительного числа получили отрицательное
- or ax, ax ;
- js @@Error
- @@StoreRes: ;сохранить результат
- mov [di], ax
- clc
- pop si
- pop es
- pop ds
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- @@Error:
- xor ax, ax
- mov [di], ax
- stc
- pop si
- pop es
- pop ds
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- Str2Num ENDP
- ; выводит число из регистра AX на экран
- ; входные данные:
- ; ax - число для отображения
- Show_AX proc
- push ax
- push bx
- push cx
- push dx
- push di
- mov cx, 10
- xor di, di ; di - кол. цифр в числе
- ; если число в ax отрицательное, то
- ;1) напечатать '-'
- ;2) сделать ax положительным
- or ax, ax
- jns @@Conv
- push ax
- mov dx, '-'
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- pop ax
- neg ax
- @@Conv:
- xor dx, dx
- div cx ; dl = num mod 10
- add dl, '0' ; перевод в символьный формат
- inc di
- push dx ; складываем в стэк
- or ax, ax
- jnz @@Conv
- ; выводим из стэка на экран
- @@Show:
- pop dx ; dl = очередной символ
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- dec di ; повторяем пока di<>0
- jnz @@Show
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- Show_AX endp
- ; На входе
- ;m - количество строк
- ;n - количество столбцов
- ;ds:dx - адрес матрицы
- ShowMatrix PROC FAR
- pusha
- mov si, 0 ; строка
- mov di, 0 ; столбец
- mov bx, dx
- @@ShowRow:
- mov ax, [bx]
- call Show_AX
- mov ah, 02h
- mov dl, ' '
- int 21h
- add bx, 2
- inc di
- cmp di, n
- jb @@ShowRow
- mov dx, OFFSET asCR_LF
- mov ah, 09h
- int 21h
- mov di, 0
- inc si
- cmp si, m
- jb @@ShowRow
- popa
- ret
- ShowMatrix ENDP
- ; На входе
- ;ds:dx - адрес матрицы
- InputMatrix PROC
- pusha
- ;bx - адрес очередного элемента матрицы
- mov bx, dx
- ;Вывод на экран приглашения ввести матрицу
- mov ah, 09h
- mov dx, OFFSET asTitle0
- int 21h
- mov ah, 09h
- mov dx, OFFSET asCR_LF
- int 21h
- mov si, 1 ; строка (индекс)
- mov di, 1 ; столбец (индекс)
- @@InpInt:
- ;вывод на экран приглашения 'a[ 1, 1]='
- lea dx, asPrompt1
- mov ah, 09h
- int 21h
- mov ax, si
- call Show_AX
- lea dx, asPrompt2
- mov ah, 09h
- int 21h
- mov ax, di
- call Show_AX
- lea dx, asPrompt3
- mov ah, 09h
- int 21h
- ;Ввод строки
- mov ah, 0ah
- mov dx, OFFSET kbInput
- int 21h
- ;Преобразование строки в число
- push di
- push si
- mov si, OFFSET kbInput+1
- mov di, bx
- call Str2Num
- pop si
- pop di
- jc @@InpInt ; если ошибка преобразования - повторить ввод
- ;проверка введенного числа на количество разрядов не более 2
- cmp word ptr [bx], 100
- jle @@YetTest
- jmp @@InpInt
- @@YetTest:
- cmp word ptr [bx], -100
- jge @@Ok
- jmp @@InpInt
- @@Ok:
- ;на экране - перейти к следующей строке
- mov dx, OFFSET asCR_LF
- mov ah, 09h
- int 21h
- ;перейти к следующему элементу матрицы
- add bx, 2
- inc di
- cmp di, n
- jbe @@InpInt
- mov di, 1
- inc si
- cmp si, m
- jbe @@InpInt
- popa
- ret
- InputMatrix ENDP
- Main PROC FAR
- mov dx, @data
- mov ds, dx
- mov dx, OFFSET Matrix
- call InputMatrix
- mov ah, 09h
- mov dx, OFFSET asTitle1
- int 21h
- mov ah, 09h
- mov dx, OFFSET asCR_LF
- int 21h
- mov dx, OFFSET Matrix
- call ShowMatrix
- ;поиск столбца с максимальным значением суммы элементов
- mov ax, 8000h ;максимальное значение суммы в матрице
- mov di, 0 ;номер столбца с максимальной суммой
- mov dx, n ;приращение смещения адреса для перехода
- shl dx, 1 ;к следующему элементу столбца
- mov cx, n
- lea si, Matrix
- @@ForJ: ;цикл по строкам
- mov bx, 0 ;сумма элементов столбца
- push cx
- mov cx, m ;количество элементов в
- push si
- @@ForI:
- add bx, [si]
- add si, dx
- loop @@ForI
- pop si
- pop cx
- cmp ax, bx
- jge @@Next
- mov ax, bx
- mov di, n ;di - номер столбца с максимальной суммой
- sub di, cx
- @@Next:
- add si, 2
- loop @@ForJ
- ;замена элементов столбца с максимальной суммой элементов, на нули
- lea bx, Matrix
- mov ax, di
- shl ax, 1
- add bx, ax
- mov cx, m
- mov ax, 0
- @@@ForI:
- mov [bx], ax
- add bx, dx
- loop @@@ForI
- ;Вывод результатов на экран
- mov ah, 09h
- mov dx, OFFSET asTitle2
- int 21h
- mov ah, 09h
- mov dx, OFFSET asCR_LF
- int 21h
- mov dx, OFFSET Matrix
- call ShowMatrix
- mov ax, 4c00h
- int 21h
- Main ENDP
- END Main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д