档案只能读入到缓冲区,然后再到该地址存取.
假若档案名称:HANOI.TXT,内容第1行是数目N,第2~4是名称,如下.
12
M
N
E
HANOI.TXT自行建立,必须以ANSI编码存档
程式可以这样修改...
1.
datarea ends
之上加4行
constant dw 10000,1000,100,10,1
FileName db 'hanoi.txt',0 ;档名
UserNumber dw 0 ;数目
UserName db 0,0,0 ;名称
Buffer db 20 dup (?) ;读入缓冲
datarea ends
2.
整个main替换成这个
程序代码:
;***************************************************************
main proc far
assume cs:prognam,ds:datarea
start:
;set DS register to current data segment
mov ax,datarea
mov ds,ax
mov es,ax
;MAIN PART OF PROGRAM GOES HERE
;
mov ax,3d00h ;开档只读(read only)
mov dx,offset FileName ;档名
int 21h ;调用DOS
jc exit ;开启错误则离开
mov bx,ax ;取Handle
mov ah,3fh ;读档
mov cx,20 ;长度
mov dx,offset Buffer ;读入地址
int 21h ;调用dos
jc exit ;读取错误则离开
cld ;正向
mov di,offset Buffer ;读入缓冲
mov ax,[di] ;取第一个word
cmp ah,0dh ;是否换行符
jnz @f ;不是
mov ah,'0' ;取代换行符
jmp short next ;跳
@@: xchg ah,al ;若第1行是'12',读入ax后,al=32H,ah=31H,须交换
next: sub ax,3030h ;若'12',读入交换后AX=3132H,减后AX=0102,此即BCD码
aad ;BCD调整,若AX=0102,AAD后,AX=000C
mov UserNumber,ax ;保存
mov bx,0 ;初始化
mov cx,20 ;长度
mov al,0Ah ;换行符
@@:
repnz scasb ;扫瞄ES:DI数组CX次,有否AL,若有AL或CX=0则停
mov ah,[di] ;取换行符后的名称
mov UserName[bx],ah ;存入名称
inc bx ;下一个
cmp bx,3 ;是否3个
jb @b ;未完
xor ax,ax ;AX=0
xor cx,cx ;CX=0
mov cl,UserName ;取第1名称
mov al,UserName+1 ;取第2名称
mov si,ax ;存
mov al,UserName+2 ;取第3名称
mov di,ax ;存
mov bx,UserNumber ;取数目
;
call hanoi ;call HANOI( N,X,Y,Z )
exit:
mov ah,4ch
int 21h
main endp
;***************************************************************
其它不必改.....
[此贴子已经被作者于2022-11-23 18:45编辑过]