При вводе имени файла пишет, что не может открыть файл. В чем ошибка? - 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