Need a unique gift idea?
A Pastebin account makes a great Christmas gift
SHARE
TWEET

Untitled

a guest Jan 12th, 2018 44 Never
Upgrade to PRO!
ENDING IN00days00hours00mins00secs
 
  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
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top