Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вывод времени в PM

1.8K
24 мая 2008 года
Evgeni
188 / / 14.06.2006
решил в защищеном режиме вывести время на экран.
Вывожу спомощью чтения из cmos.
Но как только организую бесконечный цикл, то vmware вылетает
такой вот код
Код:
kk:
    xor eax,eax

    mov al,04h
    out 70h,al
    in al,71h

    shl ax,4
    shr al,4
    mov dl,ah
    shl dl,1
    shl ah,3
    add ah,dl
    add al,ah
    xor edx,edx
    mov dl,al
    mov edi,46h
    mov al,01h
    int 1h

    xor eax,eax

    mov al,02h
    out 70h,al
    in al,71h

    xor edx,edx
    shl ax,4
    shr al,4
    mov dl,ah
    shl dl,1
    shl ah,3
    add ah,dl
    add al,ah
    mov dl,al
    mov edi,4Ch
    mov al,01h
    int 1h
    jmp kk

Сам код работает, время выводится правильно. Но как только делаю зацикливание, то все перестает работать. Может кто знает в чем ошибка?
551
24 мая 2008 года
Pavia
357 / / 22.04.2004
одно из двух ошибка в int 1h или ошибка в обработчике прерывания таймера
1.8K
24 мая 2008 года
Evgeni
188 / / 14.06.2006
понятно, будим шаманить дальше
349
26 мая 2008 года
Phantom-84
656 / / 27.10.2005
Evgeni, между отправкой индекса и чтением/записью данных лучше делать небольшую паузу. Память RTC нельзя читать в любой момент, т.к. это чревато ошибками в моменты, когда идет обновление со стороны RTC, к тому же ты своим регулярным циклом существенно повышаешь вероятность возникновения подобной ошибки (на практике подсчет времени лучше выполнять так: однократно читать показания RTC, а потом с помощью прерываний от таймера или того же RTC вести дальнейший отсчет времени, учитывая периодичность их возникновения).

Ну и твой int 1 мне тоже не нравится. Если уж никак не хочешь обойтись без использования отладочных прерываний, то лучше все-таки использовать int 3.
1.8K
26 мая 2008 года
Evgeni
188 / / 14.06.2006
Phantom-84, у меня это не отладочное прерывание, а прерывание для вывода числа на экран(знаю что это глупо, но я пока просто собираю код по кусочкам). А вот за совет большое Вам спасибо. Кстати я нашел у себя ошибку и теперь мой "бесконечный цикл работает". Но я только так и не понял как это прерывание от таймера перенаправить на другой адресс? (с клавиатурой у меня все получилось)
349
26 мая 2008 года
Phantom-84
656 / / 27.10.2005
Evgeni, я понял, для чего ты используешь int 1, но Intel не рекомендует это делать, поэтому повторяю, что в крайнем случае нужно использовать int 3, а вообще лучше всего для этих целей подойдут программные прерывания из диапазона 0x20-0xFF. Что касается перенаправления прерываний, то раз у тебя получилось с клавиатурой, то должно получиться и с таймером :)
1.8K
26 мая 2008 года
Evgeni
188 / / 14.06.2006
ок, в следующих своих версиях исправлю этот нелостаток)))). Когда я перенапрвлял прерывания с клавиатуры, то я просто создал прерывание, в котором из портов считывал скан-коды клавиш, а вот номера портов таймера я не знаю. Если есть инфа по этому, скиньте плиз. Или я что-то не так понял?
349
27 мая 2008 года
Phantom-84
656 / / 27.10.2005
Evgeni, перенаправлением прерываний называется изменение "векторов" обслуживающих их обработчиков. Например, традиционно BIOS устанавливает обработку прерывания от клавиатуры (IRQ1) на вектор 9. У меня же в системе клавиатурный обработчик связан с вектором 0x21. Т.е. я осуществил перенаправление прерываний. Традиционный таймер (PIT) опять-таки программируется однократно во время инициализации системы, причем делается это элементарно. Абсолютно уверен, что можно с легкостью найти в сети соответствующую инфу.
1.8K
27 мая 2008 года
Evgeni
188 / / 14.06.2006
По ходу дела я ступил. Большое вам спасибо, буду тогда разбираться.
349
27 мая 2008 года
Phantom-84
656 / / 27.10.2005
Да, нет. Ты не ступил. Просто немного непонятно (для меня?) иногда излагаешь. То, о чем ты сказал позже, обычно называют обработкой прерываний. Правильно, в подпрограмме обработки (обработчике) прерывания от клавиатуры нужно прежде всего прочесть данные из порта 0x60 (там не только скан-коды, но еще и префиксы, и подтверждения от клавиатуры о приеме данных). В таймерном обработчике с портами таймера работать не нужно. Ты просто заранее должен запрограммировать, с какой периодичностью должно возникать данное прерывание, а потом должен учитывать именно эту периодичность (частоту).
252
27 мая 2008 года
koderAlex
1.4K / / 07.09.2005
проще всего включить прерывание будильника с установками : 0хFF,0xFF,0xFF . тогда прерывание будет происхотить ровненько раз в секунду по обновлению часов .
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог