Advertisement
Guest User

Untitled

a guest
May 22nd, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model  small
  2. .386
  3. .stack  100h
  4. .data
  5. ;##########################################################################
  6. ;##################################     Данные  #############################
  7. ;##########################################################################
  8.  
  9. ;       Информационные сообщения выдаваемые на экран
  10.  
  11. msg0        db  'Dlya vklu4enia rezhima dekodirovania nazhmite "d":  $'  
  12. msg1        db  'Vvedite imia vhodnogo  faila   $'         
  13. msg2        db  'Vvedite imia vihodnogo faila $'         
  14. msg3        db  'Vvedite kluch (sostoyashii iz simvolov 1..'
  15. num label byte
  16.         db ' ) : $'
  17. msg4        db  'Diestvie zaversheno! $'
  18. msg5        db  'rezhim - kodirovanie$'
  19. msg6        db  'rezhim - Dekodirovanie$'
  20.  
  21. ;    сообщения об ошибках
  22.  
  23. open_file_error     db  'ERROR: Oshibka pri otkritii faila$'       
  24. read_file_error     db  'ERROR: Oshibka pri chtenii iz faila$'     
  25. create_file_error   db  'ERROR: Oshibka sozdania faila$'       
  26. close_file_error    db  'ERROR: Oshibka pri zakritii faila$'       
  27. write_file_error    db  'ERROR: Oshibka pri zapisi v vail$'    
  28. key_format_error    db  'ERROR: Oshibka pri vvode klucha$'  
  29. source_empty_err    db  'ERROR: Ishodnii fail pust$'  
  30. source_format_err   db  'ERROR: Ishodnii fail povrezden$'  
  31.  
  32. ;   Список параметров для ввода имени входного файла
  33.  
  34. inputfilepar    label   byte           
  35. max_len_in  db  80                ; максимальная длина
  36. act_len_in  db  80                ; фактическая длина
  37. inputf        db    80 dup (0)      ; область для хранения имени входного файла
  38.  
  39. ;   Список параметров для ввода имени выходного файла
  40.  
  41. outputfilepar   label   byte           
  42. max_len_out   db    80                ; максимальная длина
  43. act_len_out   db    80                ; фактическая длина
  44. outputf         db  80 dup (0)      ; область для хранения имени выходного файла
  45.  
  46. ;   Список констант задающих параметры кодирования
  47.  
  48. bloc  equ 8                          ; константа длины ключа
  49. blocj equ 3                    ; доп. параметр размера блока кодирования
  50. bsize equ bloc*blocj           ; резервировано: должно быть bsize
  51.  
  52. ;   Список параметров для ввода значения ключа
  53.  
  54. key_choose  label   byte           
  55. nkeylen     db  bloc +1             ; максимальная длина
  56. ankeylen    db  bloc +1             ; фактическая длина
  57. nkey          db    bloc +1 dup (0) ; область для хранения ключа
  58. nbuf          db    bsize +1 dup (0)    ; область для хранения данных выходного буфера
  59. fsize     label dword
  60. fsize_low   dw ?
  61. fsize_high  dw ?
  62.  
  63. ;   Дескрипторы файлов
  64.  
  65. input_handle        dw  ?                     ; дескриптор входного файла
  66. output_handle       dw  ?                     ; дескриптор выходного файла
  67.  
  68. ;   Флаги и Прочие данные
  69.  
  70. ERRID           db      0                             ; флаг ошибки
  71. temp1             db    bsize +1 dup ('0')      ; для хранения блока данных
  72. it            db ?  
  73. jt            db ?
  74. PARAM1_ID       db      0       ; флаг ввода 1ого параметра
  75. PARAM2_ID       db      0       ; флаг ввода 2ого параметра
  76. PARAM3_ID       db      0       ; флаг ввода 3его параметра
  77. CODERING        db      1       ; флаг режима работы
  78.  
  79. ;##########################################################################
  80. ;################################       Макросы  ##############################
  81. ;##########################################################################
  82.  
  83. ;   Макрос: ввод строки в буффер
  84. entbuff     macro   string
  85.     mov ah,0Ah
  86.     lea dx,string
  87.     int 21h
  88. endm
  89.  
  90. ;   Макрос: вывод строки на экран
  91. dispstr     macro   string
  92.     mov ah,9h
  93.     lea dx,string
  94.     int 21h
  95. endm
  96.  
  97. ;   Макрос: вывод строки на экран
  98. dispstr2    macro   string,strl1
  99.     mov ah,40h
  100.     mov bx,0
  101.     xor cx,cx
  102.     mov cl,strl1
  103.     lea dx,string
  104.     int 21h
  105. endm
  106.  
  107. ;##########################################################################
  108. ;#####################      Начало основного тела программы  ################
  109. ;##########################################################################
  110. .code
  111. start:
  112.     push    offset nkey     ; адрес переменной ключа
  113.     push    offset outputf  ; адрес переменной имены выходного файла
  114.     push    offset inputf   ; адрес переменной имены входного файла
  115.     call    ReadCmdParam        ; вызов процедуры чтения параметров запуска
  116.     mov ax,@data            ; инициализация
  117.     mov ds,ax                 ; сегментных
  118.     mov es,ax                 ; регистров
  119.     call InitParams       ; вызов процедуры инифиализации параметров
  120.     call SetMode          ; установка режима работы (кодирование / декодирование)
  121.     call openf              ; вызов процедуры открытия файла
  122.     cmp ERRID,0
  123.     jne ProgEX
  124.     call KeyToNum             ; обработка ключа
  125.     cmp ERRID,0
  126.     jne ProgEX
  127.     call createf              ; создание нового файла
  128.     cmp ERRID,0
  129.     jne ProgEX
  130.     cmp CODERING,0        ; выбор режима работы
  131.     je go_decode
  132.     call    WriteLn
  133.     dispstr msg5
  134.     call    WriteLn
  135.     call    EncodeFile      ; кодирование и запись нового файла
  136.     jmp gogo
  137. go_decode:
  138.   call  WriteLn
  139.   dispstr msg6
  140.   call  WriteLn
  141.     call    DecodeFile      ; декодирование запись нового файла
  142. gogo:
  143.     cmp ERRID,0
  144.     jne ProgEX
  145.     call    closef            ; закрытие файлов
  146.     cmp ERRID,0
  147.     jne ProgEX
  148.     call    WriteLn
  149.     dispstr msg4              ; вывод конечного сообщения
  150. ProgEX:
  151.     mov ah,8h                 ; ожидание нажатия клавиши
  152.     int 21h
  153.     mov ax,4C00h            ; завершение программы
  154.     int 21h
  155.  
  156.  
  157. ;##########################################################################
  158. ;##################     процедура ввода режима работы    ####################
  159. ;##########################################################################
  160. SetMode proc
  161.   call  WriteLn
  162.   dispstr msg0        ; вывод пригласительного сообщения
  163. loopem:
  164.   mov ah, 01h
  165.   int 21h
  166.   cmp al,'d'          ; если введенный символ d, то режим - декодирование
  167.   jne set_1           ; иначе кодирование
  168.   mov CODERING,0
  169.   jmp endsetmode
  170. set_1:
  171.   mov CODERING,1
  172.   jmp endsetmode
  173. endsetmode:
  174.   call WriteLn
  175.   ret
  176. SetMode endp
  177.  
  178. ;##########################################################################
  179. ;##################     процедура ввода параметров    #######################
  180. ;##########################################################################
  181. InitParams proc
  182.   call  WriteLn
  183.     dispstr msg1              ; вывод сообщения об имени исходного файла
  184.     cmp PARAM1_ID,1
  185.     jne h_1
  186.     dispstr2 inputf,act_len_in
  187.     call    WriteLn
  188.     jmp h_11
  189. h_1:
  190.     entbuff inputfilepar    ; ввод имени
  191.     call    WriteLn
  192.     xor bx,bx
  193.     mov bl,act_len_in
  194.     mov inputf[bx],0        ; установка символа конца имени файла
  195. h_11:
  196.     mov al,bloc
  197.     add al,30h
  198.     mov [num],al          ; установка длины ключа в строку вывода сообщения
  199.     dispstr msg2              ; запрос на ввод имени выходного фаила    
  200.     cmp PARAM2_ID,1
  201.     jne h_2
  202.     dispstr2 outputf,act_len_out
  203.     call    WriteLn
  204.     jmp h_22
  205. h_2:
  206.     entbuff outputfilepar   ; ввод имени
  207.     call    WriteLn
  208.     xor bx,bx
  209.     mov bl,act_len_out 
  210.     mov outputf[bx],0       ; установка символа конца имени файла
  211. h_22:  
  212.     dispstr msg3              ; запрос на ввод числа изменения
  213.     cmp PARAM3_ID,1
  214.     jne h_3
  215.     dispstr2 nkey,ankeylen
  216.     call    WriteLn
  217.     jmp h_33
  218. h_3:
  219.     entbuff key_choose    ; запоминаем ключ в символьном виде
  220.   call  WriteLn
  221. h_33:
  222.     ret
  223. InitParams endp
  224.  
  225.  
  226.  
  227. ;##########################################################################
  228. ;################# процедура чтения параметров запуска  ###################
  229. ;##########################################################################
  230. ReadCmdParam    proc, filein:word, fileout:word, keypass:word
  231.     push bp
  232.     mov bp,sp
  233.     push ds                     ; процедура ReadCmdParam меняет содержимое регистров ds и es
  234.     push es                     ; поэтому сохраним их в стеке
  235.     push ax                     ; поэтому сохраним их в стеке
  236.     mov ax,@data
  237.     mov es, ax                ;Копируем в es адрес сегмента данных
  238.     mov si, 81h               ;Смещение в PSP строки параметров
  239.     xor cx,cx
  240.     mov cl, ds:[si-1]         ;Загрузка длины строки параметров
  241.     cmp cx,0                      ;проверяем, есть ли параметры
  242.     je  param_error             ;Выход из процедуры если их нет
  243. probel:
  244.     cmp byte ptr [si], 20h  ; Убираем начальные пробелы в строке параметров
  245.     jne readpar
  246.     inc si
  247.     loop probel
  248.     cmp cx,0       
  249.     jz param_error            ; Если вся строка состоит из пробелов, то ошибка
  250. readpar:   
  251.   mov es:PARAM1_ID,1
  252.   mov es:it,1
  253.     mov di,filein                 ; Загрузка адреса переменной имени входного файла
  254. inF:   
  255.   cld
  256.     movsb                             ; Посимвольная запись
  257.     cmp byte ptr [si],20h   ; Если пробел, переход к следующей переменной
  258.     je  keyst              
  259.     cmp byte ptr [si],0Dh     ; Если конец строки, ошибка ввода параметров
  260.     je  param_error
  261.     add es:it,1    
  262.     jmp inF        
  263. keyst:
  264.   mov ah,es:it
  265.   mov es:act_len_in,ah
  266.   mov es:PARAM2_ID,1
  267.   mov es:it,1
  268.     mov di,fileout              ;Загрузка адреса переменной имени выходного файла
  269.     inc si
  270. keyst1:
  271.   cld
  272.   movsb                         ; Посимвольная запись
  273.     cmp byte ptr [si],20h     ; Если пробел, переход к следующей переменной
  274.     je  OuF
  275.     cmp byte ptr [si],0Dh     ; Если конец строки, ошибка ввода параметров
  276.     je  param_error
  277.     add es:it,1
  278.     jmp keyst1 
  279. OuF:
  280.   mov ah,es:it
  281.   mov es:act_len_out,ah
  282.   mov es:it,1
  283.   mov es:PARAM3_ID,1
  284.     mov di,keypass          ; Загрузка адреса переменной ключа
  285.     inc si  
  286. OuF1:  
  287.   movsb                         ; Посимвольная запись
  288.     cmp byte ptr [si],20h     ; Если пробел или конец строки, выход из процедуры без ошибки   
  289.     je  NoErrPar
  290.     cmp byte ptr [si],0Dh
  291.     je  NoErrPar
  292.     add es:it,1
  293.     jmp OuF1
  294. NoErrPar:  
  295.   mov ah,es:it
  296.   mov es:ankeylen,ah
  297.   movsb                         ; Посимвольная запись
  298.     cmp byte ptr [si],20h
  299.     clc                         ; Сброс флага переноса (факт верно введенных параметров)
  300.     jmp ParEx
  301. param_error:       
  302.     stc                         ; Установка флага переноса (факт неверно введенных параметров)
  303. ParEx: 
  304.     pop ax 
  305.     pop es 
  306.     pop ds 
  307.     pop bp     
  308.     ret 6      
  309. ReadCmdParam    endp
  310.  
  311. ;##########################################################################
  312. ;##################  процедура открытия файла  ############################
  313. ;##########################################################################
  314. openf   proc   
  315.     mov ah,3Dh
  316.     mov al,00
  317.     lea dx,inputf
  318.     int 21h                   ; открытие файла
  319.     jc  openf_error         ; переход в случае ошибки
  320.     mov input_handle,ax     ; запоминание дескриптора файла
  321.     ret
  322. openf_error:   
  323.     dispstr open_file_error ; вывод сообщения об ошибке
  324.     mov ERRID,01              ; запись факта ошибки
  325.     ret
  326. openf   endp
  327.  
  328. ;##########################################################################
  329. ;################# процедура перехода на следующую строку #################
  330. ;##########################################################################
  331. WriteLn proc   
  332.     mov     ah, 02h
  333.     mov     dl, 0Ah
  334.     int     21h         ; переход на следующую строку
  335.     mov     ah, 02h
  336.     mov     dl, 0Dh
  337.     int     21h         ; возврат каретки
  338.     ret
  339. WriteLn endp
  340.  
  341. ;##########################################################################
  342. ;################   процедура перевода код ключа в число  #################
  343. ;##########################################################################
  344. KeyToNum    proc
  345.     xor cx,cx           ; зануление счетчика      
  346.     mov cl,bloc     ; загружаем длину строки
  347.     xor ax,ax           ; обнуляем регистры ax и dx
  348.     lea si,nkey       ; загружаем адрес начала символов значения
  349.     lea  di,nkey
  350. key_length:
  351.     lodsb                 ; загружаем символ в al
  352.     sub al,49           ; переводим в число 
  353.     jc  key_error  
  354.     mov ah,bloc
  355.     dec ah
  356.     cmp al,ah         ; дальность пермещения не может быть больше чем (рзмер блока - 1)
  357.     ja  key_error
  358.     stosb             ; загружаем переведенные числа опять в ту же стороку
  359.     loop key_length    
  360.     ret
  361. key_error:
  362.     call    WriteLn     ; перевод строки
  363.     dispstr key_format_error ; сообщение об ошибке
  364.     mov ERRID,01        ; запись факта ошибки
  365.     ret
  366. KeyToNum    endp
  367.  
  368.  
  369. ;##########################################################################
  370. ;#################          процедура создания файла    #######################
  371. ;##########################################################################
  372. createf proc   
  373.     lea si,inputf       ; сравниваем имена входного и выходного файлов
  374.     lea di,outputf
  375.     xor cx,cx
  376.     mov cl,80
  377.     cld
  378.     repe    cmpsb           ; посимвольная проверка имен фаилов
  379.     jz  create_error              ; если одинаковые - ошибка
  380.     mov ah,5Bh     
  381.     mov cx,00
  382.     lea dx,outputf
  383.     int 21h             ; создаем новый файл
  384.     jc  create_error              ; переход, если произошла ошибка создания или фаил с таким именем существует
  385.     mov output_handle,ax      ; сохраняем дескриптор файла
  386.     ret
  387. create_error:  
  388.     dispstr create_file_error; сообщение об ошибке
  389.     mov ERRID,01        ; запись факта ошибки
  390.     ret
  391. createf endp
  392.  
  393. ;##########################################################################
  394. ;#########################  процедура закрытия файла  #####################
  395. ;##########################################################################
  396. closef  proc   
  397.     mov ah,3Eh
  398.     mov bx,input_handle   ; загружаем дескриптор
  399.     int 21h                 ; закрываем файл
  400.     mov bx,output_handle    ; загружаем дескриптор
  401.     int 21h                 ; закрываем файл
  402.     jc  CLOUTERR
  403.     jmp CLOSE1
  404. CLOUTERR:
  405.     dispstr create_file_error ; сообщение об ошибке
  406.     mov ERRID,01            ; запись факта ошибки 
  407. CLOSE1:
  408.     ret
  409. closef  endp
  410.  
  411. ;##########################################################################
  412. ;#########################  процедура получения размера файла  ############
  413. ;##########################################################################
  414. GetFileSize proc
  415.   push ax               ; сохранение регистров
  416.   push bx
  417.   push cx
  418.   push dx
  419.   mov  ah,42H           ;функция перемещения указателя
  420.   MOV  al,2             ;код установки на конец файла
  421.   MOV  bx,input_handle  ;номер файла в BX
  422.   MOV  cx,0             ;0 в CX и DX
  423.   MOV  dx,0             ;
  424.   INT  21H              ;сдвигаем указатель
  425.   MOV  fsize_high,dx    ;запоминаем размер файла
  426.   MOV  fsize_low,ax     ;
  427.   mov  ah,42H           ;функция перемещения указателя
  428.   MOV  al,0             ;код установки на начало файла
  429.   MOV  bx,input_handle  ;номер файла в BX
  430.   MOV  cx,0             ;0 в CX и DX
  431.   MOV  dx,0             ;
  432.   INT  21H              ;сдвигаем указатель
  433.   pop dx                ;восстановление регистров
  434.   pop cx
  435.   pop bx
  436.   pop ax
  437.   ret
  438. GetFileSize endp
  439.  
  440. ;##########################################################################
  441. ;########################  процедура кодирования  #########################
  442. ;##########################################################################
  443. EncodeFile  proc
  444.   call GetFileSize      ; получаем размер исходного файла в переменную fsize
  445.   cmp fsize,0
  446.   je error_empty
  447.   mov   ah,40h
  448.     mov bx,output_handle    ; загружаем дескриптор нового файла
  449.     mov cx,4                  ; записываем число обработанных байтов в счетчик
  450.     lea dx,fsize          ; адрес блока записывемый в файл
  451.     int 21h                 ; переписываем в новый файл размер исходного файла
  452.     jc  l_write_error
  453. main_coder:
  454.   cmp fsize,bsize  
  455.   jnb not_mix
  456.   mov cx,bsize    
  457.   push si
  458.   mov si,0
  459.   dec cx
  460. mixing:                 ; если размер данных меньше блока заполним
  461.   mov ah,0              ; сначала буфер псевдослучайными значениями таймера
  462.   push cx
  463.   int 1Ah
  464.   add dl,50
  465.   add temp1[si],dl
  466.   pop cx
  467.   inc si
  468.   loop mixing
  469.   pop si
  470. not_mix:
  471.     mov ah,3Fh     
  472.     mov bx,input_handle   ; дскриптор исходного файла
  473.     mov cx,bsize        ; считываем bsize байт в память
  474.     lea dx,temp1
  475.     int 21h                 ; считываем значения в память, начиная со смещения temp1
  476.     jc  l_read_error
  477.     cmp ax,0                  ; проверяем сколько байт считано
  478.     je  endwr                 ; если  0, то файл закончился
  479.     mov cx, bloc
  480.     lea bx,nbuf
  481.     mov it,0              ; счетчик it: 0<=it<=(bsize-1)
  482. col_loop:               ; цикл по столбцам
  483.   mov jt,0              ; счетчик jt: 0<=jt<=(blocj-1)
  484. raw_loop:               ; цикл по строкам
  485.     mov al,jt
  486.     mov bh,bloc
  487.     mul bh
  488.     mov bx,ax             ; в bx заносим jt*bloc
  489.     xor ax,ax             ; в ax заносим 0
  490.     mov al,bloc
  491.     sub ax,cx    
  492.     mov di,ax             ; в di - номер обрабатываемого столбца
  493.     mov al,[bx+di+offset(temp1)]   
  494.     push ax               ; заносим в стек текущий байт данных
  495.     mov al,nkey[di]
  496.     mov bh,blocj
  497.     mul bh
  498.     mov bx,ax             ; bx = ключ_столбца*blocj
  499.     xor ax,ax             ; в ax заносим 0
  500.     mov al,jt
  501.     mov di,ax             ; в di заносим jt
  502.     pop ax                ; извлекаем из стека байт данных
  503.     mov [bx+di+offset(nbuf)],al   ;помещаем байт в буфер
  504.     inc it
  505.     inc jt
  506.     cmp jt,blocj
  507.     jne raw_loop
  508.     loop    col_loop        ; конец цикла по колонкам
  509.     mov ah,40h
  510.     mov bx,output_handle    ; загружаем дескриптор нового файла
  511.     mov cx,bsize     ; bsize бай будет записано
  512.     lea dx,nbuf
  513.     int 21h                 ; переписываем в новый файл кодированный блок данных
  514.     jc  l_write_error
  515.     sub fsize,bsize
  516.     jmp main_coder
  517. error_empty:
  518.   dispstr source_empty_err; сообщение об ошибке
  519.     mov ERRID,01              ; запись факта ошибки
  520.     ret
  521. l_read_error:
  522.     dispstr read_file_error ; сообщение об ошибке
  523.     mov ERRID,01              ; запись факта ошибки
  524.     ret
  525. l_write_error:
  526.     dispstr write_file_error        ; сообщение об ошибке
  527.     mov ERRID,01                  ; запись факта ошибки
  528. endwr:
  529.     ret
  530. EncodeFile  endp
  531.  
  532.  
  533. ;##########################################################################
  534. ;########################  процедура ДЕкодирования  #######################
  535. ;##########################################################################
  536. DecodeFile  proc
  537.   mov   ah,3Fh     
  538.     mov bx,input_handle ; дескриптор файла
  539.     mov cx,4              ; считываем 4 байта
  540.     lea dx,fsize
  541.     int 21h               ; считываем реальный размер декодированного файла в fsize
  542.     jc  dl_read_error
  543. main_decoder:
  544.     mov ah,3Fh     
  545.     mov bx,input_handle ; дескриптор файла
  546.     mov cx,bsize      ; считываем bsize байт в память
  547.     lea dx,temp1
  548.     int 21h               ; считываем блок данных в память
  549.     jnc d_go_krypt
  550.     jmp dl_read_error
  551. d_go_krypt:
  552.     cmp ax,0                ; проверяем сколько байт считано
  553.     jne d_nf10            ; если  0, то файл закончился
  554.     ret
  555. d_nf10:
  556.   cmp ax,bsize
  557.   jb error_2
  558.     push    ax
  559.     mov cx, bloc
  560.     lea bx,nbuf
  561.     mov it,0            ; счетчик it: 0<=it<=(bsize-1)
  562. d_col_loop:           ; счетчик по  столбцам
  563.   mov jt,0            ; счетчик jt: 0<=jt<=(blocj-1)
  564. d_raw_loop:           ; счетчик по строкам
  565.     xor ax,ax           ; заносим в ax - 0
  566.     mov al,bloc
  567.     sub ax,cx    
  568.     mov di,ax
  569.     mov al,nkey[di]
  570.     mov bh,blocj
  571.     mul bh
  572.     mov bx,ax          
  573.     xor ax,ax           ; заносим в ax - 0
  574.     mov al,jt
  575.     mov di,ax
  576.     mov al,[bx+di+offset(temp1)]  
  577.     push ax             ;помещаем байт данных в стек
  578.     mov al,jt
  579.     mov bh,bloc
  580.     mul bh
  581.     mov bx,ax           ; в bx заносим ax
  582.     xor ax,ax           ; заносим в ax - 0
  583.     mov al,bloc
  584.     sub ax,cx    
  585.     mov di,ax
  586.     pop ax              ; восстановление байта данных из стека
  587.     mov [bx+di+offset(nbuf)],al ; заносим в al текущийц байт данных  
  588.     inc it
  589.     inc jt
  590.     cmp jt,blocj
  591.     jne d_raw_loop
  592.     loop    d_col_loop
  593.     mov ah,40h
  594.     mov bx,output_handle          ; загружаем дескриптор нового файла
  595.     pop cx                        ; записываем число обработанных байтов в счетчик
  596.     cmp fsize,bsize
  597.     jnb sub_b_size
  598.     mov cx,word ptr fsize
  599. sub_b_size:
  600.     lea dx,nbuf
  601.     int 21h                       ; переписываем в новый файл
  602.     jc  dl_write_error
  603.     sub fsize,bsize
  604.     jmp main_decoder
  605. error_2:
  606.     dispstr source_format_err    ; сообщение об ошибке
  607.     mov ERRID,01                  ; запись факта ошибки
  608.     ret
  609. dl_read_error:
  610.     dispstr read_file_error     ; сообщение об ошибке
  611.     mov ERRID,01                  ; запись факта ошибки
  612.     ret
  613. dl_write_error:
  614.     dispstr write_file_error        ; сообщение об ошибке
  615.     mov ERRID,01                  ; запись факта ошибки
  616. d_endwr:
  617.     ret
  618. DecodeFile  endp
  619.  
  620. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement