以下是程序源码,需要在同级目录下建立一个test.txt文件,内容为hello Assembly!
assume cs:code,ds:data
eof=1ah ;文件结束符ASCII码值
data segment
fname db 'test.txt',0 ; 文件名
openok db 'Open successfully!',0 ; 打开成功
closeok db 'Close successfully!',0 ; 关闭成功
error1 db 'File not found!',0 ; 未找到文件
error2 db 'Reading error!',0 ; 读取失败
error3 db 'Closing failed!',0 ; 关闭失败
handle db ? ; 文件号
buffer db 20 dup(?) ; 1字节的缓冲区
data ends
code segment
start:
mov ax,data
mov ds,ax
mov dx,offset fname ;获取要打开文件的文件名
mov ax,3d00h ;只读方式打开
int 21h
;打开成功
jnc open_ok
;打开失败
mov si,offset error1
call showTips
jmp over
open_ok: ;打开成功
mov si,offset handle
mov ds:[si],al ;保存handle到ds数据区
cout:
call readch
jc readerr ;读取出错,则跳转
cmp al,eof ;读到文件结束符
jz closef ;是,跳转关闭文件
call putch ;显示字符
jmp cout
readerr:
mov si,offset error2
call showTips
closef: ;关闭成功
mov ax,3e00h
int 21h
jnc over
;关闭失败
mov si,offset error3
call showTips
mov ax,4c00h
int 21h
over:
mov ax,4c00h
int 21h
; 子程序:显示提示信息
; 入口参数:si=字符串首地址
showTips proc
dmess1:
mov dl,[si]
inc si ; 地址自增,向后偏移
or dl,dl
jz dmess2 ;为0结束子程序
mov ah,2h ;否则输出
int 21h
jmp dmess1
dmess2:
ret
showTips endp
;子程序:从文件中读取一个字符
;子程序名:readch
readch proc
mov cx,1 ;置读字节数
mov bl,handle ; 获取文件号
mov dx,offset buffer ;置读缓冲区地址
mov ah,3fh ;3F功能调用
int 21h
jc readch2 ;CF=1
cmp ax,cx ;判断文件是否结束,ax为实际读到的字节数
mov al,eof ;设文件已结束,置文件结束符,此时CF=0
jb readch1 ;文件已结束
mov al,buffer ;文件结束,取所读字符
readch1:
clc ;CF清零
readch2:
ret
readch endp
;子程序 ,屏幕显示al内容
;2号调用功能,向屏幕写入dl内容
putch proc
push dx
mov dl,al
mov ah,2
int 21h
pop dx
ret
putch endp
code ends
end start
在DOSBox下输出的结果
