我不明白为什么我的程序不起作用

时间:2018-04-15 15:57:25

标签: assembly dos x86-16 tasm

我正在尝试编写一个用中断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 个答案:

答案 0 :(得分: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

您的程序会显示消息&#39;错误&#39;在屏幕上。
这样做是因为在 OpenFile 过程中,DOS函数3Dh返回并设置了进位标志。发生这种情况很可能是因为找不到文件,只是因为它还没有存在!
为了帮助您入门,请更改程序以包含 CreateFile proc。请务必将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报告可能的错误。确保以类似的方式抓住它。