Я не понимаю, почему моя программа не работает

Я пытаюсь написать код, который читает и записывает текстовый файл с прерыванием 21h.

вот мой код:

IDEAL
MODEL small
STACK 100h
DATASEG
filename db 'testfile.txt',0
filehandle dw ?
Message db 'Hello world!'
ErrorMsg db 'Error', 10, 13,'$'
CODESEG
proc OpenFile
; Open file for reading and writing
mov ah, 3Dh
mov al, 2
mov dx, offset filename
int 21h
jc openerror
mov [filehandle], ax
ret
openerror:
mov dx, offset ErrorMsg
mov ah, 9h
int 21h
ret
endp OpenFile
proc WriteToFile
; Write message to file
mov ah,40h
mov bx, [filehandle]
mov cx,12
mov dx,offset Message
int 21h
ret
endp WriteToFile
proc CloseFile
push ax
push bx
; Close file
mov ah,3Eh
mov bx, [filehandle]
int 21h
pop bx
pop ax
ret
endp CloseFile
start:
mov ax, @data
mov ds, ax
; Process file
call OpenFile
call WriteToFile
call CloseFile
quit:
mov ax, 4c00h
int 21h
END start

Почему это не работает??

1 ответ

proc OpenFile
; Open file for reading and writing
mov ah, 3Dh
mov al, 2
mov dx, offset filename
int 21h
jc openerror
mov [filehandle], ax
ret
openerror:
mov dx, offset ErrorMsg
mov ah, 9h
int 21h
ret               <--- This is an extra problem!
endp OpenFile

Это ваша программа, которая отображает сообщение "Ошибка" на экране.
Это происходит потому, что в процедуре OpenFile функция DOS 3Dh возвращается с установленным флагом переноса. Скорее всего, это происходит потому, что файл не был найден, просто потому, что его еще не было!
Для начала измените программу, включив в нее процесс CreateFile. Не забудьте изменить call OpenFile в call CreateFile,

proc CreateFile
  mov dx, offset filename
  xor cx, cx
  mov ah, 3Ch
  int 21h
  jc  CreateError
  mov [filehandle], ax
  ret
 CreateError:
  mov dx, offset ErrorMsg
  mov ah, 9h
  int 21h
  jmp Quit          <--- Solution to the extra problem!
endp CreateFile

Обратите внимание, что когда DOS сообщает об ошибке, недостаточно просто отобразить сообщение и затем продолжить работу с программой, используя ret,
Вы должны отказаться от программы, потому что последующие действия в любом случае не будут успешными.


Функции DOS 40h (WriteToFile) и 3Eh (CloseFile) также сообщают о возможных ошибках через CF. Удостоверьтесь, что поймаете этот перенос подобным способом.

Другие вопросы по тегам