Advertisement
Guest User

Untitled

a guest
Jan 5th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small
  2.  
  3. .stack 200h
  4.  
  5. .data
  6.   enterNstr db 'Enter N:', 0Dh, 0Ah, '$'
  7.   enterMstr db 0Dh, 0Ah, 'Enter M:', 0Dh, 0Ah, '$'
  8.   enterAstr db 0Dh, 0Ah, 'Enter A:', 0Dh, 0Ah, '$'
  9.   N dw 0
  10.   M dw 0
  11.   A dw 0
  12.   array dw 1000 dup (0)
  13.   inputmatrix db 0Dh, 0Ah, 'Enter matrix element:', 0Dh, 0Ah, '$'
  14.   originalmatrix db 0Dh, 0Ah, 'Original matrix:', 0Dh, 0Ah, '$'
  15.   resultmatrix  db 0Dh, 0Ah, 'Result matrix:', 0Dh, 0Ah, '$'
  16.   errorstr db 0Dh, 0Ah, "Incorrect input!", 0Dh, 0Ah, '$'
  17.   errordimstr db 0Dh, 0Ah, "Incorrect dimension!", 0Dh, 0Ah, '$'
  18.  
  19. .code
  20.  
  21. ; -----------------------------------------------
  22.  
  23. ; начало проги, тут все понятно
  24. start:
  25.  
  26.     mov ax, @data
  27.     mov ds, ax
  28.     mov es, ax
  29.    
  30.     call Main
  31.    
  32.     mov ah, 01h
  33.     int 21h
  34.    
  35.     mov ah, 4Ch
  36.     int 21h
  37.  
  38. ; -----------------------------------------------------------------------------
  39.  
  40. ; читаем введенные символы
  41. Read proc
  42.  
  43.     push dx
  44.     push bx
  45.     push cx
  46.  
  47.     mov ah, 09h
  48.     int 21h
  49.  
  50.   startin:
  51.  
  52.     mov cx, 0
  53.     mov bx, 0
  54.  
  55.   startloop:
  56.  
  57.     mov ah, 01h ; читаем очередной символ
  58.     int 21h
  59.  
  60.     cmp al, 13
  61.     jnz checkdel ; если не ентер, проверяем , не нажали ли бэкспэйс
  62.     jmp returnvalue ; закончили ввод - нажали ентер
  63.  
  64.   checkdel:
  65.     ; комменты к обработке бэкспэйса есть в 4 лабе
  66.  
  67.     cmp al, 8
  68.     jnz checksymbol
  69.  
  70.     mov dl, ' '
  71.     mov ah, 02h
  72.     int 21h
  73.  
  74.     cmp cl, 0
  75.     jz startloop
  76.  
  77.     dec cl
  78.  
  79.     mov dl, 8
  80.     mov ah, 02h
  81.     int 21h
  82.  
  83.     cmp cl, 0
  84.     jz startin
  85.  
  86.     mov ax, bx
  87.     cwd
  88.     mov bx, 10
  89.     idiv bx
  90.     mov bx, ax
  91.     jmp startloop
  92.  
  93.    checksymbol:
  94.  
  95.     ; проверяем введенный символ
  96.  
  97.     cmp al, '-' ; смотрим, не минус ли мы ввели
  98.     jnz checkvalue
  99.  
  100.     cmp cl, 0 ; если минус, смотрим, а не только ли минус мы ввели
  101.     jnz errormessage ; если да, то ацтой
  102.  
  103.     mov ch, 1
  104.     inc cl
  105.     jmp startloop
  106.  
  107.   checkvalue:
  108.  
  109.     ; проверяем, является ли введенный символ числом
  110.  
  111.     cmp al, '0'
  112.     jl errormessage
  113.     cmp al, '9'
  114.     jg errormessage
  115.  
  116.   setvalue:
  117.  
  118.     ; получаем само число из символа: типа символы '9' - '0' = 9 - типа число, например
  119.  
  120.     inc cl
  121.     sub al, '0'
  122.     mov ah, 0
  123.  
  124.     cmp bx, 0
  125.     jnz addvalue
  126.  
  127.     mov bx, ax
  128.     cmp ch, 0
  129.     jz startloop
  130.    
  131.     neg bx
  132.     jmp startloop
  133.  
  134.     addvalue:
  135.  
  136.     push ax
  137.     mov ax, bx
  138.     xor dx, dx
  139.     mov bx, 10
  140.     imul bx
  141.     mov bx, ax
  142.     pop ax
  143.  
  144.     cmp ch, 0
  145.     jz checkres
  146.    
  147.     sub bx, ax
  148.     sbb dx, 0
  149.  
  150.     cmp dx, 0FFFFh
  151.     jnz toerror
  152.     test bx, 8000h
  153.     jz toerror
  154.     jmp startloop
  155.  
  156.   checkres:
  157.  
  158.     add bx, ax
  159.     adc dx, 0
  160.  
  161.     cmp dx, 0000h
  162.     jnz toerror
  163.     test bx, 8000h
  164.     jnz toerror
  165.     jmp startloop
  166.  
  167.   toerror:
  168.     jmp errormessage
  169.  
  170.   returnvalue:
  171.  
  172.     mov ax, bx ; введенное число типа в ах должно лежать
  173.    
  174.     cmp cl, 0
  175.     jz  toerror
  176.     cmp bx, 0
  177.     jnz restreg
  178.     cmp ch, 0
  179.     jnz  toerror
  180.  
  181.   restreg:    
  182.     pop cx
  183.     pop bx
  184.     pop dx
  185.     ret
  186.  
  187. Read endp
  188.  
  189. ; -----------------------------------------------
  190.  
  191. errormessage:
  192.  
  193.   mov dx, offset errorstr
  194.   mov ah, 09h
  195.   int 21h
  196.   mov ah, 01h
  197.   int 21h
  198.   mov ah, 4Ch
  199.   int 21h
  200.  
  201.  
  202. ; -----------------------------------------------
  203. ; вывод такой же как и в прошлых лабах
  204. Write proc
  205.  
  206.   push ax
  207.   push bx
  208.   push cx
  209.   push dx
  210.  
  211.   mov cx, 0
  212.  
  213.   test ax, 8000h
  214.   jz Positive
  215.  
  216.   push ax
  217.   mov dl, '-'
  218.   mov ah, 02h
  219.   int 21h
  220.   pop ax
  221.   neg ax
  222.  
  223.   Positive:
  224.  
  225.   loop1:
  226.  
  227.     mov dx, 0
  228.     mov bx, 10
  229.     div bx
  230.  
  231.     push dx
  232.     inc cx
  233.     cmp ax, 0
  234.     jnz loop1
  235.  
  236.   loop2:
  237.  
  238.     pop dx
  239.  
  240.     add dl, '0'
  241.     mov ah, 02h
  242.     int 21h
  243.  
  244.     dec cx
  245.     jnz loop2
  246.  
  247.     pop dx
  248.     pop cx
  249.     pop bx
  250.     pop ax
  251.  
  252.   ret
  253.  
  254. Write endp
  255.  
  256. ; -----------------------------------------------
  257.  
  258. ; вводим элементы матрицы
  259. EnterMatrix proc
  260.  
  261.   push ax
  262.   push cx
  263.   push dx
  264.   push di
  265.  
  266.   mov dx, offset inputmatrix
  267.  
  268.   mov di, offset array  
  269.   mov cx, M
  270.  
  271.   ; тут типа цикл по столбцам и строкам
  272.   rows:
  273.  
  274.     push cx
  275.     mov cx, N
  276.  
  277.   columns:
  278.  
  279.     call Read
  280.  
  281.     stosw
  282.    
  283.   loop columns
  284.    
  285.   pop cx
  286.    
  287.   loop rows
  288.  
  289.   mov dx, offset originalmatrix
  290.   mov ah, 09h
  291.   int 21h
  292.  
  293.   call ShowMatrix ; рисуем матрицу красиво так
  294.    
  295.   pop di
  296.   pop dx
  297.   pop cx
  298.   pop ax
  299.  
  300.   ret
  301.  
  302. EnterMatrix endp
  303.  
  304. ; -----------------------------------------------
  305. ; прост вывод элементов матрицы в виде матрицы на экран
  306. ShowMatrix proc
  307.  
  308.   push ax
  309.   push cx
  310.   push si
  311.  
  312.   mov si, offset array
  313.   mov cx, M
  314.  
  315.   external:
  316.  
  317.     push cx
  318.     mov cx, N
  319.    
  320.   internal:
  321.  
  322.     lodsw
  323.    
  324.     call Write
  325.    
  326.     mov dl, ' '
  327.     mov ah, 02h
  328.     int 21h
  329.    
  330.   loop internal
  331.  
  332.     mov dl, 0Dh
  333.     mov ah, 02h
  334.     int 21h
  335.    
  336.     mov dl, 0Ah
  337.     mov ah, 02h
  338.     int 21h
  339.    
  340.     pop cx
  341.    
  342.   loop external
  343.  
  344.   pop si
  345.   pop cx
  346.   pop ax
  347.  
  348.   ret
  349.  
  350. ShowMatrix endp
  351.  
  352. ; -----------------------------------------------
  353. ; тут кароче бегаем по матрице и сравниваем каждый элемент с введенным числом А, и если элемент матрицы мень чем А, то мы его зануляем
  354. Task proc
  355.  
  356.   push ax
  357.   push bx
  358.   push cx
  359.   push si
  360.   push di
  361.  
  362.   xor ax, ax
  363.   mov si, offset array
  364.   mov di, offset array
  365.   mov bx, 0
  366.   mov cx, M
  367.              
  368.   outcycle:
  369.  
  370.     push cx
  371.     mov cx, N
  372.    
  373.   incycle:
  374.    
  375.         lodsw ; типа читаем
  376.    
  377.     cmp ax, A ; типа чекаем
  378.     jle svcycle
  379.     mov ax, 0
  380.  
  381.      svcycle:
  382.      
  383.     stosw ; типа записываем ноль если че
  384.  
  385.   loop incycle
  386.  
  387.     pop cx
  388.      
  389.   loop outcycle
  390.  
  391.   pop di
  392.   pop si
  393.   pop cx
  394.   pop bx
  395.   pop ax
  396.  
  397.   ret
  398.  
  399. Task endp
  400.  
  401. ; -----------------------------------------------
  402.  
  403. Main proc
  404.  
  405.   push ax
  406.   push bx
  407.   push dx
  408.  
  409.   ; читаем N
  410.   mov dx, offset enterNstr
  411.  
  412.   call Read
  413.   mov N, ax
  414.  
  415.   ; читаем M
  416.   mov dx, offset enterMstr
  417.  
  418.   call Read
  419.   mov M, ax
  420.  
  421.   mul N ; M x N
  422.   cmp dx, 0 ; если в dx что-то есть, то значит размер слишком большой
  423.   jnz dimensionerror
  424.  
  425.   cmp ax, 0 ; если M x N = 0, то значит тоже неправильная размерность
  426.   jz dimensionerror
  427.  
  428.   cmp ax, 1000 ; тоже слишком много
  429.   ja dimensionerror
  430.  
  431.   startenter:
  432.  
  433.   call EnterMatrix ; вводим матрицу
  434.  
  435.   mov dx, offset enterAstr
  436.   ;mov ah, 09h
  437.   ;int 21h
  438.  
  439.   call Read
  440.   mov A, ax
  441.  
  442.   call Task
  443.  
  444.   mov dx, offset resultmatrix
  445.   mov ah, 09h
  446.   int 21h
  447.  
  448.   call ShowMatrix
  449.  
  450.     pop dx
  451.     pop bx
  452.     pop ax
  453.  
  454.     ret
  455.  
  456. Main endp
  457.  
  458. ; -----------------------------------------------
  459.  
  460. dimensionerror:
  461.  
  462.   mov dx, offset errordimstr
  463.   mov ah, 09h
  464.   int 21h
  465.   mov ah, 01h
  466.   int 21h
  467.   mov ah, 4Ch
  468.   int 21h
  469.  
  470. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement