У меня есть задача для моего курса сборки, чтобы остановить системное время при нажатии Alt-кнопки. Я делаю это, отключая 8-е прерывание. Как я понимаю, системное время сохраняется в ячейке памяти 40: 6 каналов, поэтому, читая эти данные, мы можем получить текущее системное время, но также мы можем достичь текущего системного времени, используя вторую функцию прерывания 1ah. Они равны?
Я проверяю свою программу в DosBox. Когда я проверяю системное время в 40: 6ch, оно не изменяется при нажатии кнопки Alt, если я проверяю системное время через прерывание 1ah - время продолжает меняться, хотя 8-е прерывание было отключено (оно увеличивается на 40: 6ch 18 раз в секунду, я понимаю). Так во сколько я должен действительно проверить? Или есть другой способ остановить системное время?
Вот программа для проверки времени через 40: 6ch:
OutStr macro str ;макрос вывода строки
push dx
push ax
mov ah,09h
lea dx,str
int 21h
pop ax
pop dx
endm
;----------------------------------------
OutChar macro char ;макрос вывода символа
push ax
push dx
mov ah,06h
mov dl,char
add dl,'0'
int 21h
pop dx
pop ax
endm
;---------------------------------------
;---------------------------------------
.386
ASSUME CS:CODE, DS:DATA
DATA SEGMENT USE16
M1 DB 13,10,':$'
M2 DB 13,10,'Current time',13,10,'$'
M3 DB 13,10,'Equal times',10,13,'$'
M4 DB 13,10,'Alt is not pushed',10,13,'$'
M5 DB 13,10,'Alt is pushed',10,13,'$'
DATA ENDS
CODE SEGMENT USE16
begin:
mov ax,DATA ;initialization
mov ds,ax
beg:
in al, 60h
cmp al,38h ; is Alt pressed?
jne beg ;No
OutStr M5 ; Alt is pressed
cur:
mov ax, 40h
mov es, ax
mov ebx, dword ptr es:[6ch] ; current time
mov al,00000001b ;disable interrupts of the system timer
out 21h, al
thisl:
mov ecx, dword ptr es:[6ch]
cmp ebx, dword ptr es:[6ch]
je outputTrue
jmp next
outputTrue:
OutStr M3
next:
in al,60h
cmp al,38h ; is Alt pressed?
je thisl ; Yes
tt:
OutStr M4 ; Alt is not pressed
mov al,0h ; enable interrupts of the system timer
out 21h, al
jmp beg
CODE ENDS
end Begin