我试图在我的汇编程序中打开一个文件。这是代码:
openFile proc
push ax
push bx
mov ax,seg data
mov ds,ax
cmp cl,21d
je secondToInput
secondToInput:
mov al,0
mov ah,03dh
int 021h
jb failedOpening
mov ds:[INPUT],ax
jmp endOfProc
; ---------------------------------------------------------------------
failedOpening:
mov dx,offset FAILEDOPEN
mov ah,09h
int 021h
mov ah,04ch
int 021h
; ---------------------------------------------------------------------
endOfProc:
pop bx
pop ax
ret
openFile endp
首先,澄清代码:
在调用 openFile 过程之前设置CL 。根据该参数,过程跳转到相应的代码块并执行它(因为你知道,我只有一个跳转,你可以看到)。 DX 也是预先设置的,是"字符串"的偏移量。包含文件名,以" 0"结尾,例如:" test.txt",0。
现在,问题是:
我想知道文件开放是否成功结束。我已经读过,如果设置了 CF ,则表示存在一些问题。但是,无论文件是否确实存在,该程序总是会跳转到 failedOpening 。
答案 0 :(得分:0)
我对您的代码进行了一些小改动,使其与EMU8086一起使用,它位于下方(注意添加的评论)。你知道,也许问题是你的程序找不到文件,例如,使用编译器EMU8086,文件通常必须在“path \ EMU8086 \ MyBuild”中,即使你将文件的完整路径添加到打开它,有时EMU8086不会让你找到它,除非你把它存储在“MyBuild”中。也许这就是你的情况(它发生在我身上)。
.stack 100h
.data
filename db 'test.txt',0
filehandler dw ?
okopen db 'open ok$'
failedopen db 'error open$'
.code
;INITIALIZE DATA SEGMENT.
mov ax, @data
mov ds, ax
;DATA SEGMENT MUST HAVE BEEN INITIALIZED SINCE THE BEGINNING, OR
;THE NEXT "OFFSET FILENAME" WON'T WORK.
mov dx, offset filename
call openFile
;WAIT FOR ANY KEY.
mov ah,7
int 21h
;FINISH PROGRAM
mov ah, 4ch
int 21h
;---------------------------------------------------------------------
openFile proc
push ax
push bx
; mov ax,seg data ;<======== DON'T INITIALIZE DATA
; mov ds,ax ;<======== SEGMENT IN A PROCEDURE.
cmp cl,21d
je secondToInput
secondToInput:
;OPEN FILE.
mov al,0 ;READ ONLY MODE.
mov ah,03dh ;SERVICE TO OPEN FILE.
int 21h
jb failedOpening ;ERROR IF CARRY FLAG.
mov filehandler, ax ;IF NO ERROR, NO JUMP. SAVE FILEHANDLER.
;DISPLAY OK MESSAGE.
mov dx,offset okopen
mov ah,09h
int 021h
jmp endOfProc
; ---------------------------------------------------------------------
;DISPLAY ERROR MESSAGE.
failedOpening:
mov dx,offset FAILEDOPEN
mov ah,09h
int 021h
; mov ah,04ch ;<======== DON'T END THE PROGRAM
; int 021h ;<======== IN A PROCEDURE.
; ---------------------------------------------------------------------
endOfProc:
pop bx
pop ax
ret
openFile endp
不要忘记为现有文件更改变量“filename”('test.txt')的值。
答案 1 :(得分:-1)
两件事:
DOS字符串不是以零结尾,而是以'$'结尾。
编辑:我应该查看文档并看到DS:DX = pointer to an ASCIIZ file name
您的代码包含一些怪癖,例如,而不是:
mov al,0h
mov ah,03dh
为什么不写:
mov ax,0x3d00