Chapter 14

advertisement
MSDOS 16-bit programming
Old chpt 13
Current chapt 14
interrupts
• You can customize interrupt handling for
DOS and BIOS by installing you own
handlers
• The hardware was designed with this
possibility of tinkering, or customizing.
• You can replace any service routine with
your own.
The vector table: pg 598
• The vector table is in the first K of RAM,
locations 0:0 to 0:03FF
• The entries in the table, called “interrupt
vectors” are 32 bit seg:ofs values that
point to existing service routines.
• The specific values vary from one
computer to another due to different BIOS
or DOS versions
The vector table
• The interrupt vectors correspond to
interrupt numbers
• The address of int 0 handler (div by 0) is
02C1:5186h.
• The offset for a vector can be found by
multiplying the interrupt number by 4 (shl
2)
interrupts
• You can execute an interrupt by
performing an
int XXX
• This is called a software interrupt
• A hardware interrupt may also call the
handler (timer, ports, keyboard and so on
all send signals to the PIC).
interrupts
• A hardware interrupt is generated by the Intel
8259 PIC which signals the cpu to suspend
execution of the current program and execute an
interrupt service handler.
• Note that the current program stack is used to
save the return address.
• The instructions CLI clear interrupt flag (disable)
and STI (enable) set interrupt flag enable a
program to temporarily disable/re-enable
interrupts if sensitive operations are underway,
like changing the value of a segment register.
DOS ints
• Text describes a few DOS interrupts
• I have a bunch of DOS and ROM-BIOS
referenced here
helloworld
TITLE Hello World Program
(Hello.asm)
; This program displays "Hello, world!"
.model small
.stack 100h
.386
.data
message BYTE "Hello, world!",0dh,0ah
.code
main PROC
mov ax,@data
mov ds,ax
mov ah,40h
; write to file/device
mov bx,1
; output handle
mov cx,SIZEOF message
; number of bytes
mov dx,OFFSET message
; addr of buffer
int 21h
.exit
main ENDP
END main
hello.asm
• C:\MASM615\EXAMPLES\CH13>hello
• Hello, world!
• C:\MASM615\EXAMPLES\CH13>
Hello v2 uses startup to initialize DS
TITLE Hello World Program
(Hello2.asm)
; This program displays "Hello, world!"
.model small
.stack 100h
.386
.data
message BYTE "Hello, world!",0dh,0ah
.code
main PROC
.STARTUP
mov ah,40h
; write to file/device
mov bx,1
; output handle
mov cx,SIZEOF message
; number of bytes
mov dx,OFFSET message
; addr of buffer
int 21h
.exit
main ENDP
END main
Encrypt.asm: file encryption using XOR
(char,value) and file redirect
• Int 21h function 6 reads chars without
pausing or filtering control chars. This is
good (only) if we are redirecting input
• (using DOS redirect > and <)
• Text example arbitrarily uses 239 as the
value to XOR each char with.
• Note that a 2nd XOR with the same value
will toggle back to the original value
Encrypt.asm: file encryption using XOR
(char,value) and file redirect
• This is the same idea we encountered in
an earlier chapter, but it combines xor
encryption with file redirection. To run you
might type:
C:\MASM615\EXAMPLES\CH13>encrypt<secret.txt>message.txt
Encrypt.asm
TITLE Encryption Program
(Encrypt.asm)
;; read and encrypt a file. Run it from the
; command prompt, using redirection:
; Encrypt < infile.txt > outfile.txt
; Function 6 is also used for output, to avoid
; filtering ASCII control characters.
INCLUDE Irvine16.inc
XORVAL = 239
; any value between 0-255
.code
main PROC
mov ax,@data
mov ds,ax
L1: mov ah,6
; direct console input
mov dl,0FFh
; don't wait for character
int 21h
; AL = character
jz L2 ; quit if ZF = 1 (EOF)
xor al,XORVAL
mov ah,6
; write to output
mov dl,al
int 21h
jmp L1
; repeat the loop
L2: exit
main ENDP
END main
uses dos redirection (< and >)
C:\MASM615\EXAMPLES\CH13>encrypt<secret.txt>message.txt
C:\MASM615\EXAMPLES\CH13>
• secret.txt
secret message
contained here
• message.txt:
œŠŒ
Š›Ï‚ŠœœŽˆŠÏâ匀
›Ž†
Š‹Ï‡Š
Š
Made some changes to this program
TITLE Buffered Keyboard Input
(Keybd.asm)
; Test function 3Fh, read from file or device
; with the keyboard. Flush the buffer.
INCLUDE Irvine16.inc
.data
firstName BYTE 15 DUP(?)
terminal1 byte 0
lastName BYTE 30 DUP(?)
terminal2 byte 0
.code
main PROC
mov ax,@data
mov ds,ax
Keybd continued
; 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
; Input the last name:
mov ah,3Fh
mov bx,0
; keyboard
mov cx,LENGTHOF lastName
mov dx,OFFSET lastName
int 21h
quit:
call Crlf
mov dx,offset firstname
call writeString
call Crlf
mov dx,offset lastname
call writeString
call Crlf
Flush type-ahead buffer to eoln
;-----------------------------------------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
Run keybd
C:\MASM615>keybd
first has a max of 15 chars
last has a max of
30xxxxxxxxxxxxxxxxxxxxxxxx
first has a max
last has a max of 30xxxxxxxxxx
read from file or device
C:\MASM615\EXAMPLES\CH13>keybd
123456789
02345678901234567890
22344545566778899
C:\MASM615\EXAMPLES\CH13>
DateTime.asm
Include Irvine16.inc
Write PROTO char:BYTE
.data
str1 BYTE "Date: ",0
str2 BYTE ", Time: ",0
.code
main PROC
mov ax,@data
mov ds,ax
; Display the date:
mov dx,OFFSET str1
call WriteString
mov ah,2Ah
int 21h
movzx eax,dh
call WriteDec
INVOKE Write,'-'
movzx eax,dl
call WriteDec
INVOKE Write,'-'
movzx eax,cx
call WriteDec
; Display the time:
mov dx,OFFSET str2
call WriteString
mov ah,2Ch
int 21h
movzx eax,ch
call WritePaddedDec
INVOKE Write,':'
movzx eax,cl
call WritePaddedDec
INVOKE Write,':'
movzx eax,dh
call WritePaddedDec
call Crlf
exit
main ENDP
; get system date
; month
; day
; year
; get system time
; hours
; minutes
; seconds
DateTime.asm
;--------------------------------------------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
END main
DateTime.asm
C:\MASM615\EXAMPLES\CH13>datetime
Date: 11-28-2005, Time: 17:55:19
C:\MASM615\EXAMPLES\CH13>
What is a binary file?
• If you write chars (or – in java- strings) to a
file, it contains numerical values 16 (or 32)
bits per char depending if it is ASCII or
Unicode.
• If you write numbers to a file – say dword
values- it contains 4 bytes per value.
• This latter could be said to be a binary file.
binfile.asm
TITLE Binary File Program
(Binfile.asm)
; Create a binary file containing an array
; of doublewords.
; Last update: 11/12/01
INCLUDE Irvine16.inc
.data
myArray DWORD 50 DUP(?)
fileName BYTE "binary array file.bin",0
fileName2 BYTE "file2.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
.code
main PROC
mov ax,@data
mov ds,ax
.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.asm
;-----------------------------------------------------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.asm
;-----------------------------------------------------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.asm
;-----------------------------------------------------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 fileName2
; 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
mov bx,fileHandle
mov cx,SIZEOF myArray
mov dx,OFFSET myArray
int 21h
jc quit
; quit if error
; Close the file.
mov ah,3Eh
mov bx,fileHandle
int 21h
quit:
ret
CreateTheFile ENDP
END main
; write file or device
; output file handle
; number of bytes
; buffer pointer
; function: close file
; output file handle
; call MS-DOS
binfile.asm
C:\MASM615\EXAMPLES\CH13>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,
C:\MASM615\EXAMPLES\CH13>
fileio.asm
TITLE Extended Open/Create
(Fileio.asm)
; Demonstration of 16-bit FileIO under Windows 95/98/ME.
; The complete program does not appear in the text, but
; excerpts do appear.
; Last update: 11/12/01
INCLUDE Irvine16.inc
.data
Date WORD ?
handle WORD ?
actionTaken WORD ?
FileName BYTE "long_filename.txt",0
NewFile BYTE "newfile.txt",0
.code
fileio.asm
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
mov ax,cx
call writeint
call crlf
;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
mov ax,cx
call writeint
call crlf
fileio.asm
;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
mov ax,cx
call writeint
call crlf
failed:
exit
main ENDP
END main
fileio.asm
•
•
•
•
C:\MASM615\EXAMPLES\CH13>fileio
+2
+1
+3
readfile
TITLE Read a text file
(Readfile.asm)
; Read, display, and copy a text file.
; Last update: 9/11/01
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 ?
.code
main PROC
mov ax,@data
mov ds,ax
readfile
; 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
mov bx,inHandle
mov cx,BufSize
mov dx,OFFSET buffer
int 21h
jc quit
; quit if error
mov bytesRead,ax
; read file or device
; file handle
; max bytes to read
; buffer pointer
; 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
mov bx,inHandle
int 21h
jc quit
; quit if error
; function: close file
; input file handle
; call MS-DOS
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
mov bx,outHandle
int 21h
quit:
call Crlf
exit
main ENDP
END main
; function: close file
; output file handle
; call MS-DOS
Run of readfile
C:\MASM615>readfile
here is a sample
data
file
with several
lines in it 345 6778
1222
1222
4445
Findfirst…findnext: dir
Findfirst…findnext: dir
.data
filename byte '*.asm',0
DTA label byte
search byte 21 dup(?)
other byte 9 dup(?)
fname byte 'namehereXXXX',0
.code
main PROC
mov ax,@data
mov ds,ax
; must point ds to main
mov es,ax
mov dx, offset DTA
mov ah, 1Ah
int 21h ;;;set DTA to my buffer area
mov cx, 1 ;;; file attribute read-only
mov dx,offset filename
mov ah, 4Eh
int 21h
xor cx,cx
top: mov dx,offset fname
inc cx
test cx,3h
jnz writeit
call crlf
writeit: call writestring
blanks 5
mov ah,4fh
int 21h
jnc top
quit:
exit
Tabbing for the dir command: two macros
blanks macro count
local top
push cx
push ax
push dx
mov cx, count
mov dl,' '
mov ah, 2
top: int 21h
loop top
pop dx
pop ax
pop cx
endm
mygotoxy macro row, col
push dx
push bx
push ax
mov dh,row
mov dl,col
mov bh,0
mov ah,2
int 10h
pop ax
pop bx
pop dx
endm
Tabbing for the dir command
Tabbing data area: I made up
some strings
INCLUDE Irvine16.inc
.data
row byte 0
col byte 0
s1 byte 'some string',0
s2 byte 'and another',0
s3 byte 'shorty',0
s4 byte 'xyz',0
s5 byte 'bleh blah',0
addresses label word
word s1
entry=($-addresses)
word s2
word s3
word s4
word s5
numentries=($-addresses)/entry
tabbing
call clrscr
mov row,0
mov col,0
mov bx, 0
nextword: mygotoxy row,col ;start in upper lh corner
mov dx,addresses[bx]
mov di,dx
call writestring
add col, 20
add bx,2
cmp bx,numentries*2
jb checkrow
xor bx,bx
checkrow: cmp col,65
jb nextword
mov col,0
inc row
cmp row,24
jb nextword
quit:
exit
main ENDP
Download