220 likes | 242 Views
MS DOS File IO. Text chapter 13. DateTime. C:MASM615>make16 datetime Assembling: datetime.asm Volume in drive C has no label. Volume Serial Number is 07D2-0208 Directory of C:masm615 12/08/2001 11:40 PM 1,514 DateTime.asm
E N D
MS DOS File IO Text chapter 13
DateTime C:\MASM615>make16 datetime Assembling: datetime.asm Volume in drive C has no label. Volume Serial Number is 07D2-0208 Directory of C:\masm615 12/08/2001 11:40 PM 1,514 DateTime.asm 11/13/2006 01:38 PM 3,018 datetime.obj 11/13/2006 01:38 PM 10,196 datetime.lst 11/13/2006 01:38 PM 7,652 datetime.exe 4 File(s) 22,380 bytes 0 Dir(s) 4,235,657,216 bytes free Press any key to continue . . . C:\MASM615>datetime Date: 11-13-2006, Time: 13:38:55 C:\MASM615>
DateTime Display the date: mov dx,OFFSET str1 call WriteString mov ah,2Ah ; get system date int 21h movzx eax,dh ; month call WriteDec INVOKE Write,'-' movzx eax,dl ; day call WriteDec INVOKE Write,'-' movzx eax,cx ; year call WriteDec ; Display the time: mov dx,OFFSET str2 call WriteString mov ah,2Ch ; get system time int 21h movzx eax,ch ; hours call WritePaddedDec INVOKE Write,':' movzx eax,cl ; minutes call WritePaddedDec INVOKE Write,':' movzx eax,dh ; seconds call WritePaddedDec call Crlf
DateTime Write PROC char:BYTE ; Display a single character. ;--------------------------------------------- push eax push edx mov ah,2 mov dl,char int 21h pop edx pop eax ret Write ENDP ;--------------------------------------------- WritePaddedDec PROC ; Display unsigned integer in EAX, padding ; to two digit positions with a leading zero. ;--------------------------------------------- .IF eax < 10 push eax push edx mov ah,2 mov dl,'0' int 21h pop edx pop eax .ENDIF call WriteDec ret WritePaddedDec ENDP
Buffered Keyboard Input (Keybd.asm)Test function 3Fh, read from file or devicewith the keyboard. Flush the buffer INCLUDE Irvine16.inc .data firstName BYTE 15 DUP(?),0 lastName BYTE 30 DUP(?),0 .code main PROC mov ax,@data mov ds,ax ; Input the first name: mov ah,3Fh mov bx,0 ; keyboard mov cx,LENGTHOF firstName mov dx,OFFSET firstName int 21h ; Disable the following line to see what happens ; when the buffer is not flushed: call FlushBuffer
Buffered Keyboard Input (Keybd.asm) ; Input the last name: mov ah,3Fh mov bx,0 ; keyboard mov cx,LENGTHOF lastName mov dx,OFFSET lastName int 21h quit: call Crlf exit main ENDP ;------------------------------------------ FlushBuffer PROC ; Flush the standard input buffer. ; Receives: nothing. Returns: nothing ;----------------------------------------- .data oneByte BYTE ? .code pusha L1: mov ah,3Fh ; read file/device mov bx,0 ; keyboard handle mov cx,1 ; one byte mov dx,OFFSET oneByte ; save it here int 21h ; call MS-DOS cmp oneByte,0Ah ; end of line yet? jne L1 ; no: read another popa ret FlushBuffer ENDP END main
Readfile (run… displays file) C:\MASM615\EXAMPLES\CH13>readfile TITLE Read a text file (Readfile.asm) ; Last update: 9/11/01 INCLUDE Irvine16.inc .data BufSize = 5000 fileName BYTE "myfile.txt",0 inHandle WORD ? buffer BYTE BufSize DUP(?) bytesRead WORD ? .code main PROC mov ax,@data mov ds,ax
Readfile .data BufSize = 5000 infile BYTE "my_text_file.txt",0 outfile BYTE "my_output_file.txt",0 inHandle WORD ? outHandle WORD ? buffer BYTE BufSize DUP(?) bytesRead WORD ? .code main PROC mov ax,@data mov ds,ax ; Open the input file mov ax,716Ch ; extended create or open mov bx,0 ; mode = read-only mov cx,0 ; normal attribute mov dx,1 ; action: open mov si,OFFSET infile int 21h ; call MS-DOS jc quit ; quit if error mov inHandle,ax
readfile ; Read the input file mov ah,3Fh ; read file or device mov bx,inHandle ; file handle mov cx,BufSize ; max bytes to read mov dx,OFFSET buffer ; buffer pointer int 21h jc quit ; quit if error mov bytesRead,ax ; Display the buffer mov ah,40h ; write file or device mov bx,1 ; console output handle mov cx,bytesRead ; number of bytes mov dx,OFFSET buffer ; buffer pointer int 21h jc quit ; quit if error ; Close the file mov ah,3Eh ; function: close file mov bx,inHandle ; input file handle int 21h ; call MS-DOS jc quit ; quit if error
Readfile ; Create the output file mov ax,716Ch ; extended create or open mov bx,1 ; mode = write-only mov cx,0 ; normal attribute mov dx,12h ; action: create/truncate mov si,OFFSET outfile int 21h ; call MS-DOS jc quit ; quit if error mov outHandle,ax ; save handle ; Write buffer to new file mov ah,40h ; write file or device mov bx,outHandle ; output file handle mov cx,bytesRead ; number of bytes mov dx,OFFSET buffer ; buffer pointer int 21h jc quit ; quit if error ; Close the file mov ah,3Eh ; function: close file mov bx,outHandle ; output file handle int 21h ; call MS-DOS
Extended Open/Create (Fileio.asm)excerpts in text .data Date WORD ? handle WORD ? actionTaken WORD ? FileName BYTE "long_filename.txt",0 NewFile BYTE "newfile.txt",0 .code main PROC mov ax,@data mov ds,ax ;Create new file, fail if it already exists: mov ax,716Ch ; Extended Open/Create mov bx,2 ; read-write mov cx,0 ; normal attribute mov dx,10h ; action: create mov si,OFFSET NewFile int 21h jc failed mov handle,ax ; file handle mov actionTaken,cx ; action taken to open file
Fileio.asm ;Open existing file mov ax,716Ch ; Extended Open/Create mov bx,0 ; read-only mov cx,0 ; normal attribute mov dx,1 ; open existing file mov si,OFFSET Filename int 21h jc failed mov handle,ax ; file handle mov actionTaken,cx ; action taken to open file ;Create new file or truncate existing file: mov ax,716Ch ; Extended Open/Create mov bx,2 ; read-write mov cx,0 ; normal attribute mov dx,10h + 02h ; action: create + truncate mov si,OFFSET NewFile int 21h jc failed mov handle,ax ; file handle mov actionTaken,cx ; action taken to open file failed: exit main ENDP
Readfile.asm: Read, display, and copy a text file (containing asm prog) C:\MASM615>make16 readfile Assembling: readfile.asm Volume in drive C has no label. Volume Serial Number is 07D2-0208 Directory of C:\masm615 12/09/2001 10:47 AM 1,928 Readfile.asm 11/13/2006 01:34 PM 2,968 readfile.obj 11/13/2006 01:34 PM 10,906 readfile.lst 11/13/2006 01:34 PM 12,596 readfile.exe 4 File(s) 28,398 bytes 0 Dir(s) 4,239,589,376 bytes free Press any key to continue . . . C:\MASM615>readfile TITLE Read a text file (Readfile.asm) ; Last update: 9/11/01 INCLUDE Irvine16.inc .data BufSize = 5000 fileName BYTE "myfile.txt",0 inHandle WORD ? buffer BYTE BufSize DUP(?) bytesRead WORD ? .code main PROC mov ax,@data mov ds,ax
data INCLUDE Irvine16.inc .data BufSize = 5000 infile BYTE "my_text_file.txt",0 outfile BYTE "my_output_file.txt",0 inHandle WORD ? outHandle WORD ? buffer BYTE BufSize DUP(?) bytesRead WORD ?
Some of code segment Open the input file mov ax,716Ch ; extended create or open mov bx,0 ; mode = read-only mov cx,0 ; normal attribute mov dx,1 ; action: open mov si,OFFSET infile int 21h ; call MS-DOS jc quit ; quit if error mov inHandle,ax ; Read the input file mov ah,3Fh ; read file or device mov bx,inHandle ; file handle mov cx,BufSize ; max bytes to read mov dx,OFFSET buffer ; buffer pointer int 21h jc quit ; quit if error mov bytesRead,ax ; Display the buffer mov ah,40h ; write file or device mov bx,1 ; console output handle mov cx,bytesRead ; number of bytes mov dx,OFFSET buffer ; buffer pointer int 21h jc quit ; quit if error
Some of code segment ; Close the file mov ah,3Eh ; function: close file mov bx,inHandle ; input file handle int 21h ; call MS-DOS jc quit ; quit if error ; Create the output file mov ax,716Ch ; extended create or open mov bx,1 ; mode = write-only mov cx,0 ; normal attribute mov dx,12h ; action: create/truncate mov si,OFFSET outfile int 21h ; call MS-DOS jc quit ; quit if error mov outHandle,ax ; save handle ; Write buffer to new file mov ah,40h ; write file or device mov bx,outHandle ; output file handle mov cx,bytesRead ; number of bytes mov dx,OFFSET buffer ; buffer pointer int 21h jc quit ; quit if error ; Close the file mov ah,3Eh ; function: close file mov bx,outHandle ; output file handle int 21h ; call MS-DOS
BinFile: Create a binary file containing an arrayof doublewords C:\MASM615>binfile 000009E2, 000003F6, 00000E87, 00000471, 000001DF, 00000C10, 0000060A, 00000E78, 00000219, 00000072, 000009B4, 00000109, 000001B4, 00000BB0, 000009C9, 00000B59, 00000315, 0000069E, 00000BCE, 00000CDB, 000007DF, 00000C51, 00000E86, 00000944, 000004F6, 00000E1C, 00000DF5, 00000C86, 0000067E, 00000793, 0000075F, 00000ED7, 000003DB, 0000028B, 00000D49, 000008AA, 000003B2, 00000B16, 00000B76, 000006B4, 00000FE6, 0000038A, 00000AEA, 00000DE7, 0000099B, 0000087A, 000005E9, 00000F79, 00000D36, 000004BB, Press any key to continue... 000009E2, 000003F6, 00000E87, 00000471, 000001DF, 00000C10, 0000060A, 00000E78, 00000219, 00000072, 000009B4, 00000109, 000001B4, 00000BB0, 000009C9, 00000B59, 00000315, 0000069E, 00000BCE, 00000CDB, 000007DF, 00000C51, 00000E86, 00000944, 000004F6, 00000E1C, 00000DF5, 00000C86, 0000067E, 00000793, 0000075F, 00000ED7, 000003DB, 0000028B, 00000D49, 000008AA, 000003B2, 00000B16, 00000B76, 000006B4, 00000FE6, 0000038A, 00000AEA, 00000DE7, 0000099B, 0000087A, 000005E9, 00000F79, 00000D36, 000004BB,
binfile .data myArray DWORD 50 DUP(?) fileName BYTE "binary array file.bin",0 fileHandle WORD ? commaStr BYTE ", ",0 ; Set CreateFile to zero if you just want to ; read and display the existing binary file. CreateFile = 1
.IF CreateFile EQ 1 • call FillTheArray • call DisplayTheArray • call CreateTheFile • call WaitMsg • call Crlf • .ENDIF • call ReadTheFile • call DisplayTheArray • quit: • call Crlf • exit • main ENDP
binfile ;------------------------------------------------------ ReadTheFile PROC ; ; Open and read the binary file. ; Receives: nothing. Returns: nothing ;------------------------------------------------------ mov ax,716Ch ; extended file open mov bx,0 ; mode: read-only mov cx,0 ; attribute: normal mov dx,1 ; open existing file mov si,OFFSET fileName ; filename int 21h ; call MS-DOS jc quit ; quit if error mov fileHandle,ax ; save handle ; Read the input file, then close the file. mov ah,3Fh ; read file mov bx,fileHandle ; file handle mov cx,SIZEOF myArray ; max bytes to read mov dx,OFFSET myArray ; buffer pointer int 21h jc quit ; quit if error mov ah,3Eh ; function: close file mov bx,fileHandle ; output file handle int 21h ; call MS-DOS quit: ret ReadTheFile ENDP
binfile ;------------------------------------------------------ DisplayTheArray PROC ; ; Display the array ; Receives: nothing. Returns: nothing ;------------------------------------------------------ mov CX,LENGTHOF myArray mov si,0 L1: mov eax,myArray[si] ; get a number call WriteHex ; display the number mov edx,OFFSET commaStr ; display a comma call WriteString add si,TYPE myArray ; next array position loop L1 ret DisplayTheArray ENDP ;------------------------------------------------------ FillTheArray PROC ; Fill the array with random integers. ; Receives: nothing. Returns: nothing ;------------------------------------------------------ mov CX,LENGTHOF myArray mov si,0 L1: mov eax,1000h ; generate random integers call RandomRange ; between 0 - 999 in EAX mov myArray[si],eax ; store in the array add si,TYPE myArray ; next array position loop L1 ret FillTheArray ENDP
binfile ;------------------------------------------------------ CreateTheFile PROC ; ; Create a file containing binary data ; Receives: nothing. Returns: nothing ;------------------------------------------------------ mov ax,716Ch ; create file mov bx,1 ; mode: write only mov cx,0 ; normal file mov dx,12h ; action: create/truncate mov si,OFFSET fileName ; filename int 21h ; call MS-DOS jc quit ; quit if error mov fileHandle,ax ; save handle ; Write integer array to the file. mov ah,40h ; write file or device mov bx,fileHandle ; output file handle mov cx,SIZEOF myArray ; number of bytes mov dx,OFFSET myArray ; buffer pointer int 21h jc quit ; quit if error ; Close the file. mov ah,3Eh ; function: close file mov bx,fileHandle ; output file handle int 21h ; call MS-DOS quit: ret CreateTheFile ENDP