如何从汇编中的文本文件中读取?

时间:2018-05-19 11:05:15

标签: assembly

我是装配新手。我正在尝试从文本文件中读取,这是我的代码:

_DATI SEGMENT PARA PUBLIC 'DATA' USE16

 Text_Buffer      dw ?
 filehandle       dw ?
 boolean          db 'boolean.txt',0
_DATI ENDS

_CODE SEGMENT PARA PUBLIC 'CODE' USE16
 ASSUME CS:_CODE, DS:_DATI, ES:_DATI

 ReadFile proc 
   mov ah, 3dh ;open the file
   mov al, 0 ;open for reading
   lea dx, file_name 
   int 21h 
   mov [filehandle], ax 

   mov ah, 3fh  
   lea dx, Text_Buffer
   mov cx, 1 ; Read 1 Byte
   mov bx, [filehandle] 
   int 21h

   mov bx, [filehandle]
   mov ah, 3eh ;close file
   int 21h
   ret
ReadFile endp
START:

call ReadFile

_end:

mov ax, 4c00h
int 21h

_CODE ENDS

END START

文件中的ASCII不应该保存在分配的缓冲区(Text_Buffer)中吗?

我现在得到的是保存的一些随机字节,由于某种原因,程序在我输入后结束。有人可以解释问题是什么以及如何解决? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我必须在以下几点修复你的代码:

 boolean        db 'boolean.txt',0

更改为(已定义file_name符号):

 file_name        db 'boolean.txt',0

" main"没有设置ds

...
START:
mov ax,SEG _DATI
mov ds,ax
call ReadFile
...

在此之后,我使用TASM(tasm so_readf.asm tlink /x so_readf.obj编译代码,警告丢失的堆栈报告和忽略,然后td so_readf.exe调试它),创建文件" BOOLEAN。 TXT"包含两个字节0x78 0x0A(字母" x"使用linux文本编辑器编辑换行符),并使用turbo调试器验证它是否有效(在dosbox模拟器下)。

"阅读"服务ds:0000内存视图显示78" x"而不是00字节值,正如预期的那样。

我打开文件时遇到问题,因为我在启动dosbox之后创建了它,因此dosbox不知道它的存在,并且在#34;打开文件"之后它确实报告了CF=1, ax=2。服务第一次。使用"重新扫描" dosbox命令下一个调试器运行按预期工作。但是这个问题只与我的测试环境(linux下的dosbox)有关,如果你使用的是不同的模拟器或实时DOS系统,你可能不会遇到这个问题。如果" boolean.txt"是在同一个模拟器/ dosbox内运行的其他代码的结果创建的,该文件应该是可见的。你可以在DOS命令行" type boolean.txt"查看它的当前内容并验证它的存在。

但正如预期的那样,你所发布的内容是正确的,只要所有先决条件都是,即你的ds有效,并且你在正确的工作目录中,并且你没有运行超出文件句柄(你关闭之前打开的所有文件吗?)等。同时在调试器下调试时,文件名错误的无效案例(错误ds)和dosbox不知道文件,在"打开文件"之后正确结束CF = 1,所以我可以提前终止调试器中的代码(因为没有错误处理代码,所以之后会做错误的事情)。

再次尝试在调试器中确定哪些内容无法正常工作,以及每个int 21h的所有返回值,例如" read" ones返回ax中读取的字节数,如果成功则应为1。