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
вывод времени в PM
Вывожу спомощью чтения из cmos.
Но как только организую бесконечный цикл, то vmware вылетает
такой вот код
Код:
Сам код работает, время выводится правильно. Но как только делаю зацикливание, то все перестает работать. Может кто знает в чем ошибка?
одно из двух ошибка в int 1h или ошибка в обработчике прерывания таймера
понятно, будим шаманить дальше
Ну и твой int 1 мне тоже не нравится. Если уж никак не хочешь обойтись без использования отладочных прерываний, то лучше все-таки использовать int 3.
Phantom-84, у меня это не отладочное прерывание, а прерывание для вывода числа на экран(знаю что это глупо, но я пока просто собираю код по кусочкам). А вот за совет большое Вам спасибо. Кстати я нашел у себя ошибку и теперь мой "бесконечный цикл работает". Но я только так и не понял как это прерывание от таймера перенаправить на другой адресс? (с клавиатурой у меня все получилось)
Evgeni, я понял, для чего ты используешь int 1, но Intel не рекомендует это делать, поэтому повторяю, что в крайнем случае нужно использовать int 3, а вообще лучше всего для этих целей подойдут программные прерывания из диапазона 0x20-0xFF. Что касается перенаправления прерываний, то раз у тебя получилось с клавиатурой, то должно получиться и с таймером :)
ок, в следующих своих версиях исправлю этот нелостаток)))). Когда я перенапрвлял прерывания с клавиатуры, то я просто создал прерывание, в котором из портов считывал скан-коды клавиш, а вот номера портов таймера я не знаю. Если есть инфа по этому, скиньте плиз. Или я что-то не так понял?
Evgeni, перенаправлением прерываний называется изменение "векторов" обслуживающих их обработчиков. Например, традиционно BIOS устанавливает обработку прерывания от клавиатуры (IRQ1) на вектор 9. У меня же в системе клавиатурный обработчик связан с вектором 0x21. Т.е. я осуществил перенаправление прерываний. Традиционный таймер (PIT) опять-таки программируется однократно во время инициализации системы, причем делается это элементарно. Абсолютно уверен, что можно с легкостью найти в сети соответствующую инфу.
По ходу дела я ступил. Большое вам спасибо, буду тогда разбираться.
Да, нет. Ты не ступил. Просто немного непонятно (для меня?) иногда излагаешь. То, о чем ты сказал позже, обычно называют обработкой прерываний. Правильно, в подпрограмме обработки (обработчике) прерывания от клавиатуры нужно прежде всего прочесть данные из порта 0x60 (там не только скан-коды, но еще и префиксы, и подтверждения от клавиатуры о приеме данных). В таймерном обработчике с портами таймера работать не нужно. Ты просто заранее должен запрограммировать, с какой периодичностью должно возникать данное прерывание, а потом должен учитывать именно эту периодичность (частоту).
проще всего включить прерывание будильника с установками : 0хFF,0xFF,0xFF . тогда прерывание будет происхотить ровненько раз в секунду по обновлению часов .