Assembly 在程序集x8086中打开文件的状态
我正试图在汇编程序中打开一个文件。代码如下:Assembly 在程序集x8086中打开文件的状态,assembly,file-io,x86-16,Assembly,File Io,X86 16,我正试图在汇编程序中打开一个文件。代码如下: 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
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 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
CL在调用openFile过程之前设置。根据该参数,过程跳转到相应的代码块并执行它(如您所见,我只有一个跳转)DX也是预先设置的,是包含文件名的“字符串”的偏移量,以“0”结尾,例如:“test.txt”,0
现在,问题是:
我想知道文件打开是否成功结束。我读到,如果设置了CF,则表示存在一些问题。然而,无论文件是否真的存在,程序总是跳转到失败打开。两件事:
DOS字符串不是以零结尾,而是以“$”结尾
编辑:我应该看一下文档,看到DS:DX=指向ASCIIZ文件名的指针
您的代码包含一些怪癖,例如,而不是:
mov al,0h
mov ah,03dh
为什么不写:
mov ax,0x3d00
我对您的代码做了一些小改动,使其与EMU8086配合使用,如下(注意添加的注释)。您知道,可能问题在于您的程序找不到文件,例如,使用编译器EMU8086,文件通常必须位于“path\EMU8086\MyBuild”中,即使您向文件添加完整路径以打开它,有时除非您将其存储在“MyBuild”中,否则EMU8086不允许您找到它。也许这就是你的情况(这件事发生在我身上)
.stack 100h
.数据
文件名db'test.txt',0
文件处理程序dw?
ok打开数据库“打开ok$”
failedopen数据库“错误打开$”
.代码
;初始化数据段。
mov-ax,@data
mov-ds,ax
;数据段必须从一开始就已初始化,或
;下一个“偏移文件名”将不起作用。
mov-dx,偏移文件名
调用openFile
;等钥匙。
mov啊,7
int 21h
;完成程序
mov啊,4ch
int 21h
;---------------------------------------------------------------------
openFile程序
推斧
推bx
; mov ax、seg数据;如果进位标志设置为指令:“jc failedOpening”。@DirkWolfgangGlomp,则最好使用跳转。虽然这确实更可读,但jb
指令与jc
相同。在进程中设置DS
非常可疑。确保设置为文件名的DX
来自同一段。另外,检查AX
中返回的错误代码。不,int21/3d
需要以零结尾的字符串。指向ASCIIZ文件名的指针
,是的,好的,这显然是我的错误。是的,这是路径问题。谢谢你的帮助。同时也感谢关于数据初始化和结束程序的提示。