Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .stack 100h
- ; макрос для вывода числа
- ; можно игнорировать
- print_number_word macro number
- local _print,_positive
- mov ax, number
- push bx
- push cx
- push dx
- xor bx, bx
- xor cx, cx
- xor dx, dx
- cmp ax, 0
- jns _positive
- neg ax
- mov bx, ax
- mov ah, 02h
- mov dl, '-'
- int 21h
- mov ax, bx
- _positive:
- mov dx, 0
- mov bx, 10
- div bx
- push dx
- inc cx
- cmp ax, 0
- jne _positive
- _print:
- pop dx
- add dx, '0'
- mov ax, 0200h
- int 21h
- loop _print
- pop dx
- pop cx
- pop bx
- endm print_number_word
- .data
- old_int_offset dw ?
- old_int_seg dw ?
- text db "Number of call ",'$'
- endl db 13,10,'$'
- count dw 0
- .code
- cool_interrup proc far
- ; можно и pusha
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- push bp
- pushf
- ; увеличиваем счётчик
- mov ax, count
- inc ax
- mov count, ax
- ; выывод строки
- mov ah, 09h
- mov dx, offset text
- int 21h
- print_number_word count
- mov ah, 09h
- mov dx, offset endl
- int 21h
- ; можно и popa
- popf
- pop bp
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- iret
- cool_interrup endp
- start:
- mov ax, @data
- mov ds, ax
- ; получим адреса прерываний, которые были ещё до нас
- mov ah, 35h ; получить вектор прерывания
- mov al, 1Ch ; прерывание таймера
- int 21h
- ; в bx записался сдвиг старого прерывания
- ; в ex записался сегмерт старого прерывания
- ; их надо запомнить, чтобы потом вернуть всё на место
- mov old_int_offset, bx
- mov old_int_seg , es
- ; теперь можем написать что-то своё заместо прошлого прерывания
- ; пусть эта функция будет нашим прерыванием
- push ds ; будем трогать ds так что надо положить его в стек, чтобы не потерять
- mov dx, offset cool_interrup
- mov ax, seg cool_interrup
- mov ds, ax ; можно поменять только через ax
- mov ah, 25h ; поменятьменять вектор прерывания
- mov al, 1Ch ; наше прерывание таймера
- int 21h
- pop ds
- _loop:
- nop
- mov ax, count
- cmp ax, 100
- je _end
- jmp _loop
- _end:
- ; надо вернуть всё как было
- mov dx, old_int_offset
- mov ax, old_int_seg
- mov ds, ax ; можно поменять только через ax
- mov ah, 25h ; поменятьменять вектор прерывания
- mov al, 1Ch ; наше прерывание таймера
- int 21h
- mov ax, 4c00h
- int 21h
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement