Я создаю программу, которая должна печатать «Привет от обработчика» через пять секунд после запуска. Сначала я создал прерывание 4ah с помощью процедуры под названием create_interrupt
. Это прерывание вызывает int_handler
, который печатает строку «Привет от обработчика». Затем proc "будильник" получает текущее время, добавляет к нему 5 секунд и устанавливает будильник с помощью func 06h из int 1ah.
Этот будильник должен вызвать int 4ah через 5 секунд после запуска, но он не работает, и я не знаю, почему. Если я вызываю 4ah "вручную", просто добавляя "int 4ah" работает, значит прерывание создано и работает корректно. Но мне нужно вызвать это прерывание по тревоге.
SSEG segment stack
db 256 dup(0)
SSEG ends
DSEG segment
mess db 'Hello',0dh,0ah,'$'
mess2 db 'Hello from handler!',0dh,0ah,'$'
mess3 db 'Ассемблер это жопа, я уже устал''$'
DSEG ends
CSEG segment
assume cs:CSEG,ds:DSEG,ss:SSEG
begin:
mov ax, DSEG
mov ds,ax
mov ah,09h
mov dx,offset mess
int 21h
;call far ptr int_handler
call far ptr create_interrupt
;int 4ah
call far ptr alarm
mov ah,01h
int 21h
mov ah,4ch
int 21h
create_interrupt proc far
push 0
pop es
;pushf
;cli
mov word ptr es:[4ah*4],offset int_handler
mov word ptr es:[4ah*4+2],seg int_handler
;sei
iret
create_interrupt endp
alarm proc far
;pushf
mov ah,02h ;get current time
int 1ah
mov ah,06h
;mov ch,ch ;hour
;mov cl,cl ;min
;mov dh,dh ;sec
;mov dl,dl ;mlsec
add dh,05h ;add 5 to seconds
int 1ah ;ah=06h, so this int sets alarm
;mov ah,01h
;int 21h
iret
alarm endp
int_handler proc far
mov ax,DSEG ;
mov ds,ax ;in ds addres of Data segment
mov ah,09h
mov dx,offset mess2
int 21h
iret
int_handler endp
CSEG ends
end begin