Files
Operating-System/Experiment/asm-exp/实验八/实验八-3_文件读取.asm
2026-06-25 00:09:09 +08:00

98 lines
1.9 KiB
NASM

; 实验八-3: 文件读取程序
; 功能: 使用DOS功能号3FH读取文件内容
; 说明: 需要先打开文件,获取句柄后读取
DATAS SEGMENT
FILENAME DB 'testfile.txt', 0 ; 要读取的文件名
HANDLE DW ? ; 文件句柄
BUFFER DB 100 DUP(?) ; 读取缓冲区
ERR_MSG DB 'File open error!', 0DH, 0AH, '$'
READ_ERR_MSG DB 'File read error!', 0DH, 0AH, '$'
OK_MSG DB 'File read successfully!', 0DH, 0AH, '$'
CR_LF DB 0DH, 0AH, '$'
DATAS ENDS
STACKS SEGMENT
DB 64 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES, DS:DATAS, SS:STACKS
START:
MOV AX, DATAS
MOV DS, AX
; 打开文件 (功能号3DH)
; AH = 3DH (打开文件功能号)
; AL = 00H (只读模式)
; DS:DX = 文件名地址
LEA DX, FILENAME
MOV AH, 3DH
MOV AL, 00H
INT 21H
; 检查打开是否成功
JNC OPEN_SUCCESS
LEA DX, ERR_MSG
MOV AH, 09H
INT 21H
JMP PROGRAM_END
OPEN_SUCCESS:
MOV HANDLE, AX
; 读取文件内容 (功能号3FH)
; AH = 3FH (读取文件功能号)
; BX = 文件句柄
; CX = 读取字节数
; DS:DX = 缓冲区地址
MOV BX, HANDLE
LEA DX, BUFFER
MOV CX, 100 ; 最多读取100字节
MOV AH, 3FH
INT 21H
; 检查读取是否成功
JNC READ_SUCCESS
LEA DX, READ_ERR_MSG
MOV AH, 09H
INT 21H
JMP CLOSE_FILE
READ_SUCCESS:
; 显示读取到的数据
; AX中包含实际读取的字节数
MOV CX, AX ; CX = 实际读取的字节数
LEA DI, BUFFER
MOV AH, 02H ; DOS显示字符功能
DISPLAY_LOOP:
MOV DL, [DI]
INT 21H
INC DI
LOOP DISPLAY_LOOP
; 显示换行
LEA DX, CR_LF
MOV AH, 09H
INT 21H
LEA DX, OK_MSG
MOV AH, 09H
INT 21H
CLOSE_FILE:
; 关闭文件 (功能号3EH)
MOV BX, HANDLE
MOV AH, 3EH
INT 21H
PROGRAM_END:
MOV AH, 4CH
INT 21H
CODES ENDS
END START