При вводе имени файла пишет, что не может открыть файл. В чем ошибка? - Assembler

Узнай цену своей работы

Формулировка задачи:

Сделал ехе(Из COM в EXE), убрал предупреждение, но почему-то exe при вводе имени файла пишет что не может открыть файл, что может быть не так, подскажите пожалуйста.
.model tiny
.386
.data
mess0  DB  13,10,'   READ FILE NAME......: $'
mess1  DB  13,10,'<--OK!  file size......: $'
mess2  DB  13,10,10,'   CRYPT MASK (byte)...: $'
mess3  DB  13,10,'<--OPERATION COMPLETED!$'
mess4  DB  13,10,'-----------------------------'
       DB  13,10,'   CREATE "DATFILE.TXT" - OK!$'
 
buff   DB  1024 DUP(0)     ; буфер для файла
fName  DB  16   DUP(0)     ; имя файла (в формате 8.3)
fSize  DW  0
key    DB  0
.code
start:
push cs
pop ds
SSEG segment stack
db 400h dup (?)
SSEG ends
   MOV   DX,offset mess0
   CALL  MESSAGE
;------------------- юзер вводит имя файла,
;------------------- а мы его сохраняем --------------------------//
   MOV   DI,offset fName          ; DI для STOSB...
fileName:                  ;
   MOV   AH,1              ;
   INT   21h               ; читаем символ
   CMP   AL,13             ; выход по ENTER
   JE    next              ;
   STOSB                   ; пишем символы в "ФайлНэйм"
   JMP   fileName          ;
next:                      ;
 
   MOV   AX,3D02h          ; открыть файл! -----------------------//
   MOV   DX,offset fName          ;
   INT   21h               ;
   JC    error             ; ошибка?
   XCHG  AX,BX             ; дескриптор файла в ВХ
   MOV   AH,3Fh            ; читать файл! ------------------------//
   MOV   DX,offset buff           ;    куда,
   MOV   CX,0FFFFh         ;       и сколько
   INT   21h               ;
   JC    error             ;
   MOV   [fSize],AX        ; размер файла в переменной
   MOV   AH,3Eh            ; fucking file! -----------------------//
   INT   21h               ;
   JC    error             ;
 
   MOV   DX,offset mess1          ; покажем ОК! -------------------------//
   CALL  MESSAGE           ;
   MOV   AX,[fSize]        ; ..с размером файла
   MOV   BX,10             ;     в 10-тичной системе
   CALL  HEX2ASC           ;
 
   MOV   DX,offset mess2          ; запрос на ввод ключа шифрования -----//
   CALL  MESSAGE           ;
   CALL  ASC2HEX           ;
   MOV   [key],CL          ; ключ в переменной
 
   MOV   CX,[fSize]        ; ..байтов для шифрования
   MOV   SI,offset buff           ; источник
   MOV   BL,[key]          ; ключ шифрования
crypt:                     ;
   MOV   AL,BYTE[SI]       ; берём байт
   XOR   AL,BL             ; "ксорим" его ключом<------------------------------------------------XOR\SUB
   MOV   BYTE[SI],AL       ; и записываем обратно на место
   INC   SI                ; следующий байт..
   LOOP  crypt             ;
 
   MOV   DX,offset mess3          ; мессага ОК!
   CALL  MESSAGE           ;
   CALL  @@01                ; создаём новый файл ------------------//
   DB    'DATFILE.TXT',0   ;
@@01:                        ;
   MOV   AH,3Ch            ;
   POP   DX                ; имя файла в DX
   MOV   CX,20h            ; атрибут - архивный
   INT   21h               ;
   JC    error
   XCHG  BX,AX             ; дескриптор файла в BX
 
   MOV   AH,40h            ; запись в файл -----------------------//
   MOV   DX,offset buff           ;
   MOV   CX,[fSize]        ; кол-во выводимым символов
   INT   21h               ;
   JC    error             ;
   MOV   AH,3Eh            ; fucking file! -----------------------//
   INT   21h
   MOV   DX,offset mess4          ; мессага "Создали Файл!"
   CALL  MESSAGE           ;
   JMP   exit              ;
 
error:                     ; обработка ошибки --------------------//
   CALL  @@@
   DB    13,10,7,'<--ERROR FILE OPERATION!$'
@@@:                        ;
   POP   DX                ;
   CALL  MESSAGE           ;
 
exit:
   XOR   AX,AX             ; выход!
   INT   16h               ;
   mov ah,4Ch
