mov ax, dseg
mov ds, ax
; Get handler int8 adress
mov ax,3508h
int 21h
mov ipsave_8, bx
mov ax, es
mov cssave_8, ax
; Set our handler int60h
mov ax,3560h
int 21h
mov ipsave_60, bx
mov ax, es
mov cssave_60, ax
push ds
mov dx, offset int_8
mov ax, seg int_8
mov ds, ax
; Set our handler int8
mov ah, 25h
mov al, 8h
int 21h
pop ds
push ds
mov dx, offset int_60
mov ax, seg int_60
mov ds, ax
; Set our int60h handler
mov ah, 25h
mov al, 60h
int 21h
pop ds
mov ax,0h
; Work with klav
int 16h
push ds
mov dx, ipsave_8
mov ax, cssave_8
mov ds, ax
; Restore int8 handler
mov ah, 25h
mov al, 8h
int 21h
pop ds
push ds
mov dx, ipsave_60
mov ax, cssave_60
mov ds, ax
mov ah, 25h
mov al, 60h
int 21h
pop ds
; Exit
mov ah,4Ch
int 21h
main ENDP
int_8 proc FAR
push ax
mov ax, dseg
mov es,ax
mov ax,word ptr es:cnt
inc ax
cmp ax,18 ; 1s=18 timer interrupts
jne m0
int 60h
mov ax,0
m0:
mov word ptr es:cnt,ax
pop ax
; Native handler
jmp dword ptr es:adr_int8
iret
int_8 ENDP
int_60 proc FAR
push ax
push bx
push es
push ds
push di
mov ax, dseg
mov ds,ax
; Color display
mov ax,0B800h
mov es,ax
lea bx, msg
; Where to output
mov di,7D0h
m1:
mov al,[bx]
cmp al,'$'
je m_ex
mov es:[di],al
inc di
inc bx
mov es:[di],word ptr 0F0h
inc di
jmp m1
m_ex:
pop di
pop ds
pop es
pop bx
pop ax
; Inset int flag (ISR)
mov al,20h
out 20h,al
iret
int_60 ENDP
cseg ENDS
END start
Результатом выполнения программы является выведенный на экран через 1 секунду после запуска программы символ *.
Программа 5. Замените процедуру вывода в int 60h на подсчет относительного времени с момента начала работы программы.
itimer5.asm
sseg SEGMENT STACK
db 64 dup (?)
sseg ENDS
dseg SEGMENT PARA PUBLIC 'DATA'
cnt dw 0h
sec dw 0h
adr_int8:
ipsave_8 dw 0h
cssave_8 dw 0h
adr_int60:
ipsave_60 dw 0h
cssave_60 dw 0h
msg db ' Seconds$'
dseg ENDS
cseg SEGMENT
main proc FAR
ASSUME cs:cseg, ds:dseg, ss:sseg
start:
; Inti Data segment
mov ax, dseg
mov ds, ax
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.