16位汇编对磁盘文件管理——保存内容到文件

260 阅读2分钟

以下是16位汇编源码,功能是创建一个文件,并且保存我们输入的数据到文件中,以ctrl+Z结束输入

assume cs:code,ds:data

eof=1Ah
data segment
    fname db 'test1.txt',0
    errmsg1 db 'Can not create file!',07h,0
    errmsg2 db 'Write error!',07h,0
    buffer db ?	;一个字节缓冲区
data ends

code segment
    start:
        mov ax,data
        mov ds,ax

        mov ax,3c00h ;创建文件
        mov dx,offset fname ;获取文件名
        mov cx,0
        int 21h

        jc ferr1 ;创建失败
        mov bx,ax ;保存文件句柄

    next:
        call getchar ;接收按键字符
        push ax ;因为getchar的出口为ax,所以要保护起来,放到堆栈
        call writechar ;按键字符写入文件
        jc write_err ;调用写入文件子程序
        pop ax ;堆栈平衡
        cmp al,eof ;判断文件是否到了结尾
        jz close
        jmp next

    write_err: ;写入错误时,提示
        mov dx,offset errmsg2
        call dmess
        jmp close

    close: ;关闭文件
        mov ax,3e00h
        int 21h
        jmp over

    ferr1: ;创建失败时提示
        mov dx,offset errmsg1
        call dmess
        jmp over

    over: ;结束程序
        mov ax,4c00h
        int 21h
    
    ;子程序:向文件写入字符
    ;子程序名:writech
    ;入口参数al,读到的字符ASCII码
    ;调用40h功能号,写入文件
    writechar proc
        mov buffer,al	;al移入缓冲区
        mov dx,offset buffer	;缓冲区首地址
        mov cx,1		;每次写入一个字节
        mov ah,40h	;置功能号
        int 21h		;写
        ret
    writechar endp

    ;子程序:接收按键字符
    ;子程序名:getchar
    ;调用1号功能
    ;入口参数无
    ;出口参数:AL=读到字符的代码ASCII码
    getchar proc
        mov ah,1
        int 21h
        ret
    getchar endp

    ;子程序显示一个以0结尾的字符串
    ;子程序名:dmess
    ;入口参数si=字符串首地址
    ;出口参数无
    dmess proc
        dmess1:
            mov dl,[si]
            inc si
            or dl,dl
            jz dmess2
            mov ah,2
            int 21h
            jmp dmess1
        dmess2:
            ret
    dmess endp

code ends
    end start

image.png