int 21h               ;
 
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
MESSAGE:
   MOV   AH,9
   INT   21h
RET
 
;//======= ФУНКЦИЯ ВЫВОДИТ НА ЭКРАН В РАЗЛИЧНЫХ СС ================|
HEX2ASC:
   PUSHA                   ; перевод из HEX в ASCII и вывод на экран
   XOR   CX,CX             ;  вход: BX = система счисления, AX = число
isDiv:                     ; выход: на экране
   XOR   DX,DX             ;
   DIV   BX                ;
   PUSH  DX                ;
   INC   CX                ;
   OR    AX,AX             ;
   JNZ   isDiv             ;
isOut:                     ;
   POP   AX                ;
   CMP   AL,9              ;
   JLE   noHex             ;
   ADD   AL,7              ; коррекция для HEX..
noHex:                     ;
   ADD   AL,30h            ;
   INT   29h               ; выводим символ на экран
   LOOP  isOut             ;
   POPA                    ;
RET
 
;//========= ПРОЦЕДУРА СОХРАНЕНИЯ ВВОДА В HEX-ФОРМАТЕ =============|
ASC2HEX:
   XOR    CX,CX            ; выход: CX = число
@0:                        ;
   MOV    AH,1             ; ввод с эхом
   INT    21h              ;
   CMP    AL,13            ; выход по ENTER
   JE     stop             ;
   SUB    AL,30h           ;
   CMP    AL,9             ;
   JBE    @2               ;
   SUB    AL,11h           ; значит HEX-буква. Отнимаем от неё фактор
   CMP    AL,5             ; если заглавная буква, то остаток будет
   JBE    @1               ; в пределах(5). Ниже/равно - коррекция!
   SUB    AL,20h           ; значит прописная буква. Коррекция..
@1:                        ;
   ADD    AL,10            ; коррекция букв "A..F", в "11..15"
@2:                        ;
   SHL    CX,4             ; сдвигаем мл.тетраду(CL), в старшую
   OR     CL,AL            ; в мл.тетраду(CL) запишем наше числ
   JMP    @0               ;
stop:                      ; результат в CX.
RET
end start
Исправил чуть, теперь файл открывает, шифрует, но не создает файл DATFILE.TXT
.model small
.stack 100h
.data
mess0  DB  13,10,'   READ FILE NAME......: $'
mess1  DB  13,10,'<--OK!  file size......: $'
mess2  DB  13,10,10,'   CRYPT MASK (byte)...: $'
mess3  DB  13,10,'<--OPERATION COMPLETED!$'
mess4  DB  13,10,'-----------------------------'
       DB  13,10,'   CREATE "DATFILE.TXT" - OK!$'
 
buff   DB  1024 DUP(0)     ; ????? ??? ?????
fName  DB  16   DUP(0)     ; ??? ????? (? ??????? 8.3)
fSize  DW  0
key    DB  0
.code
start:
MOV    AX,@DATA    
    MOV    DS,AX 
    mov es,ax
;SSEG segment stack
;db 400h dup (?)
;SSEG ends
   MOV   DX,offset mess0
   CALL  MESSAGE
;------------------- ???? ?????? ??? ?????,
;------------------- ? ?? ??? ????????? --------------------------//
   MOV   DI,offset fName          ; DI ??? STOSB...
fileName:                  ;
   MOV   AH,1              ;
   INT   21h               ; ?????? ??????
   CMP   AL,13             ; ????? ?? ENTER
   JE    next              ;
   STOSB                   ; ????? ??????? ? "????????"
   JMP   fileName          ;
next:                      ;
 
   MOV   AX,3D02h          ; ??????? ????! -----------------------//
   MOV   DX,offset fName          ;
   INT   21h               ;
   JC    error             ; ???????
   XCHG  AX,BX             ; ?????????? ????? ? ??
   MOV   AH,3Fh            ; ?????? ????! ------------------------//
   MOV   DX,offset buff           ;    ????,
   MOV   CX,0FFFFh         ;       ? ???????
   INT   21h               ;
   JC    error             ;
   MOV   [fSize],AX        ; ?????? ????? ? ??????????
   MOV   AH,3Eh            ; fucking file! -----------------------//
   INT   21h               ;
   JC    error             ;
 
   MOV   DX,offset mess1          ; ??????? ??! -------------------------//
   CALL  MESSAGE           ;
   MOV   AX,[fSize]        ; ..? ???????? ?????
   MOV   BX,10             ;     ? 10-?????? ???????
   CALL  HEX2ASC           ;
 
   MOV   DX,offset mess2          ; ?????? ?? ???? ????? ?????????? -----//
   CALL  MESSAGE           ;
   CALL  ASC2HEX           ;
   MOV   [key],CL          ; ???? ? ??????????
 
   MOV   CX,[fSize]        ; ..?????? ??? ??????????
   MOV   SI,offset buff           ; ????????
   MOV   BL,[key]          ; ???? ??????????
