📄 ex13_1b.asm
字号:
; EX13_1b.asm
;
; This program copies one file to another using blocked I/O.
; Run this program and time its execution. Compare the execution time of
; this program against that of the character at a time I/O and the
; Standard Library File I/O example (ex13_1a and ex13_1c).
include stdlib.a
includelib stdlib.lib
dseg segment para public 'data'
; File handles for the files we will open.
FHndl word ? ;Input file handle
FHndl2 word ? ;Output file handle
Buffer byte 256 dup (?) ;File buffer area
FName equ this word ;Ptr to current file name
FNamePtr dword FileName
Filename byte "Ex13_1.in",0 ;Input file name
Filename2 byte "Ex13_1.out",0 ;Output file name
dseg ends
cseg segment para public 'code'
assume cs:cseg, ds:dseg
Main proc
mov ax, dseg
mov ds, ax
mov es, ax
meminit
mov ah, 3dh ;Open the input file
mov al, 0 ; for reading
lea dx, Filename ;Presume DS points at filename
int 21h ; segment
jc BadOpen
mov FHndl, ax ;Save file handle
mov FName, offset Filename2 ;Set this up in case there
mov FName+2, seg FileName2 ; is an error during open.
mov ah, 3ch ;Open the output file for writing
mov cx, 0 ; with normal file attributes
lea dx, Filename2 ;Presume DS points at filename
int 21h ; segment
jc BadOpen
mov FHndl2, ax ;Save file handle
; The following loop reads 256 bytes at a time from the file and then
; writes those 256 bytes to the output file.
LP: mov ah,3fh ;Read data from the file
lea dx, Buffer ;Address of data buffer
mov cx, 256 ;Read 256 bytes
mov bx, FHndl ;Get file handle value
int 21h
jc ReadError
cmp ax, cx ;EOF reached?
jne EOF
mov ah, 40h ;Write data to file
lea dx, Buffer ;Address of output buffer
mov cx, 256 ;Write 256 bytes
mov bx, FHndl2 ;Output handle
int 21h
jc WriteError
jmp LP ;Read next block
; Note, just because the number of bytes read does not equal 256,
; don't get the idea we're through, there could be up to 255 bytes
; in the buffer still waiting to be processed.
EOF: mov cx, ax ;Put # of bytes to write in CX.
jcxz EOF2 ;If CX is zero, we're really done.
mov ah, 40h ;Write data to file
lea dx, Buffer ;Address of output buffer
mov bx, FHndl2 ;Output handle
int 21h
jc WriteError
EOF2: mov bx, FHndl
mov ah, 3eh ;Close file
int 21h
jmp Quit
ReadError: printf
byte "Error while reading data from file '%s'.",cr,lf,0
dword FileName
jmp Quit
WriteError: printf
byte "Error while writing data to file '%s'.",cr,lf,0
dword FileName2
jmp Quit
BadOpen: printf
byte "Could not open '%^s'. Make sure this file is in the ",cr,lf
byte "current directory before attempting to run this program again."
byte cr,lf,0
dword FName
Quit: ExitPgm ;DOS macro to quit program.
Main endp
cseg ends
sseg segment para stack 'stack'
stk db 1024 dup ("stack ")
sseg ends
zzzzzzseg segment para public 'zzzzzz'
LastBytes db 16 dup (?)
zzzzzzseg ends
end Main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -