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