📄 fileio.asm
字号:
; FILEIO
;
; This program copies the input file to the output file and adds line
; numbers while it is copying the file.
include stdlib.a
includelib stdlib.lib
dseg segment para public 'data'
ArgCnt word 0
LineNumber word 0
DOSErrorCode word 0
InFile dword ? ;Ptr to Input file name.
OutFile dword ? ;Ptr to Output file name.
InputLine byte 1024 dup (0) ;Input/Output data buffer.
OutputFile FileVar {}
InputFile FileVar {}
dseg ends
cseg segment para public 'code'
assume cs:cseg, ds:dseg
; ReadLn- Reads a line of text from the input file and stores the
; data into the InputLine buffer:
ReadLn proc
push ds
push es
push di
push si
push ax
mov si, dseg
mov ds, si
mov si, offset InputLine
lesi InputFile
GetLnLp:
fgetc
jc RdLnDone ;If some bizzarre error.
cmp ah, 0 ;Check for EOF.
je RdLnDone ;Note:carry is set.
mov ds:[si], al
inc si
cmp al, lf ;At EOLN?
jne GetLnLp
dec si ;Back up before LF.
cmp byte ptr ds:[si-1], cr ;CR before LF?
jne RdLnDone
dec si ;If so, skip it too.
RdLnDone: mov byte ptr ds:[si], 0 ;Zero terminate.
pop ax
pop si
pop di
pop es
pop ds
ret
ReadLn endp
; MyOutput- Writes the single character in AL to the output file.
MyOutput proc far
push es
push di
lesi OutputFile
fputc
pop di
pop es
ret
MyOutput endp
; The main program which does all the work:
Main proc
mov ax, dseg
mov ds, ax
mov es, ax
; Must call the memory manager initialization routine if you use
; any routine which calls malloc! ARGV is a good example of a
; routine calls malloc.
meminit
; We expect this program to be called as follows:
; fileio file1, file2
; anything else is an error.
argc
cmp cx, 2 ;Must have two parameters.
je Got2Parms
BadParms: print
byte "Usage: FILEIO infile, outfile",cr,lf,0
jmp Quit
; Okay, we've got two parameters, hopefully they're valid filenames.
; Get copies of the filenames and store away the pointers to them.
Got2Parms: mov ax, 1 ;Get the input filename
argv
mov word ptr InFile, di
mov word ptr InFile+2, es
mov ax, 2 ;Get the output filename
argv
mov word ptr OutFile, di
mov word ptr OutFile+2, es
; Output the filenames to the standard output device
printf
byte "Input file: %^s\n"
byte "Output file: %^s\n",0
dword InFile, OutFile
; Open the input file:
lesi InputFile
mov dx, word ptr InFile+2
mov si, word ptr InFile
mov ax, 0
fopen
jnc GoodOpen
mov DOSErrorCode, ax
printf
byte "Could not open input file, DOS: %d\n",0
dword DOSErrorCode
jmp Quit
; Create a new file for output:
GoodOpen: lesi OutputFile
mov dx, word ptr OutFile+2
mov si, word ptr OutFile
fcreate
jnc GoodCreate
mov DOSErrorCode, AX
printf
byte "Could not open output file, DOS: %d\n",0
dword DOSErrorCode
jmp Quit
; Okay, save the output hook and redirect the output.
GoodCreate: PushOutAdrs
lesi MyOutput
SetOutAdrs
WhlNotEOF: inc LineNumber
; Okay, read the input line from the user:
call ReadLn
jc BadInput
; Okay, redirect the output to our output file and write the last line
; read prefixed with a line number:
printf
byte "%4d: %s\n",0
dword LineNumber, InputLine
jmp WhlNotEOF
BadInput: push ax ;Save error code.
PopOutAdrs ;Restore output hook.
pop ax ;Retrieve error code.
test ax, ax ;EOF error? (AX = 0)
jz CloseFiles
mov DOSErrorCode, ax
printf
byte "Input error, DOS: %d\n",0
dword LineNumber
; Okay, close the files and quit:
CloseFiles: lesi OutputFile
fclose
lesi InputFile
fclose
Quit: ExitPgm ;DOS macro to quit program.
Main endp
cseg ends
sseg segment para stack 'stack'
stk db 1024 dup ("stack ")
sseg ends
;zzzzzzseg is required by the standard library routines.
zzzzzzseg segment para public 'zzzzzz'
LastBytes db 16 dup (?)
zzzzzzseg ends
end Main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -