16位汇编对磁盘文件管理——输出文件内容

264 阅读2分钟

以下是程序源码,需要在同级目录下建立一个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下输出的结果

image.png