Ассамблея.Остановить системное время - PullRequest
1 голос
/ 02 апреля 2011

У меня есть задача для моего курса сборки, чтобы остановить системное время при нажатии 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

1 Ответ

3 голосов
/ 02 апреля 2011

Вы испытываете разницу между RTC и PIT.

PIT обычно используется для целей синхронизации в ОС, например wait(10); для ожидания 10 секунд.RTC, с другой стороны, используется для хранения времени, например, зная, что время 12:53.

Прерыванием PIT является IRQ0 или прерывание 0x08.Прерывание RTC - IRQ8, или прерывание 0x70.Для получения дополнительной информации см. OSDev wiki и wikipedia

Кроме того, следует отметить, что вероятно , даже если вы отключите прерывание 0x70,прерывание 0x1A по-прежнему будет сообщать об увеличении таймера.Это потому, что ему не нужно отправлять прерывания процессору, чтобы сохранить время.Он хранит внутреннее время, которое вы можете прочитать с помощью команд портов ввода и вывода.

...