Guest User

Untitled

a guest
Jan 12th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. data segment
  2.     input db 'input.txt',0      ;входной файл
  3.     output db 'output.txt',0        ;выходной файл
  4.     o_err db 'Ошибка открытия файла$'
  5.     r_err db 'Ошибка чтения файла$'
  6.     w_err db 'Ошибка записи в файл$'
  7.     str1 db 'Строка '
  8.     str2 db ' не согласующиеся скобки '
  9.     str3 db ' не хватает '
  10.     str4 db ' лишняя(ие) '
  11.     str5 db ' ")" '
  12.     ent db 0dh,0ah
  13.     buf db 128 dup(0)   ;буфер для чтения из файла
  14.     buf2 db 50 dup(0)   ;буфер для перевода из строки в число     ; 50 - OCHEN много. 6 должно хватить ('65535$')
  15.     buf3 db 128 dup(0)  ;буфер для вывода строки в файл
  16.     l_count db 0    ;счетчик левых скобок
  17.     r_count db 0    ;счетчик правых скобок
  18.     st_count db 0   ;счетчик строк
  19.     n_count db 0    ; счетчик для выявления несогласующихся скобок
  20.     sim_count dw 0
  21.     fl db 0         ;флаг поледней считаной из файла части
  22.     fl_sc db 0      ;флаг открытой ковычки
  23.     fl_n db 0       ;флаг несогласующихся скобок
  24.     fl_n_v db 0     ;флаг вероятности несогласовных скобок
  25.     ihandle dw ?    ;описатель файла input
  26.     ohandle dw ?    ;описатель файла output
  27. data ends
  28.  
  29. stackseg segment stack
  30.     db 128 dup(?)
  31. stackseg ends
  32.  
  33. body segment
  34. assume cs:body, ds:data, ss:stackseg
  35.  
  36. printdec proc
  37.  
  38.     push cx ;сохраняем регистры
  39.     push dx
  40.     push bx
  41.     mov bx,10   ;основание системы
  42.     XOR CX,CX   ;в сх будет количество цифр в десятичном числе
  43. @@m1:   XOR dx,dx       ;обнудяем dx
  44.     DIV bx      ;делим число на степени 10
  45.     PUSH DX     ;и сохраняем остаток от деления(коэффициенты при степенях) в стек
  46.     INC CX      ;увеличиваем количество символов в числе
  47.     TEST AX,AX  ;преобразовали все число?
  48.     JNZ @@m1    ;если нет, то продолжить
  49. @@m2:   POP AX      ;восстанавливаем остаток от деления
  50.     ADD AL,'0'  ;преобразовываем число в ASCII символ
  51.     STOSb       ;сохраняем в буфер
  52.     LOOP @@m2       ;все цифры
  53.     ;mov al, '$'    ; Ну вот нахуй же так делать? В файл же пишем.
  54.     ;stosb
  55.     pop bx      ;восстанавливаем регистры
  56.     POP dx
  57.     POP cx
  58.     RET
  59. printdec endp
  60.  
  61. write_str proc
  62.     push ax
  63.     push bx
  64.     push cx
  65.     push dx
  66.     push si
  67.    
  68.     ;--отчистка буферов
  69.     cld                 ;не нужно. Достаточно написать cld в начале проги, если не устанавливаешь DF где-нибудь.  
  70.    
  71.     mov al,0
  72.     lea di,buf2
  73.     mov cx, 50   ; => 6
  74.     rep stosb
  75.    
  76.     mov al,0
  77.     lea di,buf3
  78.     mov cx, 128
  79.     rep stosb
  80.    
  81.    
  82.     mov sim_count,7
  83.     lea di,buf3
  84.     lea si, str1
  85.     mov cx, sim_count
  86.     rep movsb
  87.    
  88.     xor ax,ax
  89.     mov al, st_count
  90.     lea di, buf2
  91.     call printdec
  92.     xor bx,bx
  93.     lea si, buf2
  94.     coun:
  95.         lodsb
  96.         cmp al,0
  97.         je done
  98.         inc bx
  99.         jmp coun           
  100.     done:  
  101.     ;dec bx
  102.    
  103.     xor dx,dx
  104.     lea di,[buf3]
  105.     add di,sim_count
  106.     lea si, buf2
  107.     mov cx, bx
  108.     rep movsb
  109.     add sim_count,bx
  110.    
  111.     ;--Есть ли несогл скобки в строке
  112.     cmp fl_n, 1
  113.     jne work
  114.     lea di,[buf3]
  115.     add di,sim_count
  116.     lea si, str2
  117.     mov cx, 25
  118.     rep movsb
  119.     add sim_count,25
  120.     jmp work2
  121.    
  122.     work:
  123.         mov bh,r_count
  124.         cmp l_count,bh
  125.         jl lish
  126.         xor dx,dx
  127.         mov dh, l_count
  128.         sub dh,r_count
  129.        
  130.         lea di,[buf3]
  131.         add di,sim_count
  132.         lea si, str3
  133.         mov cx, 12
  134.         rep movsb
  135.         add sim_count,12
  136.        
  137.         xor ax,ax
  138.         mov al, dh
  139.         lea di, buf2
  140.         call printdec
  141.         xor bx,bx
  142.         lea si, buf2
  143.         coun1:
  144.             lodsb
  145.             cmp al,0
  146.             je done1
  147.             inc bx
  148.             jmp coun1          
  149.         done1: 
  150.         dec bx
  151.        
  152.         lea di,[buf3]
  153.         add di,sim_count
  154.         lea si, buf2
  155.         mov cx, bx
  156.         rep movsb
  157.         add sim_count,bx
  158.        
  159.         lea di,[buf3]
  160.         add di,sim_count
  161.         lea si, str5
  162.         mov cx, 5
  163.         rep movsb
  164.         add sim_count,5
  165.         jmp work2
  166.        
  167.         lish:
  168.             xor dx,dx
  169.             mov dh, r_count
  170.             sub dh,l_count
  171.            
  172.             lea di,[buf3]
  173.             add di,sim_count
  174.             lea si, str4
  175.             mov cx, 12
  176.             rep movsb
  177.             add sim_count,12
  178.            
  179.             xor ax,ax
  180.             mov al, dh
  181.             lea di, buf2
  182.             call printdec
  183.             xor bx,bx
  184.             lea si, buf2
  185.             coun2:
  186.                 lodsb
  187.                 cmp al,0
  188.                 je done2
  189.                 inc bx
  190.                 jmp coun2          
  191.             done2: 
  192.             dec bx
  193.            
  194.             lea di,[buf3]
  195.             add di,sim_count
  196.             lea si, buf2
  197.             mov cx, bx
  198.             rep movsb
  199.             add sim_count,bx
  200.            
  201.             lea di,[buf3]
  202.             add di,sim_count
  203.             lea si, str5
  204.             mov cx, 5
  205.             rep movsb
  206.             add sim_count,5
  207.        
  208.         work2:
  209.             lea di,[buf3]
  210.             add di,sim_count
  211.             lea si, ent
  212.             mov cx, 2
  213.             rep movsb
  214.             add sim_count,2
  215.        
  216.     ;--запись в файл
  217.     xor ax,ax
  218.     mov ah, 40h
  219.     mov cx,sim_count
  220.     mov bx, ohandle
  221.     lea dx, buf3
  222.     int 21h
  223.    
  224.     cmp ax,cx
  225.     je succ
  226.     jmp write_err
  227.     succ:
  228.    
  229.     pop si
  230.     pop dx
  231.     pop cx
  232.     pop bx
  233.     pop ax
  234.     ret
  235. write_str endp
  236.  
  237. begin:
  238.     mov ax,data
  239.     mov ds,ax
  240.     mov es, ax
  241.     cld
  242. ;--Открываем файл
  243.     mov ax,3d00h
  244.     lea dx,input
  245.     int 21h
  246.     jnc norm
  247.     jmp open_err        ;Проверка на ошибку
  248.     norm:
  249.         mov ihandle,ax
  250.  
  251. ;--создание файла вывода
  252.     mov ax, 3c00h
  253.     lea dx, output
  254.     mov cx,20h
  255.     int 21h
  256.     jnc norm1
  257.     jmp open_err
  258.     norm1:
  259.         mov ohandle, ax
  260.    
  261. ;--Чтение из файла
  262.     mov st_count,1
  263.     read:
  264.         mov ah, 3fh
  265.         mov bx, ihandle
  266.         mov dx, offset buf
  267.         mov cx,128
  268.         int 21h
  269.         jnc norm2
  270.         jmp read_err
  271.         norm2:
  272.         mov si, offset Buf
  273.         cmp ax,cx
  274.         mov cx,ax
  275.         je cont
  276.        
  277.         ;--Закрытие файла
  278.         mov ah,3eh
  279.         mov bx, ihandle
  280.         int 21h
  281.         mov fl,1    ;Ставим флаг (будет означать, что это последний проход)
  282.        
  283.         cont:  
  284.             lodsb   ;Загрузаем один байт из si в al, inc si                     ;(если DF == 0)
  285.             cmp al,0dh      ;считаем строки
  286.             jne next0
  287.             ;--если конец строки
  288.             xor bx,bx
  289.             mov bh,r_count
  290.             cmp l_count,bh      ;сравниваем ко-во левых и правых скобок
  291.             jne next7
  292.             cmp fl_n_v,1        ;если возможны несогласующиеся скобки
  293.             jne next5
  294.             mov fl_n,1      ;ставим флаг несогласующихся скобок
  295.             next7:
  296.                 call write_str
  297.             next5:
  298.                 inc st_count
  299.                 mov fl_n,0      ;обнуляем флаги
  300.                 mov fl_n_v,0   
  301.                 mov l_count,0
  302.                 mov r_count,0
  303.                 mov n_count,0
  304.             next0:
  305.                 cmp al, "'" ;если кавычка
  306.                 jne next
  307.                 cmp fl_sc,0 ;меняем флаг, чтобы не учитывать символы внутри
  308.                 je true
  309.                 mov fl_sc,0
  310.                 jmp next
  311.             true:
  312.                 mov fl_sc,1
  313.             next:
  314.                 cmp fl_sc, 1
  315.                 je next2
  316.                 cmp al, ')'
  317.                 jne next1
  318.                 inc r_count
  319.                 dec n_count     ;учитываем несоглас. скобки
  320.             next1:
  321.                 cmp al, '('
  322.                 jne next2
  323.                 inc l_count
  324.                 inc n_count
  325.             next2:
  326.                 cmp n_count, 0
  327.                 jl next3    ;Если счетчик хоть раз был отрицательным, значит был не верный порядок скобок
  328.                 jmp next4
  329.             next3:
  330.                 mov fl_n_v,1    
  331.             next4:
  332.                 cmp fl,1     ;последний ли проход
  333.                 jne next6
  334.                 cmp cx,1        ;последний ли символ в последнем проходе
  335.                 jne next6
  336.                 xor bx,bx
  337.                 mov bh,r_count
  338.                 cmp l_count,bh      ;сравниваем ко-во левых и правых скобок
  339.                 jne next8
  340.                 cmp fl_n_v,1        ;если возможны несогласующиеся скобки
  341.                 jne next6
  342.                 mov fl_n,1      ;ставим флаг несогласующихся скобок
  343.                 next8:
  344.                     call write_str
  345.             next6:             
  346.         ;loop cont
  347.         dec cx
  348.         cmp cx,0
  349.         je loop_exit
  350.         jmp cont
  351.         loop_exit:
  352.        
  353.         cmp fl,1
  354.         je read1
  355.         jmp read
  356.         read1:
  357.  
  358.         ;--Закрытие фала записи
  359.         mov ah, 3eh
  360.         mov bx, ohandle
  361.         int 21h
  362.            
  363.        
  364.        
  365.         jmp exit
  366.        
  367.                
  368. ;--Обработка ошибки открытия
  369.     open_err:
  370.         mov ah,09h
  371.         mov dx, offset o_err
  372.         int 21h
  373.        
  374.         mov ah,01h
  375.         int 21h
  376.        
  377.         jmp exit
  378.        
  379. ;--Обработка ошибки чтения
  380.     read_err:
  381.         mov ah,09h
  382.         mov dx, offset r_err
  383.         int 21h
  384.        
  385.         mov ah,01h
  386.         int 21h
  387.        
  388.         jmp exit
  389.        
  390.     write_err:
  391.         mov ah,09h
  392.         mov dx, offset r_err
  393.         int 21h
  394.        
  395.         mov ah,01h
  396.         int 21h
  397.        
  398.         jmp exit
  399.        
  400.     exit:
  401.         mov ax,4c00h
  402.         int 21h
  403.    
  404.    
  405.    
  406. body ends
  407. end begin
Add Comment
Please, Sign In to add comment