程序集 x8086 中的文件打开状态

Status of file opening in Assembly x8086

我正在尝试在我的汇编程序中打开一个文件。这是代码:

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也是预先设置好的,是一个"string"包含文件名的偏移量,以“0”结尾,例如:"test.txt",0.

现在,问题:

我想知道文件打开是否成功结束。我读过,如果设置了 CF,则意味着存在一些问题。然而,程序总是跳转到 failedOpening,无论文件是否真的存在。

两件事:

DOS 字符串不是以零结尾而是以“$”结尾。

编辑:我应该查看文档并看到 DS:DX = pointer to an ASCIIZ file name

您的代码包含一些怪癖,例如代替:

mov al,0h
mov ah,03dh

为什么不写:

mov ax,0x3d00

我对您的代码做了一些小改动,使其可以与 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') 的值。