crypt:                     ;
   MOV   AL,BYTE[SI]       ; ????? ????
   XOR   AL,BL             ; "??????" ??? ??????<------------------------------------------------XOR\SUB
   MOV   BYTE[SI],AL       ; ? ?????????? ??????? ?? ?????
   INC   SI                ; ????????? ????..
   LOOP  crypt             ;
 
   MOV   DX,offset mess3          ; ??????? ??!
   CALL  MESSAGE           ;
   CALL  @@01                ; ??????? ????? ???? ------------------//
   DB    'DATFILE.TXT',0   ;
@@01:                        ;
   MOV   AH,3Ch            ;
   POP   DX                ; ??? ????? ? DX
   MOV   CX,20h            ; ??????? - ????????
   INT   21h               ;
   JC    error
   XCHG  BX,AX             ; ?????????? ????? ? BX
 
   MOV   AH,40h            ; ?????? ? ???? -----------------------//
   MOV   DX,offset buff           ;
   MOV   CX,[fSize]        ; ???-?? ????????? ????????
   INT   21h               ;
   JC    error             ;
   MOV   AH,3Eh            ; fucking file! -----------------------//
   INT   21h
   MOV   DX,offset mess4          ; ??????? "??????? ????!"
   CALL  MESSAGE           ;
   JMP   exit              ;
 
error:                     ; ????????? ?????? --------------------//
   CALL  @@@
   DB    13,10,7,'<--ERROR FILE OPERATION!$'
@@@:                        ;
   POP   DX                ;
   CALL  MESSAGE           ;
 
exit:
   XOR   AX,AX             ; ?????!
   INT   16h  
;int 20h             ;
   mov ah,4Ch
int 21h               ;
 
;???????????????????????????????????????????????????????????????????
MESSAGE:
   MOV   AH,9
   INT   21h
RET
 
;//======= ??????? ??????? ?? ????? ? ????????? ?? ================|
HEX2ASC:
   PUSHA                   ; ??????? ?? HEX ? ASCII ? ????? ?? ?????
   XOR   CX,CX             ;  ????: BX = ??????? ?????????, AX = ?????
isDiv:                     ; ?????: ?? ??????
   XOR   DX,DX             ;
   DIV   BX                ;
   PUSH  DX                ;
   INC   CX                ;
   OR    AX,AX             ;
   JNZ   isDiv             ;
isOut:                     ;
   POP   AX                ;
   CMP   AL,9              ;
   JLE   noHex             ;
   ADD   AL,7              ; ????????? ??? HEX..
noHex:                     ;
   ADD   AL,30h            ;
   mov ah,2
mov dl,al
int 21h
               ; ??????? ?????? ?? ?????
   LOOP  isOut             ;
   POPA                    ;
RET
 
;//========= ????????? ?????????? ????? ? HEX-??????? =============|
ASC2HEX:
   XOR    CX,CX            ; ?????: CX = ?????
@0:                        ;
   MOV    AH,1             ; ???? ? ????
   INT    21h              ;
   CMP    AL,13            ; ????? ?? ENTER
   JE     stop             ;
   SUB    AL,30h           ;
   CMP    AL,9             ;
   JBE    @2               ;
   SUB    AL,11h           ; ?????? HEX-?????. ???????? ?? ??? ??????
   CMP    AL,5             ; ???? ????????? ?????, ?? ??????? ?????
   JBE    @1               ; ? ????????(5). ????/????? - ?????????!
   SUB    AL,20h           ; ?????? ????????? ?????. ?????????..
@1:                        ;
   ADD    AL,10            ; ????????? ???? "A..F", ? "11..15"
@2:                        ;
   SHL    CX,4             ; ???????? ??.???????(CL), ? ???????
   OR     CL,AL            ; ? ??.???????(CL) ??????? ???? ????
   JMP    @0               ;
stop:                      ; ????????? ? CX.
RET
end start

Решение задачи: «При вводе имени файла пишет, что не может открыть файл. В чем ошибка?»

textual
Листинг программы
MOV DX, offset namef

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы