Advertisement
Abaduaber

NatVid_1

May 25th, 2013
405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Model Small
  2. Stack 1024
  3. .186
  4. DATASEG
  5.     Temp dw 0   ;Временная переменная
  6.     ZeroC dw 0  ;Количство нулевых элементов
  7.     PosProd dw 1    ;Произведение положительных элементов будет жить тут
  8.     OutValNL db 1 ;Флаг перевода на новую строку после вывода функцией OutVal
  9.     BufLen db 3h ;Максимальное количество символов для ввода
  10.     BufSize db 0h ;Реальное количестве введенных символов
  11.     Text db 255 dup(0) ;Буфер для ввода текста, а также генерации вывода
  12.     NewLine db 0Dh, 0Ah, '$' ;Строка - переход на новую линию.
  13.     Space db ' $'  ;Символ пробела, иногда придется и его выводить тоже
  14.     Inp_1 db 'A($' ;3 подсказки для ввода элемента матрицы
  15.     Inp_2 db ',$'
  16.     Inp_3 db ') = $'
  17.  
  18.     H db 0  ;Размерность матрицы
  19.     A DW 256 DUP(0) ;Память для матрицы
  20.     B DW 256 DUP(0) ;Матрица B
  21.  
  22.     InputN db 'Введите размер матрицы: $';
  23.     InputMatr db 'Введите матрицу: $';
  24.     ZeroElemsCount db 'Количество нулевых элементов матрицы: $'
  25.     PosElemsProd db 'Произведение положительных элементов матрицы: $';
  26.     ColumsWithEqElems db 'Номера столбцов, имеющих одинаковые соседние элементы: $';
  27.     ResultMatrix db 'Матрица B: $';
  28. CODESEG
  29.  
  30. Start:
  31.     mov ax,@data
  32.     mov ds,ax ;Адрес сегмента данных куда положено
  33. InpSizeAgain:
  34.     mov dx,offset InputN ;Выводим приглашение для ввода и вводим размерность матрицы
  35.     call OutStr
  36.     call ReadLine
  37.     cmp ax,1        ;Проверяем, чтобы размер не был слишком велик.
  38.     jb InpSizeAgain
  39.     cmp ax,9
  40.     ja InpSizeAgain
  41.     mov [H],al ;Кладем ее в ячейку h
  42.     mov dx,offset InputMatr ;Выводим приглашение для ввода матрицы, и вводим ее.
  43.     mov si,offset A
  44.     xor bx,bx
  45.  
  46. InputI:         ;Непосредственно сам ввод
  47.             ;Матрица будет расположена по строкам в ряд. Первая строка, затем сразу-же следующая.
  48.     mov [OutValNL],0 ;Вывод без перехода на новую строку, пока что
  49.     mov dx,offset Inp_1 ;Выводим подсказку для ввода (какой элемент по счету вводим)
  50.     call OutStr
  51.     xor ax,ax
  52.     mov al,bh
  53.     inc al
  54.     call OutVal
  55.     mov dx,offset Inp_2
  56.     call OutStr
  57.     mov al,bl
  58.     inc al
  59.     call OutVal
  60.     mov dx,offset Inp_3
  61.     call OutStr
  62.  
  63.     mov [OutValNL],1 ;А теперь с переходом
  64.     call ReadLine   ;Вводим новый элемент. В регистре AX будет его значение
  65.     mov cx,ax
  66.     test ax,ax  ;;Сразу проверим, нулевой ли элемент
  67.     jnz NonZeroElem
  68.     inc [ZeroC] ;Если да, корректируем счетчик нулевых элементов
  69.     jmp AfterNonZeroElem
  70. NonZeroElem:        ;Если-же элемент не нулевой, проверим его на положительность
  71.     test ax,ax
  72.     js AfterNonZeroElem ;Если есть знак, значит он отрицателен
  73.    
  74.     xor dx,dx   ;Иначе перемножим старый результат и текущее значение в AX
  75.     mul word ptr [PosProd]
  76.     mov word ptr [PosProd],ax
  77. AfterNonZeroElem:
  78.     mov [si],cx
  79.     add si,2
  80.     inc bh
  81.     cmp bh,[H]
  82.     jne InputI  ;Каждую строку
  83.     xor bh,bh
  84.     inc bl
  85.     cmp bl,[H]
  86.     jne InputI  ;Каждый столбец
  87.  
  88.     ;Выводим количество нулевых и произв. положительных элементов матрицы
  89.     mov dx,offset ZeroElemsCount
  90.     call OutStr
  91.     mov ax,[ZeroC]
  92.     call OutVal
  93.     mov dx,offset PosElemsProd
  94.     call OutStr
  95.     mov ax,word ptr [PosProd]
  96.     call OutVal
  97.  
  98.     ;Теперь поищем положительные диагональные элементы матрицы.
  99.     mov dx,2
  100. ScanDiag:
  101.     ;По главной диагонали
  102.     mov si,offset A
  103.    
  104.     xor ax,ax
  105.     mov al,[h]
  106.     add al,al
  107.     cmp dx,2
  108.     je NonIncSI
  109.     add si,ax
  110.     sub si,2
  111. NonIncSI:
  112.     mov di,ax ;DI:= длина строки в байтах
  113.     add di,dx ;Di = Di + 2 для прохода по диагональным элементам
  114.     mov cl,[h] ;CL:= размерность
  115. TestPosDLoop:
  116.     mov ax,[si]
  117.     test ax,ax
  118.     js NotChangeTo1
  119.     cmp ax,0
  120.     jna NotChangeTo1
  121.     mov word ptr [si],1
  122. NotChangeTo1:
  123.     add si,di
  124.     dec cl
  125.     jnz TestPosDLoop
  126.     cmp dx,2
  127.     jne ExitScanD
  128.     mov dx,65534
  129.     jmp ScanDiag
  130. ExitScanD:
  131.     mov si,offset A
  132.     call OutMatrix
  133.  
  134.     ;Поищем номера столбцов, имеющих одинаковые элементы стоящие рядом.
  135.     mov dx,offset ColumsWithEqElems
  136.     call OutStr
  137.     mov dx,offset NewLine
  138.     call OutStr
  139. ScanCE:
  140.     xor ax,ax
  141.     mov al,[h]
  142.     add al,al
  143.     mov dx,ax
  144.     xor cx,cx
  145. ScanNextColumn:
  146.     xor bx,bx   ;BL - счетчик элемента в текущем столбце, CL - текущий столбец
  147.     inc bl
  148.     mov si,offset A
  149.     add si,cx
  150.     add si,cx  
  151. ScanColumn:
  152.     mov di,[si]
  153.     add si,dx
  154.     cmp di,[si]
  155.     jne ScanNext
  156.     xor ax,ax   ;Нашли одинаковые соседние элементы.
  157.     mov al,cl
  158.     inc al
  159.     call OutVal ;Выведем номер столбца и выйдем из цикла поиска по столбцу
  160.     jmp ExitScanColumn
  161. ScanNext:
  162.     inc bl
  163.     cmp bl,[h]
  164.     jne ScanColumn
  165. ExitScanColumn:
  166.     inc cl
  167.     cmp cl,[h]
  168.     jne ScanNextColumn
  169.  
  170.     mov dx,offset NewLine   ;Перейдем на новую строку
  171.     call OutStr
  172.  
  173. MatrixBGen:
  174.     mov si,offset A
  175.     mov di,offset B
  176.     mov dl,[h] ;Столбцы
  177. AddLoop:
  178.     mov dh,[h] ;строки
  179.     dec dh
  180.     xor cx,cx
  181.     mov cl,[h]
  182.     dec cl
  183.     add cl,cl
  184.     mov bx,cx
  185.     add bx,si
  186.     mov ax,[si]
  187.     add ax,[bx]
  188.     mov [di],ax
  189.     add di,2
  190. NextAdd:
  191.     mov ax,[si]
  192.     add si,2
  193.     add ax,[si]
  194.     mov [di],ax
  195.     add di,2
  196.     dec dh
  197.     jnz NextAdd
  198.     add si,2
  199.     dec dl
  200.     jnz AddLoop
  201.    
  202.     mov dx,offset ResultMatrix
  203.     call OutStr
  204.     mov dx,offset NewLine
  205.     call OutStr
  206.     mov si,offset B
  207.     call OutMatrix
  208.  
  209.     mov ah,04Ch ;Завершаем программу
  210.     int 21h
  211.  
  212.     ;Функция, выводит матрицу на экран
  213. OutMatrix:
  214.     mov [OutValNL],0 ;Вывод без перехода на новую строку, пока что
  215.     xor bx,bx
  216. OutNextElem:
  217.     mov ax,[si]
  218.     call OutVal
  219.     mov dx,offset Space
  220.     call OutStr
  221.     add si,2
  222.     inc bh
  223.     cmp bh,[H]
  224.     jne OutNextElem ;Каждую строку
  225.     mov dx,offset NewLine
  226.     call OutStr
  227.     xor bh,bh
  228.     inc bl
  229.     cmp bl,[H]
  230.     jne OutNextElem
  231.     mov [OutValNL],1 ;Включаем переход назад
  232.     ret
  233.  
  234.  
  235.     ;Функция, читает строку символов с клавиатуры
  236.     ;По выходу возвращает в регистре AX введенное число.
  237. ReadLine:
  238.     pusha
  239. Againa:
  240.     mov ah,0ah
  241.     mov [BufLen],4        
  242.     mov dx,offset BufLen   
  243.     int 21h
  244.     xor di,di
  245.     xor ax,ax
  246.     mov cl,[BufSize]
  247.     xor ch,ch
  248.     xor bx,bx
  249.     mov si,cx
  250.     mov cl,10
  251.     xor bp,bp
  252.     cmp byte ptr [Text+di],'-'
  253.     jne ConvToBin
  254.     inc bp
  255.     inc di
  256. ConvToBin:
  257.     mov bl,byte ptr [Text+di]
  258.     sub bl,"0"
  259.     js Againa
  260.     cmp bl,9
  261.     ja Againa
  262.     mul cx
  263.     add ax,bx
  264.     inc di
  265.     cmp di,si
  266.     jb ConvToBin
  267. AfterAll:
  268.     dec bp
  269.     jnz NotNeg2
  270.     neg ax
  271. NotNeg2:
  272.     mov [Temp],ax
  273.     mov dx,offset NewLine
  274.     call OutStr    
  275.     popa   
  276.     mov ax,[Temp]
  277.         ret
  278.  
  279.     ;Функция, выводит содержимое регистра ax на экран.
  280.     ;Перед этим, двоичное значение в AX преобразуется в строку по адресу Text.
  281. OutVal:
  282.     pusha
  283.     mov si,offset Text
  284.     test ax,ax
  285.     jns d0
  286.     neg ax
  287.     mov [si],byte ptr '-'
  288.     inc si
  289. d0:
  290.     mov bx,10
  291.     xor cx,cx
  292. d1:
  293.     xor dx,dx
  294.     idiv bx
  295.     push dx
  296.     inc cx
  297.     test ax,ax
  298.     jnz d1
  299. d2:
  300.     pop ax
  301.     add al,"0"
  302.     mov [si],al
  303.     inc si
  304.     loop d2
  305.     mov [si],byte ptr '$'
  306.     mov dx, offset Text
  307.     call OutStr
  308.     cmp [OutValNL],0
  309.     je NotOutNL
  310.     mov dx, offset NewLine
  311.     call OutStr
  312. NotOutNL:
  313.     popa
  314.     ret
  315.  
  316.     ;Функция, выводит строку по адресу ds:dx
  317. OutStr:
  318.     pusha
  319.     mov ah,09h
  320.     int 21h
  321.     popa
  322.     ret
  323. END Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement