ASM:从文件DTA获取数据

时间:2015-11-04 11:18:58

标签: assembly

这必须打印找到的文件名,但它会打印出一些不太可能的符号。有什么帮助吗?

mov dx,offset DTA
mov ah,1Ah
int 21h

mov dx, offset comex
xor cx, cx
mov ah,4Eh
int 21h
jc  exit

mov ah,40h 
mov bx, dst_fh 
mov cx,13
lea dx, DTA+30d 
int 21h 

2 个答案:

答案 0 :(得分:1)

当DOS填充文件名/扩展名的13字节长DTA字段时,它以紧凑的方式完成。这意味着如果文件名及其扩展名不使用完整空间,则最终会在终止零后面显示一些垃圾字节。这些是你观察到的怪异角色!看看这些例子( @ 代表终止零):

in DTA            filespec
-------------     ------------
DOCUMENT.TXT@     DOCUMENT.TXT
SHORT.DOC@à&é     SHORT.DOC
F@&é"'(§è!çà)     F

解决方案是实际找到终止零点的位置并相应地设置CX。

lea dx, DTA+30
xor bx, bx
L1:
inc bx               ;There's always at least 1 character
cmp [DTA+30+bx],bh   ;BH=0
jne L1
mov cx, bx
mov bx, dst_fh
mov ah, 40h
int 21h

使用此代码,您只会发送实际文件名+点+扩展名。

答案 1 :(得分:0)

也许您正在使用具有长名称支持的文件系统,在这种情况下,此DOS函数返回的命名将转换为旧的8.3格式。 使用“dir / x”命令查看显示的文件名与您的代码相同。 ps:这个函数返回13个字节固定大小的文件名,前8个字符的名称和最后3个字符的扩展名,如果你的文件名少了8个字符,将放置空格填充前8个字符。