Advertisement
Abaduaber

VadSid_4

Jun 1st, 2013
393
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.     OddC dw 0 ;Счетчик нечетных элементов
  7.     PosProd dw 1 ;Произведение положительных элементов
  8.     CurNeg dw 0 ;Количество негативных элементов текущей строки
  9.     MaxNeg dw 0 ;максимально встреченно количество негативных элементов
  10.     MaxNegLN db 0
  11.  
  12.     Temp dw 0
  13.     BufLen db 3h ;Максимальное количество символов для ввода
  14.     BufSize db 0h ;Реальное количестве введенных символов
  15.     Text db 255 dup(0) ;Буфер для ввода текста, а также генерации вывода
  16.     NewLine db 0Dh, 0Ah, '$'
  17.    
  18.     N DB 0   ;Размерность матрицы
  19.     A DW 256 DUP(0) ;Память для матрицы
  20.     B DW 256 DUP(0) ;Матрица B
  21.  
  22.     InputN db 'Введите размер матрицы: $';
  23.     InputMatr db 'Введите матрицу: $';
  24.     OddElemsChangesCount db 'Количество замен нечетных элементов: $';
  25.     PosElemsProd db 'Произведение положительных элементов: $';
  26.     MaxNegsLine db 'Строка с максимальным количеством отрицательных элементов: $';
  27.     SrcMatrix db 'Матрица: ', 0dh, 0ah, '$';
  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 A
  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.     mov cx,ax
  71.     cmp ax,1
  72.     jl NotCalcProd
  73.     mul word ptr [PosProd]
  74.     mov [PosProd],ax
  75. NotCalcProd:
  76.     mov ax,cx   ;Сразу проверим, нечетный ли элемент
  77.     and cx,1
  78.     jz AfterChangeSign
  79.     inc [OddC]  ;Если да, корректируем переменные-счетчики
  80.     neg ax  ;Меняем знак текущего элемента на противоположный
  81. AfterChangeSign:
  82.     mov [si],ax
  83.     test ax,ax
  84.     jns NotIncNegs
  85.     inc word ptr [CurNeg]
  86. NotIncNegs:
  87.     add si,2
  88.     inc bh
  89.     cmp bh,[n]
  90.     jne InputI  ;Каждую строку
  91.     mov ax,[CurNeg] ;Проверяем на максимальное количество отрицательных элементов. Если находим, где больше, то обновляем.
  92.     cmp ax,[MaxNeg]
  93.     jle NotReplaceMax
  94.     mov [MaxNeg],ax
  95.     mov [MaxNegLN],bl
  96.     inc [MaxNegLN]
  97. NotReplaceMax:
  98.     mov word ptr [CurNeg],0
  99.     xor bh,bh
  100.     inc bl
  101.     cmp bl,[n]
  102.     je NoLongJmp    ;Каждый столбец
  103.     jmp InputI
  104. NoLongJmp:
  105.    
  106.     ;Рассказываем, сколько и чего обнаружили.
  107.     mov dx,offset OddElemsChangesCount
  108.     call OutStr
  109.     mov ax,[OddC]
  110.     call OutVal
  111.     mov dx,offset PosElemsProd
  112.     call OutStr
  113.     mov ax,[PosProd]
  114.     call OutVal
  115.     mov dx,offset MaxNegsLine
  116.     call OutStr
  117.     xor ax,ax
  118.     mov al,[MaxNegLN]
  119.     call OutVal
  120.     ;Выведем исходную матрицу
  121.     mov dx,offset SrcMatrix
  122.     call OutStr
  123.     mov si,offset A
  124.     call OutMatrix
  125.    
  126.  
  127.     ;Теперь сделаем матрицу B.
  128. MatrixBGen:
  129.     mov si,offset A
  130.     mov di,offset B
  131.     xor dl,dl
  132.     xor cx,cx
  133.     mov cl,[n]
  134.     add cx,cx
  135. SubLoop:
  136.     mov dh,[n] ;строки
  137.     dec dh
  138.     mov bx,si
  139. NextSub:
  140.     mov ax,[si]
  141.     add si,cx
  142.     sub ax,[si]
  143.     mov [di],ax
  144.     add di,cx
  145.     dec dh
  146.     jnz NextSub
  147.     mov ax,[si]
  148.     add si,cx
  149.     sub ax,[bx]
  150.     mov [di],ax
  151.     add di,cx
  152.     inc dl
  153.     xor ax,ax
  154.     mov al,dl
  155.     add al,al
  156.     mov si,offset A
  157.     mov di,offset B
  158.     add si,ax
  159.     add di,ax
  160.     cmp dl,[n]
  161.     jne SubLoop
  162.    
  163.     mov dx,offset ResultMatrix
  164.     call OutStr
  165.     mov si,offset B
  166.     call OutMatrix
  167.  
  168.     mov ah,04Ch
  169.     int 21h
  170.  
  171.  
  172.     ;Функция, выводит матрицу на экран
  173. OutMatrix:
  174.     mov [OutValNL],0 ;Вывод без перехода на новую строку, пока что
  175.     xor bx,bx
  176. OutNextElem:
  177.     mov ax,[si]
  178.     call OutVal
  179.     mov dx,offset Space
  180.     call OutStr
  181.     add si,2
  182.     inc bh
  183.     cmp bh,[n]
  184.     jne OutNextElem ;Каждую строку
  185.     mov dx,offset NewLine
  186.     call OutStr
  187.     xor bh,bh
  188.     inc bl
  189.     cmp bl,[n]
  190.     jne OutNextElem
  191.     mov [OutValNL],1 ;Включаем переход назад
  192.     ret
  193.  
  194.  
  195.     ;Функция, читает строку символов с клавиатуры
  196.     ;По выходу возвращает в регистре AX введенное число.
  197. ReadLine:
  198.     pusha
  199. Againa:
  200.     mov ah,0ah
  201.     mov [BufLen],4        
  202.     mov dx,offset BufLen   
  203.     int 21h
  204.     xor di,di
  205.     xor ax,ax
  206.     mov cl,[BufSize]
  207.     xor ch,ch
  208.     xor bx,bx
  209.     mov si,cx
  210.     mov cl,10
  211.     xor bp,bp
  212.     cmp byte ptr [Text+di],'-'
  213.     jne ConvToBin
  214.     inc bp
  215.     inc di
  216. ConvToBin:
  217.     mov bl,byte ptr [Text+di]
  218.     sub bl,"0"
  219.     js Againa
  220.     cmp bl,9
  221.     ja Againa
  222.     mul cx
  223.     add ax,bx
  224.     inc di
  225.     cmp di,si
  226.     jb ConvToBin
  227. AfterAll:
  228.     dec bp
  229.     jnz NotNeg2
  230.     neg ax
  231. NotNeg2:
  232.     mov [Temp],ax
  233.     mov dx,offset NewLine
  234.     call OutStr    
  235.     popa   
  236.     mov ax,[Temp]
  237.         ret
  238.  
  239.     ;Функция, выводит содержимое регистра ax на экран.
  240.     ;Перед этим, двоичное значение в AX преобразуется в строку по адресу Text.
  241. OutVal:
  242.     pusha
  243.     mov si,offset Text
  244.     test ax,ax
  245.     jns d0
  246.     neg ax
  247.     mov [si],byte ptr '-'
  248.     inc si
  249. d0:
  250.     mov bx,10
  251.     xor cx,cx
  252. d1:
  253.     xor dx,dx
  254.     idiv bx
  255.     push dx
  256.     inc cx
  257.     test ax,ax
  258.     jnz d1
  259. d2:
  260.     pop ax
  261.     add al,"0"
  262.     mov [si],al
  263.     inc si
  264.     loop d2
  265.     mov [si],byte ptr '$'
  266.     mov dx, offset Text
  267.     call OutStr
  268.     cmp [OutValNL],0
  269.     je NotOutNL
  270.     mov dx, offset NewLine
  271.     call OutStr
  272. NotOutNL:
  273.     popa
  274.     ret
  275.  
  276.     ;Функция, выводит строку по адресу ds:dx
  277. OutStr:
  278.     pusha
  279.     mov ah,09h
  280.     int 21h
  281.     popa
  282.     ret
  283. END Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement