【问题标题】:[Emu 8086]Can't open file[Emu 8086]无法打开文件
【发布时间】:2014-01-18 19:47:00
【问题描述】:

程序应该打开文件,从中读取并打印前 4 个字符。

  • 我不知道问题出在哪里。我什至自己在那里创建了文件,但它仍然无法打开文件。

    org 100h
    jmp start  
    filename db "C:\f1.txt",0
    errormessage: db "Ndodhi nje gabim gjate ekzekutimit$"  
    Buffer db 50h dup(?)
    start:   
      lea dx,filename
      mov ah,3Dh
      mov al,0
      int 21h
      jc error  
      mov bx,ax         
      mov ah,3Fh
      mov cx,4
      lea dx,Buffer
      int 21h
      jmp end
    error:mov dx,offset errormessage
      mov ah,09h
      int 21h
    end: ret
    

【问题讨论】:

  • 仔细阅读过 int 21h 的 ah=3dh 函数的文档吗?提示:al 里有什么?
  • 我看了文档,好像al需要访问模式。我加了mov al,0还是不行。还有其他建议吗?
  • 检查 ax 中返回的错误代码!
  • 在将 3Fh 移动到 ah 之前将 ax 移动到 bx(文件句柄)!
  • @FrankKotler 是的,我错过了那个。但是,即使读取失败,也不会输出错误消息。该文件也永远不会关闭(如果有记忆,ah = 3eh)。这里不是绝对必要的,只是为了形式好。

标签: assembly emulation x86-16


【解决方案1】:

您正在使用模拟器。您的程序可以访问模拟的 C: 驱动器,这不是您 PC 的真实 C: 驱动器。

正如http://www.emu8086.com/ 所说:

dos 文件系统在\vdrive\ 文件夹中模拟

换句话说,将文件f1.txt放入文件夹c:\emu8086\vdrive\c;您的程序将看到文件显示C:\

如果您将emu8086 安装在c:\emu8086 以外的文件夹中,那么显然您将不得不在那里寻找vdrive

【讨论】:

    【解决方案2】:

    您应该将您的数据(所有db 的东西)放在.data 指令下,并将代码放在.code 下。在老式的.com 文件中,没关系,但是在.exe 中,数据段(ds)和代码段(cs)是不同的,你应该告诉汇编程序什么属于哪里。

    解释:DOS 函数期望文件名位于地址 ds:dx,但很可能那里没有任何内容(可能只有 NUL 字符,被解释为空字符串),因为文件名位于地址 cs:dx .

    【讨论】:

    • 我试过了,照你说的做了,还是说打不开文件
    【解决方案3】:

    如果错误信息打印正确,则可以确定 DS 段寄存器设置正确,并且问题必须在第一个“int 21h”之前。

    您应该使用十六进制编辑器打开文件并检查字符串“c:\f1.txt”是否真的存在。一些汇编程序处理 C 等字符串中的反斜杠,因此您必须编写两个反斜杠(“c:\\f1.txt”)才能在 .COM 文件中获得一个反斜杠。

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多