Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Model Small
- Stack 1024
- .186
- DATASEG
- Temp dw 0 ;Временная переменная
- ZeroC dw 0 ;Количство нулевых элементов
- PosProd dw 1 ;Произведение положительных элементов будет жить тут
- OutValNL db 1 ;Флаг перевода на новую строку после вывода функцией OutVal
- BufLen db 3h ;Максимальное количество символов для ввода
- BufSize db 0h ;Реальное количестве введенных символов
- Text db 255 dup(0) ;Буфер для ввода текста, а также генерации вывода
- NewLine db 0Dh, 0Ah, '$' ;Строка - переход на новую линию.
- Space db ' $' ;Символ пробела, иногда придется и его выводить тоже
- Inp_1 db 'A($' ;3 подсказки для ввода элемента матрицы
- Inp_2 db ',$'
- Inp_3 db ') = $'
- H db 0 ;Размерность матрицы
- A DW 256 DUP(0) ;Память для матрицы
- B DW 256 DUP(0) ;Матрица B
- InputN db 'Введите размер матрицы: $';
- InputMatr db 'Введите матрицу: $';
- ZeroElemsCount db 'Количество нулевых элементов матрицы: $'
- PosElemsProd db 'Произведение положительных элементов матрицы: $';
- ColumsWithEqElems db 'Номера столбцов, имеющих одинаковые соседние элементы: $';
- ResultMatrix db 'Матрица B: $';
- 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 [H],al ;Кладем ее в ячейку h
- 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 ;Вводим новый элемент. В регистре AX будет его значение
- mov cx,ax
- test ax,ax ;;Сразу проверим, нулевой ли элемент
- jnz NonZeroElem
- inc [ZeroC] ;Если да, корректируем счетчик нулевых элементов
- jmp AfterNonZeroElem
- NonZeroElem: ;Если-же элемент не нулевой, проверим его на положительность
- test ax,ax
- js AfterNonZeroElem ;Если есть знак, значит он отрицателен
- xor dx,dx ;Иначе перемножим старый результат и текущее значение в AX
- mul word ptr [PosProd]
- mov word ptr [PosProd],ax
- AfterNonZeroElem:
- mov [si],cx
- add si,2
- inc bh
- cmp bh,[H]
- jne InputI ;Каждую строку
- xor bh,bh
- inc bl
- cmp bl,[H]
- jne InputI ;Каждый столбец
- ;Выводим количество нулевых и произв. положительных элементов матрицы
- mov dx,offset ZeroElemsCount
- call OutStr
- mov ax,[ZeroC]
- call OutVal
- mov dx,offset PosElemsProd
- call OutStr
- mov ax,word ptr [PosProd]
- call OutVal
- ;Теперь поищем положительные диагональные элементы матрицы.
- mov dx,2
- ScanDiag:
- ;По главной диагонали
- mov si,offset A
- xor ax,ax
- mov al,[h]
- add al,al
- cmp dx,2
- je NonIncSI
- add si,ax
- sub si,2
- NonIncSI:
- mov di,ax ;DI:= длина строки в байтах
- add di,dx ;Di = Di + 2 для прохода по диагональным элементам
- mov cl,[h] ;CL:= размерность
- TestPosDLoop:
- mov ax,[si]
- test ax,ax
- js NotChangeTo1
- cmp ax,0
- jna NotChangeTo1
- mov word ptr [si],1
- NotChangeTo1:
- add si,di
- dec cl
- jnz TestPosDLoop
- cmp dx,2
- jne ExitScanD
- mov dx,65534
- jmp ScanDiag
- ExitScanD:
- mov si,offset A
- call OutMatrix
- ;Поищем номера столбцов, имеющих одинаковые элементы стоящие рядом.
- mov dx,offset ColumsWithEqElems
- call OutStr
- mov dx,offset NewLine
- call OutStr
- ScanCE:
- xor ax,ax
- mov al,[h]
- add al,al
- mov dx,ax
- xor cx,cx
- ScanNextColumn:
- xor bx,bx ;BL - счетчик элемента в текущем столбце, CL - текущий столбец
- inc bl
- mov si,offset A
- add si,cx
- add si,cx
- ScanColumn:
- mov di,[si]
- add si,dx
- cmp di,[si]
- jne ScanNext
- xor ax,ax ;Нашли одинаковые соседние элементы.
- mov al,cl
- inc al
- call OutVal ;Выведем номер столбца и выйдем из цикла поиска по столбцу
- jmp ExitScanColumn
- ScanNext:
- inc bl
- cmp bl,[h]
- jne ScanColumn
- ExitScanColumn:
- inc cl
- cmp cl,[h]
- jne ScanNextColumn
- mov dx,offset NewLine ;Перейдем на новую строку
- call OutStr
- MatrixBGen:
- mov si,offset A
- mov di,offset B
- mov dl,[h] ;Столбцы
- AddLoop:
- mov dh,[h] ;строки
- dec dh
- xor cx,cx
- mov cl,[h]
- dec cl
- add cl,cl
- mov bx,cx
- add bx,si
- mov ax,[si]
- add ax,[bx]
- mov [di],ax
- add di,2
- NextAdd:
- mov ax,[si]
- add si,2
- add ax,[si]
- mov [di],ax
- add di,2
- dec dh
- jnz NextAdd
- add si,2
- dec dl
- jnz AddLoop
- mov dx,offset ResultMatrix
- call OutStr
- mov dx,offset NewLine
- 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,[H]
- jne OutNextElem ;Каждую строку
- mov dx,offset NewLine
- call OutStr
- xor bh,bh
- inc bl
- cmp bl,[H]
- 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