Advertisement
Abaduaber

VadSid_3

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