Advertisement
Abaduaber

VadSid_6

Jun 6th, 2013
378
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.     OutValNL db 1 ;Флаг перевода на новую строку после вывода функцией OutVal
  6.     NegC dw 0 ;Счетчик отрицательных элементов
  7.     PosSum dw 0 ;Сумма положительных элементов
  8.     CurZero dw 0 ;Количество нулевых элементов текущей строки
  9.     MaxZero dw 0    ;максимально встреченное количество нулевых элементов
  10.     MaxZeroLN db 0
  11.     BiggerElem dw 0 ;Наибольший по модулю элемент матрицы A
  12.  
  13.     Temp dw 0
  14.     BufLen db 3h ;Максимальное количество символов для ввода
  15.     BufSize db 0h ;Реальное количестве введенных символов
  16.     Text db 255 dup(0) ;Буфер для ввода текста, а также генерации вывода
  17.     NewLine db 0Dh, 0Ah, '$'
  18.    
  19.     N DB 0   ;Размерность матрицы
  20.     A DW 256 DUP(0) ;Память для матрицы
  21.     B DW 256 DUP(0) ;Матрица B
  22.  
  23.     InputN db 'Введите размер матрицы: $';
  24.     InputMatr db 'Введите матрицу: $';
  25.     PosElemsSum db 'Сумма положительных элементов: $';
  26.     NegElemsCount db 'Количество отрицательных элементов: $';
  27.     MaxZeroesLine db 'Строка с максимальным количеством нулевых элементов: $';
  28.     SrcMatrix db 'Матрица: ', 0dh, 0ah, '$';
  29.     ResultMatrix db 'Результирующая матрица: ', 0dh, 0ah, '$';
  30.     Space db ' $';
  31.     Inp_1 db 'A($'
  32.     Inp_2 db ',$'
  33.     Inp_3 db ') = $'
  34.    
  35. CODESEG
  36.  
  37. Start:
  38.     mov ax,@data
  39.     mov ds,ax ;Адрес сегмента данных куда положено
  40. InpSizeAgain:  
  41.     mov dx,offset InputN ;Выводим приглашение для ввода и вводим размерность матрицы
  42.     call OutStr
  43.     call ReadLine
  44.     cmp ax,1        ;Проверяем, чтобы размер не был слишком велик.
  45.     jb InpSizeAgain
  46.     cmp ax,9
  47.     ja InpSizeAgain
  48.     mov [n],al ;Кладем ее в ячейку n
  49.     mov dx,offset InputMatr ;Выводим приглашение для ввода матрицы, и вводим ее.
  50.     mov si,offset A
  51.     xor bx,bx
  52. InputI:         ;Непосредственно сам ввод
  53.             ;Матрица будет расположена по строкам в ряд. Первая строка, затем сразу-же следующая.
  54.     mov [OutValNL],0 ;Вывод без перехода на новую строку, пока что
  55.     mov dx,offset Inp_1 ;Выводим подсказку для ввода (какой элемент по счету вводим)
  56.     call OutStr
  57.     xor ax,ax
  58.     mov al,bh
  59.     inc al
  60.     call OutVal
  61.     mov dx,offset Inp_2
  62.     call OutStr
  63.     mov al,bl
  64.     inc al
  65.     call OutVal
  66.     mov dx,offset Inp_3
  67.     call OutStr
  68.  
  69.     mov [OutValNL],1 ;А теперь с переходом
  70.     call ReadLine
  71.     ;Сразу проверим, отрицательный ли элемент
  72.     test ax,ax
  73.     jns AfterCalcNeg ;Если нет - посчитаем сумму
  74.     inc [NegC]  ;Если да, корректируем переменные-счетчики
  75.     xor ax,ax   ;Обнуляем отрицательный элемент
  76.     jmp AfterCalc
  77. AfterCalcNeg:
  78.     add [PosSum],ax ;Если элемент положительный, увеличиваем сумму
  79. AfterCalc:
  80.     mov [si],ax
  81.     test ax,ax
  82.     jnz NotIncZeroes
  83.     inc word ptr [CurZero]
  84. NotIncZeroes:
  85.     add si,2
  86. NegAgain:   ;Получаем абсолютное значение текущего элемента
  87.     neg ax
  88.     js NegAgain
  89.     cmp [BiggerElem],ax
  90.     jae NotUpdateBE
  91.     mov [BiggerElem],ax
  92. NotUpdateBE:
  93.     inc bh
  94.     cmp bh,[n]
  95.     jne InputI  ;Каждую строку
  96.     mov ax,[CurZero] ;Проверяем на максимальное количество нулевых элементов. Если находим, где больше, то обновляем.
  97.     cmp ax,[MaxZero]
  98.     jle NotReplaceMax
  99.     mov [MaxZero],ax
  100.     mov [MaxZeroLN],bl
  101.     inc [MaxZeroLN]
  102. NotReplaceMax:
  103.     mov word ptr [CurZero],0
  104.     xor bh,bh
  105.     inc bl
  106.     cmp bl,[n]
  107.     je NoLongJmp    ;Каждый столбец
  108.     jmp InputI
  109. NoLongJmp: 
  110.     ;Рассказываем, сколько и чего обнаружили.
  111.     mov dx,offset PosElemsSum
  112.     call OutStr
  113.     mov ax,[PosSum]
  114.     call OutVal
  115.     mov dx,offset NegElemsCount
  116.     call OutStr
  117.     mov ax,[NegC]
  118.     call OutVal
  119.     mov dx,offset MaxZeroesLine
  120.     call OutStr
  121.     xor ax,ax
  122.     mov al,[MaxZeroLN]
  123.     call OutVal
  124.     ;Выведем исходную матрицу
  125.     mov dx,offset SrcMatrix
  126.     call OutStr
  127.     mov si,offset A
  128.     call OutMatrix
  129.    
  130.  
  131.     ;Теперь сделаем матрицу B.
  132. MatrixBGen:
  133.     mov si,offset A
  134.     mov di,offset B
  135.     xor ax,ax
  136.     mov al,[n]
  137.     mul ax
  138.     mov cx,ax   ;В CX - количество элементов матрицы A
  139. MulLoop:
  140.     mov ax,[si] ;Умножаем каждый элемент на найденный максимальный.
  141.     mul word ptr [BiggerElem]
  142.     mov [di],ax
  143.     add di,2
  144.     add si,2
  145.     dec cx
  146.     jnz MulLoop
  147.    
  148.     mov dx,offset ResultMatrix
  149.     call OutStr
  150.     mov si,offset B
  151.     call OutMatrix
  152.  
  153.     mov ah,04Ch
  154.     int 21h
  155.  
  156.  
  157.     ;Функция, выводит матрицу на экран
  158. OutMatrix:
  159.     mov [OutValNL],0 ;Вывод без перехода на новую строку, пока что
  160.     xor bx,bx
  161. OutNextElem:
  162.     mov ax,[si]
  163.     call OutVal
  164.     mov dx,offset Space
  165.     call OutStr
  166.     add si,2
  167.     inc bh
  168.     cmp bh,[n]
  169.     jne OutNextElem ;Каждую строку
  170.     mov dx,offset NewLine
  171.     call OutStr
  172.     xor bh,bh
  173.     inc bl
  174.     cmp bl,[n]
  175.     jne OutNextElem
  176.     mov [OutValNL],1 ;Включаем переход назад
  177.     ret
  178.  
  179.  
  180.     ;Функция, читает строку символов с клавиатуры
  181.     ;По выходу возвращает в регистре AX введенное число.
  182. ReadLine:
  183.     pusha
  184. Againa:
  185.     mov ah,0ah
  186.     mov [BufLen],4        
  187.     mov dx,offset BufLen   
  188.     int 21h
  189.     xor di,di
  190.     xor ax,ax
  191.     mov cl,[BufSize]
  192.     xor ch,ch
  193.     xor bx,bx
  194.     mov si,cx
  195.     mov cl,10
  196.     xor bp,bp
  197.     cmp byte ptr [Text+di],'-'
  198.     jne ConvToBin
  199.     inc bp
  200.     inc di
  201. ConvToBin:
  202.     mov bl,byte ptr [Text+di]
  203.     sub bl,"0"
  204.     js Againa
  205.     cmp bl,9
  206.     ja Againa
  207.     mul cx
  208.     add ax,bx
  209.     inc di
  210.     cmp di,si
  211.     jb ConvToBin
  212. AfterAll:
  213.     dec bp
  214.     jnz NotNeg2
  215.     neg ax
  216. NotNeg2:
  217.     mov [Temp],ax
  218.     mov dx,offset NewLine
  219.     call OutStr    
  220.     popa   
  221.     mov ax,[Temp]
  222.         ret
  223.  
  224.     ;Функция, выводит содержимое регистра ax на экран.
  225.     ;Перед этим, двоичное значение в AX преобразуется в строку по адресу Text.
  226. OutVal:
  227.     pusha
  228.     mov si,offset Text
  229.     test ax,ax
  230.     jns d0
  231.     neg ax
  232.     mov [si],byte ptr '-'
  233.     inc si
  234. d0:
  235.     mov bx,10
  236.     xor cx,cx
  237. d1:
  238.     xor dx,dx
  239.     idiv bx
  240.     push dx
  241.     inc cx
  242.     test ax,ax
  243.     jnz d1
  244. d2:
  245.     pop ax
  246.     add al,"0"
  247.     mov [si],al
  248.     inc si
  249.     loop d2
  250.     mov [si],byte ptr '$'
  251.     mov dx, offset Text
  252.     call OutStr
  253.     cmp [OutValNL],0
  254.     je NotOutNL
  255.     mov dx, offset NewLine
  256.     call OutStr
  257. NotOutNL:
  258.     popa
  259.     ret
  260.  
  261.     ;Функция, выводит строку по адресу ds:dx
  262. OutStr:
  263.     pusha
  264.     mov ah,09h
  265.     int 21h
  266.     popa
  267.     ret
  268. END Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement