98 lines
1.9 KiB
NASM
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 |