我是装配新手。我正在尝试从文本文件中读取,这是我的代码:
_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)中吗?
我现在得到的是保存的一些随机字节,由于某种原因,程序在我输入后结束。有人可以解释问题是什么以及如何解决? 提前谢谢。
答案 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。