Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Model Small
- Stack 1024
- .186
- DATASEG
- OutValNL db 1 ;Флаг перевода на новую строку после вывода функцией OutVal
- OddC dw 0 ;Счетчик нечетных элементов
- PosProd dw 1 ;Произведение положительных элементов
- CurNeg dw 0 ;Количество негативных элементов текущей строки
- MaxNeg dw 0 ;максимально встреченно количество негативных элементов
- MaxNegLN db 0
- Temp dw 0
- BufLen db 3h ;Максимальное количество символов для ввода
- BufSize db 0h ;Реальное количестве введенных символов
- Text db 255 dup(0) ;Буфер для ввода текста, а также генерации вывода
- NewLine db 0Dh, 0Ah, '$'
- N DB 0 ;Размерность матрицы
- A DW 256 DUP(0) ;Память для матрицы
- B DW 256 DUP(0) ;Матрица B
- InputN db 'Введите размер матрицы: $';
- InputMatr db 'Введите матрицу: $';
- OddElemsChangesCount db 'Количество замен нечетных элементов: $';
- PosElemsProd db 'Произведение положительных элементов: $';
- MaxNegsLine db 'Строка с максимальным количеством отрицательных элементов: $';
- SrcMatrix db 'Матрица: ', 0dh, 0ah, '$';
- 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 A
- 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
- cmp ax,1
- jl NotCalcProd
- mul word ptr [PosProd]
- mov [PosProd],ax
- NotCalcProd:
- mov ax,cx ;Сразу проверим, нечетный ли элемент
- and cx,1
- jz AfterChangeSign
- inc [OddC] ;Если да, корректируем переменные-счетчики
- neg ax ;Меняем знак текущего элемента на противоположный
- AfterChangeSign:
- mov [si],ax
- test ax,ax
- jns NotIncNegs
- inc word ptr [CurNeg]
- NotIncNegs:
- add si,2
- inc bh
- cmp bh,[n]
- jne InputI ;Каждую строку
- mov ax,[CurNeg] ;Проверяем на максимальное количество отрицательных элементов. Если находим, где больше, то обновляем.
- cmp ax,[MaxNeg]
- jle NotReplaceMax
- mov [MaxNeg],ax
- mov [MaxNegLN],bl
- inc [MaxNegLN]
- NotReplaceMax:
- mov word ptr [CurNeg],0
- xor bh,bh
- inc bl
- cmp bl,[n]
- je NoLongJmp ;Каждый столбец
- jmp InputI
- NoLongJmp:
- ;Рассказываем, сколько и чего обнаружили.
- mov dx,offset OddElemsChangesCount
- call OutStr
- mov ax,[OddC]
- call OutVal
- mov dx,offset PosElemsProd
- call OutStr
- mov ax,[PosProd]
- call OutVal
- mov dx,offset MaxNegsLine
- call OutStr
- xor ax,ax
- mov al,[MaxNegLN]
- call OutVal
- ;Выведем исходную матрицу
- mov dx,offset SrcMatrix
- call OutStr
- mov si,offset A
- call OutMatrix
- ;Теперь сделаем матрицу B.
- MatrixBGen:
- mov si,offset A
- mov di,offset B
- xor dl,dl
- xor cx,cx
- mov cl,[n]
- add cx,cx
- SubLoop:
- mov dh,[n] ;строки
- dec dh
- mov bx,si
- NextSub:
- mov ax,[si]
- add si,cx
- sub ax,[si]
- mov [di],ax
- add di,cx
- dec dh
- jnz NextSub
- mov ax,[si]
- add si,cx
- sub ax,[bx]
- mov [di],ax
- add di,cx
- inc dl
- xor ax,ax
- mov al,dl
- add al,al
- mov si,offset A
- mov di,offset B
- add si,ax
- add di,ax
- cmp dl,[n]
- jne 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