Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在程序集x8086中打开文件的状态_Assembly_File Io_X86 16 - Fatal编程技术网

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文件名的指针
,是的,好的,这显然是我的错误。是的,这是路径问题。谢谢你的帮助。同时也感谢关于数据初始化和结束程序的提示。