Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Model Small
- Stack 1024
- .186
- DATASEG
- OutValNL db 1 ;Флаг перевода на новую строку после вывода функцией OutVal
- ParC dw 0 ;Счетчик четных элементов
- ParS dw 0 ;Сумма четных элементов
- MaxColZ db 0 ;Максимальное количество нулей
- MaxColZN db 0 ;Последняя позиция с максимальным количеством нулей
- Temp dw 0
- BufLen db 3h ;Максимальное количество символов для ввода
- BufSize db 0h ;Реальное количестве введенных символов
- Text db 255 dup(0) ;Буфер для ввода текста, а также генерации вывода
- NewLine db 0Dh, 0Ah, '$'
- N DB 0 ;Размерность матрицы
- M DW 256 DUP(0) ;Память для матрицы
- B DW 256 DUP(0) ;Матрица B
- InputN db 'Введите размер матрицы: $';
- InputMatr db 'Введите матрицу: $';
- ParElemsCount db 'Количество четных элементов: $';
- ParElemsSum db 'Сумма четных элементов: $';
- SrcMatrix db 'Матрица: ', 0dh, 0ah, '$';
- ColNum db 'Номер столбца с наибольшим количеством нулей: $';
- ZeroNum db 'Наибольшее количество нулей: $';
- ResultMatrix db 'Результирующая матрица: ', 0dh, 0ah, '$';
- Space db ' $';
- Inp_1 db 'A($'
- Inp_2 db ',$'
- Inp_3 db ') = $'
- CODESEG
- Start:
- mov ax,@data
- mov ds,ax ;Адрес сегмента данных куда положено
- InpSizeAgain:
- mov dx,offset InputN ;Выводим приглашение для ввода и вводим размерность матрицы
- call OutStr
- call ReadLine
- cmp ax,1 ;Проверяем, чтобы размер не был слишком велик.
- jb InpSizeAgain
- cmp ax,9
- ja InpSizeAgain
- mov [n],al ;Кладем ее в ячейку n
- mov dx,offset InputMatr ;Выводим приглашение для ввода матрицы, и вводим ее.
- mov si,offset M
- xor bx,bx
- InputI: ;Непосредственно сам ввод
- ;Матрица будет расположена по строкам в ряд. Первая строка, затем сразу-же следующая.
- mov [OutValNL],0 ;Вывод без перехода на новую строку, пока что
- mov dx,offset Inp_1 ;Выводим подсказку для ввода (какой элемент по счету вводим)
- call OutStr
- xor ax,ax
- mov al,bh
- inc al
- call OutVal
- mov dx,offset Inp_2
- call OutStr
- mov al,bl
- inc al
- call OutVal
- mov dx,offset Inp_3
- call OutStr
- mov [OutValNL],1 ;А теперь с переходом
- call ReadLine
- mov cx,ax ;Сразу проверим, четный ли элемент
- and cx,1
- jnz OddElem
- inc [ParC] ;Если да, корректируем переменные-счетчики
- add [ParS],ax
- jmp AfterZeroOdd
- OddElem:
- xor ax,ax
- AfterZeroOdd:
- mov [si],ax
- add si,2
- inc bh
- cmp bh,[n]
- jne InputI ;Каждую строку
- xor bh,bh
- inc bl
- cmp bl,[n]
- jne InputI ;Каждый столбец
- ;Рассказываем, сколько и чего обнаружили.
- mov dx,offset ParElemsCount
- call OutStr
- mov ax,[ParC]
- call OutVal
- mov dx,offset ParElemsSum
- call OutStr
- mov ax,[ParS]
- call OutVal
- ;Выведем исходную матрицу
- mov dx,offset SrcMatrix
- call OutStr
- mov si,offset M
- call OutMatrix
- ;Теперь определем номер столбца, где нулей больше всего.
- CountZeroGibson:
- mov si,offset M
- xor ax,ax
- mov al,[n]
- add al,al
- mov di,ax ;DI:= длина строки в байтах
- xor bx,bx
- xor cx,cx ;CH - номер текущего столбца, CL - количество нулей текущего столбца
- NextCol:
- mov ax,[si]
- test ax,ax
- jnz NotZero
- inc cl
- NotZero:
- add si,di ;К следующему элементу столбца
- inc bh ;Следующий элемент.
- cmp bh,[n] ;Если не последний элемент столбца - то к следующему
- jne NextCol
- xor bh,bh
- inc ch
- cmp cl,[MaxColZ]
- jb NonBiggerZC
- mov [MaxColZ],cl
- mov [MaxColZN],ch
- NonBiggerZC:
- xor cl,cl
- mov si,offset M
- xor dx,dx
- mov dl,ch
- add si,dx
- add si,dx
- cmp ch,[n]
- jne NextCol
- ;Выводим информацию максимальном количестве нулей, сколько и в каком столбце
- mov dx,offset ColNum
- call OutStr
- xor ax,ax
- mov al,[MaxColZN]
- call OutVal
- mov dx,offset ZeroNum
- call OutStr
- xor ah,ah
- mov al,[MaxColZ]
- call OutVal
- MatrixBGen:
- mov si,offset M
- mov di,offset B
- mov dl,[n] ;Столбцы
- SubLoop:
- mov dh,[n] ;строки
- dec dh
- mov bx,si
- NextSub:
- mov ax,[si]
- add si,2
- sub ax,[si]
- mov [di],ax
- add di,2
- dec dh
- jnz NextSub
- mov ax,[si]
- add si,2
- sub ax,[bx]
- mov [di],ax
- add di,2
- dec dl
- jnz SubLoop
- mov dx,offset ResultMatrix
- call OutStr
- mov si,offset B
- call OutMatrix
- mov ah,04Ch
- int 21h
- ;Функция, выводит матрицу на экран
- OutMatrix:
- mov [OutValNL],0 ;Вывод без перехода на новую строку, пока что
- xor bx,bx
- OutNextElem:
- mov ax,[si]
- call OutVal
- mov dx,offset Space
- call OutStr
- add si,2
- inc bh
- cmp bh,[n]
- jne OutNextElem ;Каждую строку
- mov dx,offset NewLine
- call OutStr
- xor bh,bh
- inc bl
- cmp bl,[n]
- jne OutNextElem
- mov [OutValNL],1 ;Включаем переход назад
- ret
- ;Функция, читает строку символов с клавиатуры
- ;По выходу возвращает в регистре AX введенное число.
- ReadLine:
- pusha
- Againa:
- mov ah,0ah
- mov [BufLen],4
- mov dx,offset BufLen
- int 21h
- xor di,di
- xor ax,ax
- mov cl,[BufSize]
- xor ch,ch
- xor bx,bx
- mov si,cx
- mov cl,10
- xor bp,bp
- cmp byte ptr [Text+di],'-'
- jne ConvToBin
- inc bp
- inc di
- ConvToBin:
- mov bl,byte ptr [Text+di]
- sub bl,"0"
- js Againa
- cmp bl,9
- ja Againa
- mul cx
- add ax,bx
- inc di
- cmp di,si
- jb ConvToBin
- AfterAll:
- dec bp
- jnz NotNeg2
- neg ax
- NotNeg2:
- mov [Temp],ax
- mov dx,offset NewLine
- call OutStr
- popa
- mov ax,[Temp]
- ret
- ;Функция, выводит содержимое регистра ax на экран.
- ;Перед этим, двоичное значение в AX преобразуется в строку по адресу Text.
- OutVal:
- pusha
- mov si,offset Text
- test ax,ax
- jns d0
- neg ax
- mov [si],byte ptr '-'
- inc si
- d0:
- mov bx,10
- xor cx,cx
- d1:
- xor dx,dx
- idiv bx
- push dx
- inc cx
- test ax,ax
- jnz d1
- d2:
- pop ax
- add al,"0"
- mov [si],al
- inc si
- loop d2
- mov [si],byte ptr '$'
- mov dx, offset Text
- call OutStr
- cmp [OutValNL],0
- je NotOutNL
- mov dx, offset NewLine
- call OutStr
- NotOutNL:
- popa
- ret
- ;Функция, выводит строку по адресу ds:dx
- OutStr:
- pusha
- mov ah,09h
- int 21h
- popa
- ret
- END Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement