程序集x8086

时间:2015-04-22 10:45:55

标签: 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
    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

2 个答案:

答案 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