; 实验八-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