wedl
 
  
  Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Доброго всем утра, делаю шифратор/дешифратор(методом перестановки байтов).   Все скомпилировал. Но появилась проблема с чтением файла.          .model    small   .stack    100h    ;256 байт под стек   .data   ;--------------------------------------------------------------------------   ;Макрос: ввод строки в буффер   entbuff     macro     string       mov    ah,0Ah       lea    dx,string       int    21h   endm   ;--------------------------------------------------------------------------   ;Макрос: вывод строки на экран   dispstr     macro     string       mov    ah,9h       lea    dx,string       int    21h   endm   ;--------------------------------------------------------------------------   ;        Сообщения выдаваемые на экран   ;--------------------------------------------------------------------------   msg1        db    'Vvedite imia ishodnogo faila   $'    ; ввод имени исходного файла   msg2        db    'Vvedite imia faila dlia sohranenia $'          ; ввод имени нового файла   msg3        db    'Vvedite posledovatelnost perestanovok '            num label byte           db '  zifr (bez simvolov razdelitelei): $'    ; Ввод ключа   msg4        db    'Kodirovanie zaversheno$'    ; кодирование завершено   ;сообщения об ошибках   OUTERR        db    'Oshibka pri otkritii faila$'        ; ошибка при открытии файла   REAERR        db    'Oshibka pri chtenii iz faila$'        ; ошибка при чтении из файла   CREAERR        db    'Oshibka sozdania faila$'        ; ошибка при создании файла   CLOERR        db    'Oshibka pri zakritii faila$'        ; ошибка при закрытии файла   WRERR        DB    'Oshibka pri zapisi v vail$'        ; ошибка при записи в файл   NUERR        db    'Oshibka pri vvode kluchevoi posledovatelnosti$' ; ошибка при вводе ключевой последовательности       ;--------------------------------------------------------------------------   ;     Список параметров для ввода имени входного файла   ;--------------------------------------------------------------------------   inputfilepar    label    byte               maxlenin    db    100            ; максимальная длина   actlenin    db    100            ; фактическая длина   inputf        db    100 dup (0)        ; область для хранения имени   ;--------------------------------------------------------------------------   ;     Список параметров для ввода имени выходного файла   ;--------------------------------------------------------------------------   outputfilepar    label    byte               maxlenout    db    100            ; максимальная длина   actlenout    db    100            ; фактическая длина   outputf        db    100 dup (0)        ; область для хранения имени   ;--------------------------------------------------------------------------   ;         Список параметров для ввода значения ключа   ;--------------------------------------------------------------------------   bloc equ 8                ; константа размера блока кодирования   key_choose    label    byte               nkeylen        db    bloc +1            ; максимальная длина   ankeylen    db    bloc +1            ; фактическая длина   nkey        db    bloc +1 dup (0)        ; область для хранения значения   ;--------------------------------------------------------------------------      nbuf        db    bloc +1 dup (0)        ; область для хранения значения   ;--------------------------------------------------------------------------         ;               Дескрипторы фаилов   ;--------------------------------------------------------------------------   handle1        dw    ?            ; дескриптор исходного файла   handle2        dw    ?            ; дескриптор нового файла   ;--------------------------------------------------------------------------   ;               Прочие данные   ;--------------------------------------------------------------------------   ERRID        db      0            ; флаг ошибки   temp1        db    bloc +1 dup ('0')        ; для хранения блока данных         ;--------------------------------------------------------------------------   ;        Начало основного тела программы   ;--------------------------------------------------------------------------   .code   start:       mov    ax,@data    ; инициализация       mov    ds,ax        ; сегментных        mov    es,ax        ; регистров                 call    ENTERING    ; вызов процедуры ввода с клавиатуры   GO:           call    OPENF        ; вызов процедуры открытия файла       cmp    ERRID,0               jnz    ProgEX       call    KEY_NUMBER        ; ввод ключа       cmp    ERRID,0       jnz    ProgEX       call    CREATEF        ; создание нового файла       cmp    ERRID,0       jnz    ProgEX       call    KRYPT    ; запись нового файла       cmp    ERRID,0           jnz    ProgEX       call    CLOSEF        ; закрытие файлов       cmp    ERRID,0       jnz    ProgEX       dispstr msg4        ; вывод конечного сообщения   ProgEX:       mov    ah,8h        ; ожидание нажатия клавиши       int    21h       mov    ax,4C00h    ; завершение программы       int    21h      ;--------------------------------------------------------------------------   ;        процедура ввода параметров    ;--------------------------------------------------------------------------   ENTERING proc          dispstr msg1        ; вывод сообщения об имени исходного файла           entbuff inputfilepar    ; ввод имени       call    CH_STR       mov    bl,actlenin       mov    bh,00       mov    inputf[bx],0    ; установка символа конца имени файла       mov al,bloc       add al,30h       mov [num],al           dispstr    msg3        ; запрос на ввод числа изменения       entbuff    key_choose    ; запоминаем ключ в символьном виде          call    CH_STR       dispstr msg2        ; запрос на ввод имени выходного фаила               entbuff    outputfilepar    ; ввод имени       call    CH_STR       mov    bl,actlenout       mov    bh,00           mov    outputf[bx],0    ; установка символа конца имени файла       ret   ENTERING endp      ;--------------------------------------------------------------------------   ;             процедура открытия файла   ;--------------------------------------------------------------------------      OPENF    proc              mov    ah,3Dh       mov    al,00       lea    dx,inputf       int    21h        ; открытие файла       jc    OPER        ; переход в случае ошибки       mov    handle1,ax    ; запоминание дескриптора файла       jmp    OPEN   OPER:           dispstr    OUTERR        ; вывод сообщения об ошибке       mov    ERRID,01    ; запись факта ошибки   OPEN:       ret   OPENF    endp      ;--------------------------------------------------------------------------   ;         процедура перехода на следующую строку    ;--------------------------------------------------------------------------      CH_STR    proc           mov     ah, 02h       mov     dl, 0Ah       int     21h        ; переход на следующую строку       mov     ah, 02h       mov     dl, 0Dh       int     21h        ; возврат каретки       ret   CH_STR    endp      ;--------------------------------------------------------------------------   ;         процедура перевода сканкода ключа в числ0   ;--------------------------------------------------------------------------      KEY_NUMBER    proc       xor    cx,cx        ; зануление счетчика                mov    cl,ankeylen    ; загружаем длину строки           xor    ax,ax        ; обнуляем регистры ax и dx       lea    si,nkey        ; загружаем адрес начала символов значения       lea     di,nkey   Trans:       lodsb            ; загружаем символ в al        sub    al,49        ; перводим в число           jc    KEYERR           cmp    al,7        ; дальность пермещения не может быть больше чем (рзмер блока - 1)        ja    KEYERR       stosb                    ; загружаем переведенные числа опять в ту же стороку       loop    Trans               jmp    KEYEX       KEYERR:       call    CH_STR        ; перевод строки       dispstr NUERR        ; сообщение об ошибке       mov    ERRID,01        ; запись факта ошибки       jmp    KEYEX   KEYEX:       ret   KEY_NUMBER    endp         ;--------------------------------------------------------------------------   ;             процедура создания файла    ;--------------------------------------------------------------------------      CREATEF    proc                              lea    si,inputf    ; сравниваем имена входного и выходного файлов       lea    di,outputf       xor    cx,cx       mov    cl,80       cld       repe    cmpsb        ; посимвольная проверка имен фаилов       jz    CКER        ; если одинаковые - ошибка   CR:       mov    ah,5Bh               mov    cx,00       lea    dx,outputf       int    21h        ; создаем новый файл       jc    CКER        ; переход, если произошла ошибка создания или фаил с таким именем существует       mov    handle2,ax    ; сохраняем дескриптор файла       jmp    CREATE   CКER:           dispstr CREAERR        ; сообщение об ошибке       mov    ERRID,01    ; запись факта ошибки   CREATE:       ret   CREATEF    endp      ;--------------------------------------------------------------------------   ;             процедура закрытия файла   ;--------------------------------------------------------------------------   CLOSEF    proc           mov    ah,3Eh       mov    bx,handle1    ; загружаем дескриптор        int    21h        ; закрываем файл       mov    bx,handle2    ; загружаем дескриптор        int    21h        ; закрываем файл       jc    CLOUTERR       jmp    CLOSE1   CLOUTERR:       dispstr CLOERR        ; сообщение об ошибке       mov    ERRID,01    ; запись факта ошибки       CLOSE1:       ret   CLOSEF    endp         ;--------------------------------------------------------------------------   ;     процедура кодирования   ;--------------------------------------------------------------------------      KRYPT    proc   begwrite:       mov    ah,3Fh               mov    bx,handle1    ; Файловый номер       mov    cx,bloc    ; считываем bloc байт в память       lea    dx,temp1       int    21h        ; считываем значения в память, начиная со смещения temp1       jc    KRYPTERR       cmp    ax,0        ; проверяем сколько байт считано       je    endwr        ; если  0, то файл закончился       push     ax          cmp    ax,bloc        ; проверяем сколько байт считано       jb    ewr        ; если  <bloc, то не кодируем          mov     cx, bloc       lea    di,temp1    ; загружаем в di адрес начала блока данных       lea    si,nkey        ; загружаем адрес начала ключа       lea    bx,nbuf          changing:       mov    al,[di]        ; заносим в al текущийц байт данных       mov    ah,[si]        ; помещаем текущее значение ключа       push     bx       push      ax       mov     al,ah       xor     ah,ah       add     bx,ax       pop     ax       mov     [bx],al        ;помещаем текучий байта в байт из буфера с номером взятым из  ключа       pop     bx       inc     di       inc     si                                           ;курсач гори в аду       loop    changing                 mov    ah,40h       mov    bx,handle2    ; загружаем дескриптор нового файла       pop     cx        ; записываем число обработанных байтов в счетчик           lea    dx,nbuf       int    21h        ; переписываем в новый файл       jc    WRIERR       jmp    begwrite      ewr:       mov    ah,40h       mov    bx,handle2    ; загружаем дескриптор нового файла       pop    cx        ; записываем число обработанных байтов в счетчик           lea    dx,temp1       int    21h        ; переписываем в новый файл       jc    WRIERR       jmp    begwrite      KRYPTERR:       dispstr REAERR        ; сообщение об ошибке       mov    ERRID,01    ; запись факта ошибки       jmp endwr   WRIERR:       dispstr WRERR        ; сообщение об ошибке       mov    ERRID,01    ; запись факта ошибки   endwr:       ret       KRYPT    endp         end start      С уважением Лев. |