При вводе имени файла пишет, что не может открыть файл. В чем ошибка? - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д